Win32 中等待线程调用的结束
如果在.net中一个线程等待另外一个线程的完成,可以使用System.Threading.Thread.Join, 在Win32 下的相应的等效代码
1
WaitForSingleObject(hThread,INFINITE);
2
3 CloseHandle(hThread);
Win32 中CreateThread出来的hThread属于整个Process,线程中的回调函数结束后,不会失效,只有调用者调用CloseHandle,才最后真正的释放系统中Thread 的资源.
2
3 CloseHandle(hThread);
如果线程的回调函数已经结束,那么hThread 处于激活状态,WaitForSignleObject 便能获取到当前状态,成功返回;如果没有,WaitForSignleObject 便一直等待线程的回调结束.
如果你想一个线程中等待另外一个线程回调结束的同时,进行消息MSG的分发,或者做其他的事情.例如主UI线程在等待工作线程完成的同时,需要更新UI上的进度条,这时可以让工作线程发送进度消息MSG给主UI线程,主UI线程接受到消息MSG更新UI.可以在主UI线程中使用MsgWaitForMultipleObjects函数达到这一效果,
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
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