我寫一個C++ QT5 Widget桌面應用程序中的QT主窗口方法,我需要運行時間被壓在一個單獨的線程時,起動/停止按鈕耗時的操作MainWindow::performLengthyOperation(bool)
。運行在單獨的線程
這耗時的操作是在我的MainWindow.h/CPP一個相當長的方法。停止後臺IO活動的操作大約需要6秒,啓動大約需要2秒。在按下開始/停止按鈕的過程中,UI不響應。本質上,在附加到我的按鈕單擊事件的插槽中,我需要執行以下邏輯。
void
MainWindow::on_pushButtonStart_clicked(bool checked)
{
// temporarily disable the pushbutton
// until the lengthy operation completes
mUI->pushButtonStart->setEnabled(false);
if (checked) {
// Start the timer tick callback
mTickTimer.start(APP_TICK, this);
mUI->pushButtonStart->setText("starting...");
// This method needs to somehow run in its own QT thread
// and when finished, call a slot in this MainWindow to
// re-enable the pushButtonStart and change the statusBar
// to indicate "runing..."
performLengthyOperation(true);
//mUI->pushButtonStart->setText("Stop")
//mUI->statusBar->setStyleSheet("color: blue");
//mUI->statusBar->showMessage("runing...");
} else { // Stop the protocol threads
// Stop the subsystem protocol tick timer
mTickTimer.stop();
mUI->pushButtonStart->setText("stopping...");
// This method needs to somehow run in its own QT thread
// and when finished, call a slot in this MainWindow to
// re-enable the pushButtonStart and change the statusBar
// to indicate "ready..."
performLengthyOperation(false);
// finally toggle the UI controls
//mUI->pushButtonStart->setText("Start")
//mUI->statusBar->setStyleSheet("color: blue");
//mUI->statusBar->showMessage("ready...");
}
}
當我正在尋找的例子就如何做到這一點,我在整個following article來了,但我有麻煩它適應我的方案,我需要以某種方式獲得主窗口到工人,因此它可以訪問它的UI小部件等,這似乎有點矯枉過正。
我非常想找一個簡單的方法來異步運行lambda函數,我可以把這些耗時的操作(在主窗口作爲參數傳遞)。這比使用QThreads和將對象移動到線程等更爲可取。但我對QT框架知之甚少,無法確定這是否安全或可行。
即使您傳入窗口,也無法從其他線程處理它。你需要將這些操作歸爲主線程(儘管我認爲Qt可以通過信號/插槽來完成)。 – Steve