簡體   English   中英

QThread:如何停止無限循環

[英]QThread : how to stop an infinite loop

我在Qthread中執行大約3個小時的圖像處理過程,而無法在其中放入一些出口檢查點。 問題是我無法阻止它。 此代碼表示此問題:

class Toto : public QObject
{
    Q_OBJECT
    public slots:
    void exec(){      
        //I represent the real process  with an infinite loop
        while(1==1);
    }
};
int main(int argc, char *argv[])
{
    QApplication aa(argc, argv);
    QThread * t1 = new QThread;
    Toto * toto1 = new Toto;
    QThread * t2 = new QThread;
    Toto * toto2 = new Toto;
    QPushButton push;
    push.show();
    toto1->moveToThread(t1);
    toto2->moveToThread(t2);
    QMetaObject::invokeMethod(toto1, "exec", Qt::QueuedConnection);
    QMetaObject::invokeMethod(toto2, "exec", Qt::QueuedConnection);
    QApplication::connect(&push, SIGNAL(pressed()), t1,SLOT(terminate()), Qt::QueuedConnection);
    QApplication::connect(&push, SIGNAL(pressed ()), t2,SLOT(terminate()), Qt::QueuedConnection);
    t2->start();
    t1->start();
    return aa.exec();
}

謝謝你的幫助

線程將永遠不會處理Terminate()信號,因為exec插槽永遠不會將控制權返回給線程的事件循環。

相反,您應該在QApplication的mainloop中運行的對象中創建一個插槽。 將按鈕連接到該插槽,然后在適當的線程對象上調用Terminate()。

根據文檔,您需要首先調用void setTerminationEnabled ( bool enabled = true )方法並啟用終止。 否則將推遲終止。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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