![](/img/trans.png)
[英]Qt 5 - How to make QThread exit from its `wait` function where it got stuck after executing a QProcess on Windows?
[英]How to exit from QThread::wait()
我正在使用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分鍾再次檢查條件,我只想退出線程但主線程卡在wait(),有什么辦法嗎? 強行退出或殺死線程而不崩潰或掛起主應用程序? 我也試過QThread::terminated
但它永遠不會奏效。 任何幫助贊賞。 謝謝。
首先,不清楚你在上面的代碼中你在做什么。 你的第一個注意點是在你的線程中運行的方法,即你的線程對象。 首先,為什么有時你的線程沒有完成它的任務? 為什么它會卡住? 在這里,我可以看到一個條件始終為true的while
循環。 可能你在循環中有一些break語句,有時候永遠不會滿足,因為那個循環永遠不會完成,因為循環繼續。 只需仔細檢查那里出了什么問題。 如果while循環正在創建問題,我可以建議您在代碼中進行以下修改。 但是你必須非常小心,因為它不應該在完成一些非常重要的任務之前退出。
首先修改你的while循環,如下所示: - 在while循環之前引入一個bool變量
bool continued = true;
while(continued)
{
//your codes
}
現在在線程對象Worker中添加一個方法
void stopWorker()
{
continued = false;
}
現在只需要強制退出線程時調用此方法
工人─> stopWorker();
從Qt 5.2開始,有一個QThread :: requestInterruption()這個函數可以用來向你的線程發信號它應該停止工作,但是你必須檢查QThread :: isInterruptionRequested()的長操作然后退出你的循環或者事件循環: http : //doc.qt.io/qt-5/qthread.html#isInterruptionRequested
QThread類的官方文檔說:
bool QThread :: wait(unsigned long time = ULONG_MAX)
阻止線程,直到滿足以下任一條件:
與此QThread對象關聯的線程已完成執行(即從run()返回時)。 如果線程已完成,此函數將返回true。 如果線程尚未啟動,它也會返回true。
時間毫秒已過。 如果時間是ULONG_MAX(默認值),那么等待將永遠不會超時(線程必須從run()返回)。 如果等待超時,此函數將返回false。
如您所見,ULONG_MAX是該方法的默認參數,它強制該方法永不超時。
是否可以在方法參數中添加自己的超時?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.