2012-02-07 22 views
3

メインスレッドがGUIスレッドであり、セカンダリスレッドがネストされたforループ内で主要な計算を行うスレッドアプリケーションがあります。今問題は、セカンダリスレッドを終了する方法です。私がGUIスレッド上の停止ボタンを押すと、それは二次スレッド内のスロットを呼び出して、停止変数を真に設定します。この手法の問題点は、forループの停止変数をテストすることです(下図参照)。スレッドが3番目のforループに入った直後に停止ボタンを押すと、停止フラグをチェックする前にすべての長い関数が実行されるためです。なぜ私たちは内容を実行する前に各機能でそれをテストする必要があるのですか?それは非常に洗練された解決策ではありません。 このスレッドでは、メモリのメモリ量をいくらか確保し、terminateを呼び出すとそのメモリがリークするため、このスレッドでterminateを呼び出すことはできません。長時間実行するQtスレッドを終了するには

このようなシナリオでは、スレッドと任意のポイントを終了する最も良い方法は何でしょうか?コードスケルトン後

はちょうどあなたと私/ mはおよそ

void run() { 

    for(int i = 0; i < 4 && !stop; i++) { 
      for(int j = 0; j < 3 && !stop; j++) { 
       for(int k; k < 6 && !stop; k++) { 
        callA(); 
        callB(); 
        callC(); 
        callD(); 
        callE(); 
        callF(); 
        callF(); 
        callG(); 
       } 
      } 
    } 
} 

callA() { callL(); } 

callB() { callM(); } 

callC() { callN(); } 

callD() { callO(); } 

callE() { callP(); } 

callF() { callQ(); } 

callF() { callR(); } 

callG() { callS(); } 

callL() { sleep(20); } 

callM() { sleep(60); } 

callN() { QProcess(); } 

callO() { sleep(30);} 

callP() { QProcess(); } 

callQ() { } 

callR() { sleep(60); } 

callS() { QProcess(); } 

答えて

1

あなたがスレッドがイベントを受信できるようにあなたの仕事のループ内ではQApplication ::のprocessEvents()を呼び出すことができます話かのアイデアを与えることです。例えば、あなたの仕事を混乱させるべきかどうかを確認するためにチェックする変数を設定するスロットを呼び出すメインスレッドがイベントとなります。

//main thread calls this slot 
void interupt_slot() 
{ 
    stop_was_called = true; 
} 

void do_work() 
{ 
    for(;;) 
    { 
     QApplication::processEvents(); 
     if(stop_was_called) 
      break; 

     //Work 
    } 

    //Exectution is over and the thread can be stopped etc 
    emit its_over(); 

}

編集:

これは、しかし、スレッドの眠りをinteruptません。スレッドがスリープ中にメインスレッドがinterupt_slot()スロットを呼び出すと、sleep(n)が終了したときにスロットが呼び出されます。しかし、タイマーで呼び出されるスロットで作業を行うことで、睡眠を偽ってしまうこともできます。

0

クラスに関数をラップし、これらのクラスのオブジェクトのリストをリストに格納することができます。したがって、あなたの関数を呼び出すことは、このリストを反復するループになり、停止条件をチェックするためのコード場所は1つだけになります。 ところで、各入れ子になったループでの停止 - チャックを避けるために、gotoまたはthrowを使用することができます。 ネストされたループを残すC++では、gotoの唯一の「合法的」ユースケースです。 スローに関しては、B.Stroustrupはそれをgotoよりも優先し、制御構造として使用することを奨励します。

関連する問題