WaitForSingleObject -- setevent 講解與程式設計示例

xianjian_x發表於2016-05-13

  函式一直等待,直到指明的 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工程例項

相關文章