我在后台使用 QThread 执行一些大型任务,这里是示例 我正在使用的代码
class Worker : public QObject
{
Q_OBJECT
QThread workerThread;
public slots:
void doWork(const QString ¶meter) {
while(1){
// some huge code here
......................
if(condition) break;
}
emit resultReady(result);
}
signals:
void resultReady(const QString &result);
};
class Controller : public QObject
{
Q_OBJECT
QThread workerThread;
public:
Controller() {
Worker *worker = new Worker;
worker->moveToThread(&workerThread);
connect(&workerThread, SIGNAL(finished()), worker, SLOT(deleteLater()));
connect(this, SIGNAL(operate(QString)), worker, SLOT(doWork(QString)));
connect(worker, SIGNAL(resultReady(QString)), this, SLOT(handleResults(QString)));
workerThread.start();
}
~Controller() {
workerThread.quit();
workerThread.wait();
}
public slots:
void handleResults(const QString &);
signals:
void operate(const QString &);
};
是否建议在上述程序中退出后使用wait()
?
我的程序有时会卡在 QThread::wait()
上,它正在从服务器下载巨大的文件,大约需要 5-6 分钟才能再次检查 while 条件,我只想退出线程但 main线程卡在 wait(),有什么办法吗??强制退出或终止线程而不崩溃或挂起主应用程序?我也试过 QThread::terminated
但它从来没有用过。
任何帮助表示赞赏。
谢谢。
最佳答案
首先,从上面的代码中不清楚你在线程中做了什么。您的第一个关注点是在您的线程内运行的方法,即您的线程对象。首先,为什么有时你的线程没有完成它的任务?为什么卡住了?在这里,我可以看到一个条件始终为真的 while
循环。可能你在循环内有一些 break 语句,有时永远不会满足,因为当 while 循环继续时,线程永远不会完成。只要仔细检查那里出了什么问题。如果 while 循环造成问题,我可以建议您对代码进行以下修改。但是你必须非常小心,因为它不应该在完成一些非常重要的任务之前退出。
首先像下面这样修改你的 while 循环:- 在while循环之前引入一个bool变量
bool continued = true;
while(continued)
{
//your codes
}
现在在你的线程对象Worker中添加一个方法
void stopWorker()
{
continued = false;
}
现在当你想让你的线程强制退出时调用这个方法
worker->stopWorker();
关于c++ - 如何退出 QThread::wait(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48322139/