我正在后台使用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条件,我只想退出线程但主线程却卡在wait()上,有什么办法吗??要在不崩溃或挂起主应用程序的情况下强制退出或终止线程?我也尝试过QThread::terminated,但它从来都不起作用。感谢您的帮助。谢谢。
发布于 2018-01-18 22:45:06
首先,从上面的代码中看不出你在线程上做了什么。你的第一个关注点是你的方法,它在你的线程中运行,即你的线程对象。首先,为什么有时候你的线程不能完成它的任务?为什么它会被保留下来?在这里,我可以看到一个条件总是为真的while循环。可能在循环中有一些break语句,这些语句有时永远不会满足,并且由于该线程永远不会完成,因为while循环仍在继续。只需仔细检查哪里出了问题。如果while循环造成了这个问题,我可以建议您在代码中进行以下修改。但你必须非常小心,因为它不应该在完成一些非常重要的任务之前退出。
首先修改while循环,如下所示:-在while循环之前引入一个bool变量
bool continued = true;
while(continued)
{
//your codes
}现在,在线程对象工作线程中添加一个方法
void stopWorker()
{
continued = false;
}现在,当您希望线程强制退出时,只需调用此方法
worker->stopWorker();发布于 2018-01-20 19:25:57
自从Qt5.2以来,只有一个QThread::requestInterruption() this函数可以用来通知你的线程它应该停止工作,但是你必须为QThread::isInterruptionRequested()签入你的长操作,并退出你的循环或事件循环:http://doc.qt.io/qt-5/qthread.html#isInterruptionRequested
发布于 2018-01-18 21:19:39
QThread类的官方文档说:
等待布尔QThread::
(unsigned long time = ULONG_MAX)
阻止线程,直到满足以下任一条件:
与此QThread对象关联的线程已完成执行(即,当它从()返回时)。如果线程已经结束,此函数将返回true。如果线程尚未启动,它也会返回true。
如您所见,ULONG_MAX是该方法的默认参数,它强制该方法永不超时。
是否可以选择在方法参数中添加自己的超时时间?
https://stackoverflow.com/questions/48322139
复制相似问题