平台:Win7 x64、MinGW-rubenvb (4.7.2-x64)、Qt 4.8
假设我有几个使用 QConcurrent::run 生成的冗长任务(读取填充文件、写入填充文件和运行模拟),如下所示:
void MainWindow::runLengthyJob() {
/* some setup */
jobWatcher->setFuture(QConcurrent::run(theApp, &AppClass::lengthyJob));
// lengthyJob - can be readPop(), writePop(), runSim()
}
通常这些任务至少需要 15 秒才能完成(对于模拟,需要几个小时以上)。为了防止尚未完成的线程崩溃,我重新实现 MainWindow::closeEvent 如下:
void MainWindow::closeEvent(QCloseEvent *event) {
/* wait for any dangling thread */
if (QThreadPool::globalInstance()->activeThreadCount())
QThreadPool::globalInstance()->waitForDone();
event->accept();
} // end: MainWindow::closeEvent
这可以正常工作,但是当我单击 MainWindow 的“x”按钮时,它似乎冻结并显示“无响应”(我猜文本是由操作系统给出的),尽管它最终终止了应用程序。
我想在触发 MainWindow 的 close() 插槽后立即退出应用程序。那么,如何缩短未完成线程的等待时间呢?或者我如何通知用户仍有一个冗长的作业正在运行(可能需要数小时才能完全关闭)?(我试图在 closeEvent 中包含 QDialog/QMessagebox,但新创建的小部件也冻结了)
注意:对于 AppClass:longyJobs [readPop() /writePop()],这些是独立的函数,我不能分解成更小的步骤。对于 AppClass::runSim(),更小的步骤可能是可能的。