QThread:如何阻止无限循环

时间:2012-02-24 11:11:17

标签: c qt qthread

我在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();
}

感谢您的帮助

2 个答案:

答案 0 :(得分:0)

线程永远不会处理terminate()信号,因为exec槽永远不会将控制权返回给线程的事件循环。

相反,您应该在QApplication的mainloop中运行的对象中创建一个插槽。将按钮连接到该插槽,然后在相应的线程对象上调用terminate()。

答案 1 :(得分:0)

根据文档,您需要先调用void setTerminationEnabled ( bool enabled = true )方法并启用终止。否则终止将被推迟。