2012-02-24 29 views
1

Qthreadで画像処理手順を実行すると、内部にチェックポイントを置くことなく3時間かかります。問題は私がそれを止めることができないということです。このコードは、この問題を表します。execスロットはスレッドのイベントループに制御を返すことはありませんので、あなたの助けをQThread:無限ループを止める方法

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

おかげ

+0

哲学的に言えば;誰かがそれを止めることができれば、何かが無限ループになることはありません。 – Jake

+1

スレッドの無限大!!! ;) – Vincent

+0

私はあなたのサンプルコードをビルドし、それは動作し、スレッドは終了します。 Windows 7、Qt 4.7.4 – Dmitriy

答えて

0

は、スレッドが終了する()信号を処理することはありません。

代わりに、QApplicationのメインループで実行中のオブジェクトにスロットを作成する必要があります。そのスロットにボタンを接続し、適切なスレッドオブジェクトでterminate()を呼び出します。

+0

実際、terminate()の呼び出しは悪い習慣です。代わりに、あなたの無限ループは定期的にチェックするいくつかのフラグを持っている必要があり、そのフラグが設定されていれば、ループから抜け出します。もちろん、スレッド内の別の関数の中でフラグを変更します。このような長時間実行されるタスクを解決するには、QtConcurrentも見てください。 –

+0

はい、私のスロットがQApplicationのメインループにある場合、同時実行タスクが失われました:/ – Vincent

+0

Trenton SchulzHoweverありがとうございます。私の無限ループは、画像処理ライブラリの2つ以上のアルゴリズムを表しています。私はそれぞれのブレークポイントを追加することはできません。他のマルチスレッドライブラリでは、スレッドをフラグなしで「海賊」として殺すことができます。 – Vincent

0

文書によれば、最初にvoid setTerminationEnabled (bool enabled = true)メソッドを呼び出して終了を有効にする必要があります。それ以外の場合、終了は延期されます。

+0

ドキュメントによれば、「スレッドはコードパスのどこでも終了できます」しかし、あなたがそれを試しても、何も起こりません。ありがとう – Vincent

+0

あなたは終了を有効にしようとしましたが何も助けられませんでしたか?メインスレッドから 't1-> terminate();'を呼び出そうとしましたか?例えば。 'QApplication :: connect(&push、SIGNAL(pressed))、this、SLOT(terminateAllThreads())); void terminateAllThreads(){t1-> terminate(); } ' – Dmitriy

+0

私はこれでもほとんどすべての可能性を試しています。 – Vincent

関連する問題