From 8b117bcd86a222c8a1ada6b3a182f4c488ff8d38 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Thu, 30 Jan 2020 12:45:10 +0100 Subject: [PATCH] MessageManager: Allow messages from non-UI threads This relieves the caller of the burden of dispatching the call to the UI thread. Change-Id: Ic6455fb7f393d0e21c7e527c693ebf2441f0c028 Reviewed-by: Eike Ziller Reviewed-by: hjk --- src/plugins/coreplugin/messagemanager.cpp | 15 +++++++++++++++ src/plugins/coreplugin/messagemanager.h | 11 +++++++---- src/plugins/projectexplorer/gcctoolchain.cpp | 8 +++----- 3 files changed, 25 insertions(+), 9 deletions(-) diff --git a/src/plugins/coreplugin/messagemanager.cpp b/src/plugins/coreplugin/messagemanager.cpp index 5644db547f4..75b2e81531c 100644 --- a/src/plugins/coreplugin/messagemanager.cpp +++ b/src/plugins/coreplugin/messagemanager.cpp @@ -31,6 +31,8 @@ #include #include +#include +#include using namespace Core; @@ -91,7 +93,20 @@ void MessageManager::setWheelZoomEnabled(bool enabled) m_messageOutputWindow->setWheelZoomEnabled(enabled); } +void MessageManager::writeMessages(const QStringList &messages, PrintToOutputPaneFlags flags) +{ + write(messages.join('\n'), flags); +} + void MessageManager::write(const QString &text, PrintToOutputPaneFlags flags) +{ + if (QThread::currentThread() == instance()->thread()) + doWrite(text, flags); + else + QTimer::singleShot(0, instance(), [text, flags] { doWrite(text, flags); }); +} + +void MessageManager::doWrite(const QString &text, PrintToOutputPaneFlags flags) { QTC_ASSERT(m_messageOutputWindow, return); diff --git a/src/plugins/coreplugin/messagemanager.h b/src/plugins/coreplugin/messagemanager.h index 6ead1ddeb82..386001bc43c 100644 --- a/src/plugins/coreplugin/messagemanager.h +++ b/src/plugins/coreplugin/messagemanager.h @@ -57,18 +57,21 @@ public: Q_DECLARE_FLAGS(PrintToOutputPaneFlags, PrintToOutputPaneFlag) - static void showOutputPane(Core::MessageManager::PrintToOutputPaneFlags flags = NoModeSwitch); + static void showOutputPane(PrintToOutputPaneFlags flags = NoModeSwitch); static void setFont(const QFont &font); static void setWheelZoomEnabled(bool enabled); -public slots: - static void write(const QString &text, - Core::MessageManager::PrintToOutputPaneFlags flags = NoModeSwitch); + static void writeMessages(const QStringList &messages, + PrintToOutputPaneFlags flags = NoModeSwitch); + static void write(const QString &text, PrintToOutputPaneFlags flags = NoModeSwitch); private: MessageManager(); ~MessageManager() override; + + static void doWrite(const QString &text, PrintToOutputPaneFlags flags); + static void init(); friend class Core::Internal::MainWindow; }; diff --git a/src/plugins/projectexplorer/gcctoolchain.cpp b/src/plugins/projectexplorer/gcctoolchain.cpp index da9d03ae74a..1dc211c7c55 100644 --- a/src/plugins/projectexplorer/gcctoolchain.cpp +++ b/src/plugins/projectexplorer/gcctoolchain.cpp @@ -94,11 +94,9 @@ static QByteArray runGcc(const FilePath &gcc, const QStringList &arguments, cons SynchronousProcessResponse response = cpp.runBlocking(cmdLine); if (response.result != SynchronousProcessResponse::Finished || response.exitCode != 0) { - QTimer::singleShot(0, Core::MessageManager::instance(), [cmdLine, response] { - Core::MessageManager::write("Compiler feature detection failure!"); - Core::MessageManager::write(response.exitMessage(cmdLine.toUserOutput(), 10)); - Core::MessageManager::write(QString::fromUtf8(response.allRawOutput())); - }); + Core::MessageManager::writeMessages({"Compiler feature detection failure!", + response.exitMessage(cmdLine.toUserOutput(), 10), + QString::fromUtf8(response.allRawOutput())}); return QByteArray(); }