From c7b87f89e02fb3b343e7fe023183a30786b49c77 Mon Sep 17 00:00:00 2001 From: Christian Mollekopf Date: Thu, 17 Aug 2017 19:50:42 -0600 Subject: Run the messageparsing in a thread ...with signatures a single message quickly takes 50 - 150ms, which is too long to be blocking. --- framework/src/CMakeLists.txt | 2 +- framework/src/domain/mime/messageparser.cpp | 20 ++++++++++++++++---- 2 files changed, 17 insertions(+), 5 deletions(-) (limited to 'framework') diff --git a/framework/src/CMakeLists.txt b/framework/src/CMakeLists.txt index 8436705c..9c845022 100644 --- a/framework/src/CMakeLists.txt +++ b/framework/src/CMakeLists.txt @@ -1,5 +1,5 @@ -find_package(Qt5 COMPONENTS REQUIRED Core Quick Qml WebEngineWidgets Test) +find_package(Qt5 COMPONENTS REQUIRED Core Concurrent Quick Qml WebEngineWidgets Test) find_package(KF5Mime "4.87.0" CONFIG REQUIRED) find_package(Sink CONFIG REQUIRED) find_package(KAsync CONFIG REQUIRED) diff --git a/framework/src/domain/mime/messageparser.cpp b/framework/src/domain/mime/messageparser.cpp index 1c31cbae..6dc880f3 100644 --- a/framework/src/domain/mime/messageparser.cpp +++ b/framework/src/domain/mime/messageparser.cpp @@ -24,6 +24,9 @@ #include #include +#include +#include +#include class MessagePartPrivate { @@ -50,11 +53,20 @@ QVariant MessageParser::message() const void MessageParser::setMessage(const QVariant &message) { - d->mParser = std::make_shared(); - d->mParser->parseObjectTree(message.toByteArray()); - d->mParser->decryptParts(); mRawContent = message.toString(); - emit htmlChanged(); + auto future = QtConcurrent::run([message] { + auto parser = std::make_shared(); + parser->parseObjectTree(message.toByteArray()); + parser->decryptParts(); + return parser; + }); + auto watcher = new QFutureWatcher>; + QObject::connect(watcher, &QFutureWatcher>::finished, watcher, [this, watcher]() { + d->mParser = watcher->future().result(); + delete watcher; + emit htmlChanged(); + }); + watcher->setFuture(future); } QString MessageParser::rawContent() const -- cgit v1.2.3