2012-02-07 59 views
3

我有一個線程化的應用程序,其中主線程是gui線程,輔助線程是嵌套for循環內主要計算的線程。現在問題是如何終止輔助線程。當我按下GUI線程上的停止按鈕時,它在輔助線程中調用了一個插槽,該插槽將stop變量設置爲true。這種技術的問題是,在for循環中測試停止變量(如下所示)是不夠的。因爲如果在線程進入第三個for循環之後按下停止按鈕,它將在檢查停止標誌之前執行所有冗長的函數。這就是爲什麼我們需要在執行其內容之前在每個函數中測試它,我認爲這不是一個非常優雅的解決方案。 我不能在這個線程上調用終止,因爲這個線程分配了一定量的內存內存,調用terminate會導致內存泄漏。如何終止長時間運行的Qt線程

因此,對於這種情況,終止線程和任何點的最佳方法是什麼?

以下代碼框架是隻給你什麼I/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

你可以將你的函數封裝在類中,並將這些類的對象列表存儲在列表中。因此,調用你的函數將循環遍歷這個列表,你將只有一個代碼位置來檢查停止條件。順便說一下,爲了避免在每個嵌套循環中停下來,你可以使用goto或throw。 在C++中,留下嵌套循環是goto唯一的「合法」用例。 關於扔,B.Stroustrup首選goto並鼓勵使用它作爲控制結構。

相關問題