WaitForSingleObject -- setevent 講解與程式設計示例
函式一直等待,直到指明的 Handle 處於signed 狀態,或者超過規定的時間才返回。
函式原型:
DWORD WINAPI WaitForSingleObject(
_In_ HANDLE hHandle,
_In_ DWORD dwMilliseconds
);
hHandle[in]物件控制代碼。可以指定一系列的物件,如Event、Job、Memory resource notification、Mutex、Process、Semaphore、Thread、Waitable timer等。
dwMilliseconds[in]超時時間間隔,單位為milliseconds(毫秒)。
WaitForSingleObject函式用來檢測 hHandle 事件的訊號狀態,在某一執行緒中呼叫該函式時,執行緒暫時掛起,如果在掛起的dwMilliseconds毫秒內,執行緒所等待的物件變為有訊號狀態,則該函式立即返回;如果超時時間已經到達 dwMilliseconds 毫秒,但 hHandle 所指向的物件還沒有變成有訊號狀態,函式照樣返回。引數dwMilliseconds有兩個具有特殊意義的值:0和INFINITE。若為0,則該函式立即返回;若為INFINITE,則執行緒一直被掛起,直到hHandle所指向的物件變為有訊號狀態時為止。
當直接或者間接建立視窗的時候,使用這個函式要小心,因為此時 wait 會導致訊息阻塞,進一步導致系統死鎖。關於這點可見
SetEvent 函式原型:
BOOL WINAPI SetEvent(
_In_ HANDLE hEvent
);
hEvent 是一個事件的控制代碼, 通過 CreateEvent 或者 OpenEvent 返回。函式成功返回非0,失敗返回0。
WaitForSingleObject()等待,直到引數所指定的 hHandle 成為發訊號狀態
時才返回,當 OBJECT 是EVENT 的時候就可以通過 SetEvent 讓其返回。
下面是一個小例子:
// wait_for.cpp : 定義控制檯應用程式的入口點。
//
#include "stdafx.h"
#include <afxmt.h>
CEvent g_event;
void ThreadFunc1(LPVOID pParam)
{
::WaitForSingleObject(NULL/*g_event*/,INFINITE);
for( int i = 0; i < 100; i++ )
{
printf("ThreadFunc1:%d\n", i);
}
}
void ThreadFunc2(LPVOID pParam)
{
for( int i = 0; i < 5; i++ )
{
printf("ThreadFunc2:%d\n", i);
Sleep(1000);
}
g_event.SetEvent();
}
int _tmain(int argc, _TCHAR* argv[])
{
DWORD m_ThreadID[2];
g_event.ResetEvent();
::CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadFunc1,NULL,0,&m_ThreadID[0]);
::CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadFunc2,NULL,0,&m_ThreadID[1]);
getchar();
return 0;
}
通過例子可以看出 他們之間是如何互動的,需要注意的是上面測試了一下 WaitForSingleObject
引數控制代碼為NULL的情況:此時不等待直接返回,而不管第二個引數數值。
無效控制代碼可見示例。
關於 WaitForSingleObject 返回值 參考:
MSDN
關於 SetEvent 可參考:
MSDN
VS2010工程例項