首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何退出QThread::wait()

如何退出QThread::wait()
EN

Stack Overflow用户
提问于 2018-01-18 21:07:25
回答 3查看 1K关注 0票数 1

我正在后台使用QThread完成一些巨大的任务,下面是我正在使用的示例代码

代码语言:javascript
复制
class Worker : public QObject
{
    Q_OBJECT
    QThread workerThread;

public slots:
    void doWork(const QString &parameter) {
        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,但它从来都不起作用。感谢您的帮助。谢谢。

EN

回答 3

Stack Overflow用户

发布于 2018-01-18 22:45:06

首先,从上面的代码中看不出你在线程上做了什么。你的第一个关注点是你的方法,它在你的线程中运行,即你的线程对象。首先,为什么有时候你的线程不能完成它的任务?为什么它会被保留下来?在这里,我可以看到一个条件总是为真的while循环。可能在循环中有一些break语句,这些语句有时永远不会满足,并且由于该线程永远不会完成,因为while循环仍在继续。只需仔细检查哪里出了问题。如果while循环造成了这个问题,我可以建议您在代码中进行以下修改。但你必须非常小心,因为它不应该在完成一些非常重要的任务之前退出。

首先修改while循环,如下所示:-在while循环之前引入一个bool变量

代码语言:javascript
复制
bool continued = true;
while(continued)
{
   //your codes
}

现在,在线程对象工作线程中添加一个方法

代码语言:javascript
复制
void stopWorker()
{
   continued = false;
}

现在,当您希望线程强制退出时,只需调用此方法

代码语言:javascript
复制
 worker->stopWorker();
票数 2
EN

Stack Overflow用户

发布于 2018-01-20 19:25:57

自从Qt5.2以来,只有一个QThread::requestInterruption() this函数可以用来通知你的线程它应该停止工作,但是你必须为QThread::isInterruptionRequested()签入你的长操作,并退出你的循环或事件循环:http://doc.qt.io/qt-5/qthread.html#isInterruptionRequested

票数 2
EN

Stack Overflow用户

发布于 2018-01-18 21:19:39

QThread类的官方文档说:

等待布尔QThread::

(unsigned long time = ULONG_MAX)

阻止线程,直到满足以下任一条件:

与此QThread对象关联的线程已完成执行(即,当它从()返回时)。如果线程已经结束,此函数将返回true。如果线程尚未启动,它也会返回true。

  • 时间已过毫秒。如果时间是ULONG_MAX (缺省值),那么等待永远不会超时(线程必须从run()返回)。如果等待超时,此函数将返回false。

如您所见,ULONG_MAX是该方法的默认参数,它强制该方法永不超时。

是否可以选择在方法参数中添加自己的超时时间?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48322139

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档