c++ - 如何退出 QThread::wait()

标签 c++ multithreading qt qt4 qthread

我在后台使用 QThread 执行一些大型任务,这里是示例 我正在使用的代码

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 条件,我只想退出线程但 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/

相关文章:

c++ - 我如何转发声明一个类并稍后在 C++ 中使用它的成员函数?

java - 如何更改 swig 生成的代理类中的特定方法实现?

c++ - 如果我编写一段代码,其中每个线程修改数组的完全不同部分,这会保持缓存一致性吗?

performance - 按下按钮以Qt播放音频;有效率的

qt - QLabel Anywhere 自动换行还是字符换行?

c++ - 使用函数外部的 const 变量计算时,Constexpr 不会被求值

c++ - 在 C++ 中将对象存储在二维 Sprite 矩阵中

Java多线程: Implementing of important methods in Thread class in Native Libraries?

java - SwingWorker 线程中的多线程

c++ - 使用 Qt 和唯一指针时出错