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工程例項
相關文章
- Java NIO程式設計示例Java程式設計
- 從 React 架構開始講解 useState、useEffect 程式設計設計React架構程式設計
- 深入講解 Lotus Notes 外掛程式設計程式設計
- 詳細講解DirectDraw程式設計基礎(轉)程式設計
- 併發程式設計ConcurrentLinkedQueue使用示例詳解程式設計
- MapReduce 程式設計模型 & WordCount 示例程式設計模型
- 微信小程式WXML頁面常用語法(講解+示例)微信小程式XML
- 氣泡排序法原理講解及PHP程式碼示例排序PHP
- Python AI程式設計助手AICodeHelper使用示例詳解PythonAI程式設計
- Spring 面向切面程式設計AOP 詳細講解Spring程式設計
- Rust 程式設計影片教程對應講解內容-列舉型別與匹配Rust程式設計型別
- C語言MySQL程式設計示例C語言MySql程式設計
- 第五講 TCP程式設計TCP程式設計
- 深入講解Flutter應用模板原始碼:計數器示例Flutter原始碼
- Rust 程式設計影片教程對應講解內容-HashMapRust程式設計HashMap
- Rust 程式設計影片教程對應講解內容-OptionRust程式設計
- Rust 程式設計影片教程對應講解內容-方法Rust程式設計
- Rust 程式設計影片教程對應講解內容-vectorRust程式設計
- Rust 程式設計影片教程對應講解內容-引用Rust程式設計
- Rust 程式設計影片教程對應講解內容-sliceRust程式設計
- 5種伺服器網路程式設計模型講解伺服器程式設計模型
- 老鳥向新手講解各種程式設計比賽程式設計
- Rust 程式設計視訊教程對應講解內容-列舉型別與匹配Rust程式設計型別
- Golang語言之gRPC程式設計示例GolangRPCC程式程式設計
- Rust 程式設計視訊教程對應講解內容-OptionRust程式設計
- Rust 程式設計影片教程對應講解內容-錯誤Rust程式設計
- Rust 程式設計影片教程對應講解內容-測試Rust程式設計
- Rust 程式設計視訊教程對應講解內容-方法Rust程式設計
- Rust 程式設計視訊教程對應講解內容-vectorRust程式設計
- Rust 程式設計視訊教程對應講解內容-HashMapRust程式設計HashMap
- Rust 程式設計影片教程對應講解內容-StringRust程式設計
- Rust 程式設計視訊教程對應講解內容-引用Rust程式設計
- Rust 程式設計視訊教程對應講解內容-sliceRust程式設計
- Rust 程式設計影片教程對應講解內容-型別Rust程式設計型別
- Rust 程式設計影片教程對應講解內容-所有權Rust程式設計
- Rust 程式設計影片教程對應講解內容-函式Rust程式設計函式
- Rust 程式設計影片教程對應講解內容-變數Rust程式設計變數
- 求助!!!求jdon的原始碼,“Struts應用系統案例設計程式設計講解”原始碼程式設計