1. 程式人生 > >WaitForSingleObject -- setevent 講解與程式設計示例

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工程例項