2010-12-15 86 views
1

我有一些代碼在Qt的是這樣的:線程什麼時候退出?

void doSomeStuff() 
{ 
    ... 
    if(blah blah) 
     someObj.start(); 
    ... 
} 

然後someObj.run()

void someObj::run() 
{ 
    blah blah blah, do some stuff 
    doSomeStuff() 
} 

我是什麼打算是在someObj.start()創建結束新的線程,然後功能主線程中的doSomeStuff在停止後會再次被調用。但是我的程序隨機崩潰,當我再次密切關注代碼時,我意識到也許真正的情況是新線程只是在不停止的情況下調用函數,從而不斷產生新線程。我的懷疑是否正確?如果是這樣,我該如何補救?

+0

爲什麼會調用線程使函數該函數可以在調用它的線程以外的任何地方運行?另外,-1不要先嚐試它。 – Falmarri 2010-12-15 04:48:39

+0

@Falmarri,所以我想在這裏檢查我的直覺是否正確。順便說一句,我應該先嚐試什麼? – wrongusername 2010-12-15 04:49:48

+0

@Falmarri也許你認爲我已經寫了一些代碼,並沒有嘗試過,並在這裏發佈......我應該更新問題,使其更清晰 – wrongusername 2010-12-15 04:51:51

回答

3

doSomeStuff()當線程exectured自我線程將還活着,否則它不會在所有被稱爲目前所謂的^^只有當doSomeStuff完成那麼你的線程將退出

通過在掠QT DOC(我不是Qt的專家),我發現

http://doc.qt.io/qt-5/qthread.html

布爾isFinished()const的

你可以說從那裏回撥

+0

如何實現回調? – wrongusername 2010-12-15 05:07:26

+0

沒關係,我做了一個信號槽的東西:) – wrongusername 2010-12-15 06:24:21

1

這似乎有點混亂。你說你的主線程調用doSomeStuff()來不時地啓動一個線程,但你也可以在線程運行函數中調用它。我只是假設有兩種情況。我認爲最有可能的情況是,你想線程每個doSomeStuff被稱爲主線程時間正好運行一次,如果是這樣的:

void doSomeStuff() 
{ 
    ... 
    if(blah blah) 
    { 
     if(someObj.isRunning()) 
      someObj.wait(); 
     someObj.start(); 
    } 
    ... 
} 

void someObj::run() 
{ 
    blah blah blah, do some stuff 
} 

如果你真的這樣做要線狀體循環結束,結束,只需使用while循環,而不是試圖再次調用它。你可能,在這種情況下,打算讓線程肯定會每次doSomeStuff被調用運行肯定,所以你需要更聰明一點:

bool someObjRun = false; 
QMutex someObjRunLock; 

void doSomeStuff() 
{ 
    ... 
    if(blah blah) 
    { 
     someObjRunLock.lock(); 
     someObjRun = true; 

     if (!someObj.isRunning()) 
      someObj.start(); 

     someObjRunLock.unlock(); 
    } 
    ... 
} 

void someObj::run() 
{ 
    someObjRunLock.lock() 
    while(someObjRun) 
    { 
     someObjRunLock.unlock(); 

     blah blah blah, do some stuff 

     someObjRunLock.lock() 
     if(should quit...) 
     { 
      someObjRun = false; 
     } 

    } 
    someObjRunLock.unlock() 
} 
+0

我認爲這是第一個案件。我想讓主循環調用線程,讓線程執行它的語句然後死掉,然後讓'doSomeStuff'函數再次運行。那麼'someObj.wait'會等到另一個線程停止運行? – wrongusername 2010-12-15 05:06:34

+0

是的,'QThread.wait()'阻塞調用線程,直到目標線程退出。 (http://doc.trolltech.com/4.7/qthread.html#wait) – SingleNegationElimination 2010-12-15 14:07:44

相關問題