C QThread:如何停止无限循环

C QThread:如何停止无限循环,c,qt,qthread,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

我在一个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的主循环中运行的对象中创建一个插槽。将按钮连接到该插槽,然后在相应的线程对象上调用terminate()。

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

从哲学上讲;如果能够阻止某个循环,它就不会是无限循环。线程引用中的无限!!!;)我已经构建了您的示例代码,它可以工作,线程被终止。Windows7,Qt4.7.4是的,我也在Windows上做了这个尝试,这是成功的。只有OB linux出现了问题。谢谢geotovros!!!我的应用程序将在windows上运行。实际上,调用terminate()是一种糟糕的做法。相反,您的无限循环应该有一些它会定期检查的标志,如果设置了该标志,您将中断循环。当然,您可以在线程中的另一个函数内更改标志。您可能还想查看QtConcurrent以解决此类长时间运行的任务。是的,但如果我的插槽位于QApplication的主循环中,我将丢失并发任务:/Thanton Schulz。不过,我的无限循环代表了我的图像处理库中的两百多个算法。我无法为每一个添加断点。在另一个多线程库中,我们可以在没有标记的情况下将线程作为“海盗”杀死。根据文档,确实是这样,“线程可以在其代码路径的任何点终止。”但是当您尝试时,什么也没有发生。谢谢您尝试启用终止,但没有任何帮助?您是否尝试调用
t1->terminate()从你的主线程?例如,
QApplication::connect(&push),SIGNAL(pressed()),this,SLOT(terminateAllThreads());void terminateAllThreads(){t1->terminate();}
我尝试了几乎所有的可能性,即使是这个。