QThread: как остановить бесконечный цикл - PullRequest
1 голос
/ 24 февраля 2012

Я выполняю в 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 голосов
/ 24 февраля 2012

Согласно документации, сначала необходимо вызвать метод void setTerminationEnabled ( bool enabled = true ) и включить завершение.В противном случае прекращение будет отложено.

0 голосов
/ 24 февраля 2012

Поток никогда не обработает сигнал terminate (), поскольку слот exec никогда не возвращает управление циклу событий потока.

Вместо этого вы должны создать слот в объекте, работающем в основном цикле QApplication. Подключите кнопку к этому слоту, а затем вызовите terminate () для соответствующего объекта потока.

...