簡體   English   中英

如何退出QThread :: wait()

[英]How to exit from QThread::wait()

我正在使用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分鍾再次檢查條件,我只想退出線程但主線程卡在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM