From 0abb1c6ea6e8f46117a6c428ad8e5ed2864f7c4c Mon Sep 17 00:00:00 2001 From: spycrab Date: Fri, 8 Feb 2019 13:21:21 +0100 Subject: [PATCH] Qt/LogWidget: Make logging asynchronous --- Source/Core/DolphinQt/Config/LogWidget.cpp | 62 ++++++++++++---------- 1 file changed, 34 insertions(+), 28 deletions(-) diff --git a/Source/Core/DolphinQt/Config/LogWidget.cpp b/Source/Core/DolphinQt/Config/LogWidget.cpp index d8f500fa05..2b5f4dfdc4 100644 --- a/Source/Core/DolphinQt/Config/LogWidget.cpp +++ b/Source/Core/DolphinQt/Config/LogWidget.cpp @@ -20,6 +20,7 @@ #include "Core/ConfigManager.h" +#include "DolphinQt/QtUtils/QueueOnObject.h" #include "DolphinQt/Settings.h" // Delay in ms between calls of UpdateLog() @@ -188,35 +189,40 @@ void LogWidget::SaveSettings() void LogWidget::Log(LogTypes::LOG_LEVELS level, const char* text) { - std::lock_guard lock(m_log_mutex); - - const char* color = "white"; - - switch (level) - { - case LogTypes::LOG_LEVELS::LERROR: - color = "red"; - break; - case LogTypes::LOG_LEVELS::LWARNING: - color = "yellow"; - break; - case LogTypes::LOG_LEVELS::LNOTICE: - color = "lime"; - break; - case LogTypes::LOG_LEVELS::LINFO: - color = "cyan"; - break; - case LogTypes::LOG_LEVELS::LDEBUG: - color = "lightgrey"; - break; - } - + // The text has to be copied here as it will be deallocated after this method has returned std::string str(text); - StringPopBackIf(&str, '\n'); - m_log_queue.push(QStringLiteral("%1 %3") - .arg(QString::fromStdString(str.substr(0, TIMESTAMP_LENGTH)), - QString::fromStdString(color), - QString::fromStdString(str.substr(TIMESTAMP_LENGTH)).toHtmlEscaped())); + + QueueOnObject(this, [this, level, str]() mutable { + std::lock_guard lock(m_log_mutex); + + const char* color = "white"; + + switch (level) + { + case LogTypes::LOG_LEVELS::LERROR: + color = "red"; + break; + case LogTypes::LOG_LEVELS::LWARNING: + color = "yellow"; + break; + case LogTypes::LOG_LEVELS::LNOTICE: + color = "lime"; + break; + case LogTypes::LOG_LEVELS::LINFO: + color = "cyan"; + break; + case LogTypes::LOG_LEVELS::LDEBUG: + color = "lightgrey"; + break; + } + + StringPopBackIf(&str, '\n'); + m_log_queue.push( + QStringLiteral("%1 %3") + .arg(QString::fromStdString(str.substr(0, TIMESTAMP_LENGTH)), + QString::fromStdString(color), + QString::fromStdString(str.substr(TIMESTAMP_LENGTH)).toHtmlEscaped())); + }); } void LogWidget::closeEvent(QCloseEvent*)