如果在.net中一個(gè)線程等待另外一個(gè)線程的完成,可以使用System.Threading.Thread.Join, 在Win32 下的相應(yīng)的等效代碼
1 WaitForSingleObject(hThread,INFINITE);
2
3 CloseHandle(hThread);
Win32 中CreateThread出來的hThread屬于整個(gè)Process,線程中的回調(diào)函數(shù)結(jié)束后,不會(huì)失效,只有調(diào)用者調(diào)用CloseHandle,才最后真正的釋放系統(tǒng)中Thread 的資源.
如果線程的回調(diào)函數(shù)已經(jīng)結(jié)束,那么hThread 處于激活狀態(tài),WaitForSignleObject 便能獲取到當(dāng)前狀態(tài),成功返回;如果沒有,WaitForSignleObject 便一直等待線程的回調(diào)結(jié)束.
如果你想一個(gè)線程中等待另外一個(gè)線程回調(diào)結(jié)束的同時(shí),進(jìn)行消息MSG的分發(fā),或者做其他的事情.例如主UI線程在等待工作線程完成的同時(shí),需要更新UI上的進(jìn)度條,這時(shí)可以讓工作線程發(fā)送進(jìn)度消息MSG給主UI線程,主UI線程接受到消息MSG更新UI.可以在主UI線程中使用MsgWaitForMultipleObjects函數(shù)達(dá)到這一效果,
1 MSG msg;
2
3 BOOL bLoop=TRUE;
4
5 while(bLoop)
6 {
7
8 int nWait=MsgWaitForMultipleObjects(1,&hThread,FALSE,3000,QS_ALLEVENTS);
9 switch(nWait)
10 {
11 case WAIT_TIMEOUT:
12 case WAIT_OBJECT_0+1:
13 {
14 while( PeekMessage( &msg, NULL, 0, 0, PM_REMOVE ) ) {
15 TranslateMessage(&msg);
16 DispatchMessage( &msg );
17 }
18 break;
19 }
20
21 case WAIT_OBJECT_0:
22 default:
23 bLoop=FALSE;
24 break;
25 }
26 };
27 CloseHandle(hThread);
28
29
30