如何確定 Thread(s) 已結束 |
答題得分者是:GrandRURU
|
2007
中階會員 發表:54 回覆:90 積分:98 註冊:2008-08-12 發送簡訊給我 |
|
GrandRURU
站務副站長 發表:240 回覆:1680 積分:1874 註冊:2005-06-21 發送簡訊給我 |
var
lpExitCode:Cardinal; begin // 刪除執行緒後 While True do begin if GetExitCodeThread(Thread.Handle, lpExitCode) and (lpExitCode <> STILL_ACTIVE) then begin Break; end; Application.Processmessages; // 別用 Sleep end; 沒看清楚是 C { // 刪除執行緒後 DWORD vExitCode = 0; while (1) { if ((::GetExitCodeThread(CloseThread->Handle, &vExitCode)) && (vExitCode != STILL_ACTIVE)) break(); Application->Processmessages(); } } ===================引 用 2007 文 章=================== 各位好: 程式有開很多的 Thread, 雖然下 Terminate(); 可以結束 Thread, 但如何確定 Thread 都終止了(應該不是馬上就終止)?? 例如:按下某個 Button,對所有 Thread 下 Terminate ,但要等所有 Thread 確定都終止才能執行下一階段程式, 或者 軟体關掉時 要確保 Thread 都終止才關閉。 謝謝
編輯記錄
GrandRURU 重新編輯於 2014-09-04 17:17:51, 註解 無‧
|
aftcast
站務副站長 發表:81 回覆:1485 積分:1763 註冊:2002-11-21 發送簡訊給我 |
最簡單的方式應該可使用 TThread.WaitFo。在loop中去讀每一個thread object,terminated然後用waitfor。 但有可能會有卡住的情形。因waitfor會卡在那裡直到thread真的結束。就在卡的時候,你的ui可 能會hold住…
若你不想ui卡,我認為你可以再起一個thread,在裡面去loop上述的每個thread,若所有的thread完成,你post一個自定的message到form上,接到後再往下做對應的事。而這個再起的thread可以使用 freeonterminate的方式自動讓它死去。(因為message已經post了,它可以自己安息了)。 ===================引 用 2007 文 章=================== 各位好: 程式有開很多的 Thread, 雖然下 Terminate(); 可以結束 Thread, 但如何確定 Thread 都終止了(應該不是馬上就終止)?? 例如:按下某個 Button,對所有 Thread 下 Terminate ,但要等所有 Thread 確定都終止才能執行下一階段程式, 或者 軟体關掉時 要確保 Thread 都終止才關閉。 謝謝
------
蕭沖 --All ideas are worthless unless implemented-- C++ Builder Delphi Taiwan G+ 社群 http://bit.ly/cbtaiwan |
aftcast
站務副站長 發表:81 回覆:1485 積分:1763 註冊:2002-11-21 發送簡訊給我 |
若要最正統解,且效能好,給你一個參考:
http://courses.cs.washington.edu/courses/cse410/00au/hw/hw6_waitthreads.html 因為你用c ,所以應該看得懂,重點是 waitformultipleobjects 這個 win32 api。你只要把tthread的handel放到陣列裡,然後參考上述,就可以。 這樣寫法的好處是方便。當然,當我po完後,發現ruru提早po了,他的方式也是很好的一種,但要自己去寫是否"所有"的都完成的一段程式。 若不想用win32 api,就用我上面講的 tthread的方法。不過效果可能差一點點,因為是thread是一條一條的結束並等候。
------
蕭沖 --All ideas are worthless unless implemented-- C++ Builder Delphi Taiwan G+ 社群 http://bit.ly/cbtaiwan |
2007
中階會員 發表:54 回覆:90 積分:98 註冊:2008-08-12 發送簡訊給我 |
謝謝 GrandRURU 及 aftcast 抽空回覆!!
照 GrandRURU 語法,build 會出現以下的錯誤 if ((::GetExitCodeThread(CloseThread->Handle, &vExitCode)) && (vExitCode != STILL_ACTIVE)) <---錯誤發生在這一行 [C Error] frmMainU.cpp(374): E2034 Cannot convert 'const unsigned int' to 'void *' [C Error] frmMainU.cpp(374): E2342 Type mismatch in parameter 'hThread' (wanted 'void *', got 'unsigned int') 我將它改成這樣 對嗎?? ---> ::GetExitCodeThread((void *)CloseThread->Handle, &vExitCode); 謝謝 |
GrandRURU
站務副站長 發表:240 回覆:1680 積分:1874 註冊:2005-06-21 發送簡訊給我 |
unsigned long vExitCode = 0;
if ((::GetExitCodeThread((HANDLE)Th->Handle, &vExitCode)) && (vExitCode != STILL_ACTIVE)) ===================引 用 2007 文 章=================== 謝謝 GrandRURU 及 aftcast 抽空回覆!! 照 GrandRURU 語法,build 會出現以下的錯誤 if ((::GetExitCodeThread(CloseThread->Handle, &vExitCode)) && (vExitCode != STILL_ACTIVE)) <---錯誤發生在這一行 [C Error] frmMainU.cpp(374): E2034 Cannot convert 'const unsigned int' to 'void *' [C Error] frmMainU.cpp(374): E2342 Type mismatch in parameter 'hThread' (wanted 'void *', got 'unsigned int') 我將它改成這樣 對嗎?? ---> ::GetExitCodeThread((void *)CloseThread->Handle, &vExitCode); 謝謝 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |