全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2930
推到 Plurk!
推到 Facebook!

如何確定 Thread(s) 已結束

答題得分者是:GrandRURU
2007
中階會員


發表:54
回覆:90
積分:98
註冊:2008-08-12

發送簡訊給我
#1 引用回覆 回覆 發表時間:2014-09-04 16:34:29 IP:118.163.xxx.xxx 未訂閱
各位好:

程式有開很多的 Thread,
雖然下 Terminate(); 可以結束 Thread,
但如何確定 Thread 都終止了(應該不是馬上就終止)??

例如:按下某個 Button,對所有 Thread 下 Terminate ,但要等所有 Thread 確定都終止才能執行下一階段程式,
或者 軟体關掉時 要確保 Thread 都終止才關閉。

謝謝

GrandRURU
站務副站長


發表:234
回覆:1651
積分:1742
註冊:2005-06-21

發送簡訊給我
#2 引用回覆 回覆 發表時間:2014-09-04 17:11:45 IP:59.120.xxx.xxx 訂閱
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
回覆:1482
積分:1762
註冊:2002-11-21

發送簡訊給我
#3 引用回覆 回覆 發表時間:2014-09-04 17:20:26 IP:114.32.xxx.xxx 訂閱
最簡單的方式應該可使用 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
回覆:1482
積分:1762
註冊:2002-11-21

發送簡訊給我
#4 引用回覆 回覆 發表時間:2014-09-04 17:42:50 IP:114.32.xxx.xxx 訂閱
若要最正統解,且效能好,給你一個參考:
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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2014-09-05 10:21:36 IP:118.163.xxx.xxx 未訂閱
謝謝 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
站務副站長


發表:234
回覆:1651
積分:1742
註冊:2005-06-21

發送簡訊給我
#6 引用回覆 回覆 發表時間:2014-09-05 14:34:47 IP:59.120.xxx.xxx 訂閱
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);

謝謝

系統時間:2017-10-24 15:49:57
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!