From 07def117e9dc79d2ddd5a5244c4a2350c603e767 Mon Sep 17 00:00:00 2001 From: Vladislav Nepogodin Date: Wed, 8 Nov 2023 16:19:17 +0400 Subject: [PATCH] =?UTF-8?q?=F0=9F=9A=A7=20fix=20by=20moving=20UI=20work=20?= =?UTF-8?q?to=20main=20thread?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/km-window.cpp | 35 ++++++++++++++++++----------------- src/km-window.hpp | 2 ++ 2 files changed, 20 insertions(+), 17 deletions(-) diff --git a/src/km-window.cpp b/src/km-window.cpp index a88a7c6..7689e52 100644 --- a/src/km-window.cpp +++ b/src/km-window.cpp @@ -162,23 +162,8 @@ MainWindow::MainWindow(QWidget* parent) m_kernels.clear(); m_kernels = Kernel::get_kernels(m_handle); - m_conf_progress_dialog->setLabelText(tr("Please wait...\nInitializing kernels..")); - m_conf_progress_dialog->show(); - - auto* tree_kernels = m_ui->treeKernels; - tree_kernels->blockSignals(true); - tree_kernels->clear(); - - // NOTE: I don't think this should be parallelized, because it's already not running on the main thread - init_kernels_tree_widget(tree_kernels, std::span{m_kernels}); - - tree_kernels->blockSignals(false); - m_conf_progress_dialog->hide(); - - m_ui->ok->setEnabled(false); - m_thread_running.store(false, std::memory_order_relaxed); - - QMessageBox::critical(this, "CachyOS Kernel Manager", tr("Please restart Kernel Manager if you want to run 'Execute' again")); + // schedule init_kernels to be executed in the main thread + QMetaObject::invokeMethod(this, "init_kernels", Qt::QueuedConnection); } m_running.store(false, std::memory_order_relaxed); @@ -360,6 +345,22 @@ void Work::doHeavyCalculations() { m_func(); } +void MainWindow::init_kernels() noexcept { + // show progress dialog to indicate user something is happening + m_conf_progress_dialog->setLabelText(tr("Please wait...\nInitializing kernels..")); + m_conf_progress_dialog->show(); + + auto* tree_kernels = m_ui->treeKernels; + tree_kernels->blockSignals(true); + tree_kernels->clear(); + + // NOTE: I don't think this should be parallelized, because it's already not running on the main thread + init_kernels_tree_widget(tree_kernels, std::span{m_kernels}); + + tree_kernels->blockSignals(false); + m_conf_progress_dialog->hide(); +} + void MainWindow::on_execute() noexcept { if (m_running.load(std::memory_order_consume)) return; diff --git a/src/km-window.hpp b/src/km-window.hpp index 00155c9..18b1144 100644 --- a/src/km-window.hpp +++ b/src/km-window.hpp @@ -107,6 +107,8 @@ class MainWindow final : public QMainWindow { void item_changed(QTreeWidgetItem* item, int column) noexcept; + void init_kernels() noexcept; + protected: void closeEvent(QCloseEvent* event) override;