事件EVENT與waitforsingleobject的使用


事件event與waitforsingleobject的配合使用,能夠解決很多同步問題,也可以在數據達到某個狀態時啟動另一個線程的執行,如報警。

event的幾個函數:

1、CreateEvent和OpenEvent

1 HANDLE WINAPI CreateEvent(
2   __in          LPSECURITY_ATTRIBUTES lpEventAttributes,    //表示安全控制,一般直接傳入NULL,表示不能被子進程繼承
3   __in          BOOL bManualReset,  //參數確定事件是手動置位還是自動置位,傳入TRUE表示手動置位,傳入FALSE表示自動置位。
4   __in          BOOL bInitialState,  //Event的初始狀態, TRUE為觸發,FALSE未觸發
5   __in          LPCTSTR lpName   //Event object的名字,NULL表示沒名字(without a name)
6 );

要是CreateEvent創建的事件沒名字  這個函數就沒啥用了,不多做介紹,可查看msn。
1
HANDLE WINAPI OpenEvent( //獲得已經存在的Event的事件句柄 2 __in DWORD dwDesiredAccess, 3 __in BOOL bInheritHandle, 4 __in LPCTSTR lpName //要打開的事件名字 5 );

2、SetEvent,觸發事件

1 BOOL SetEvent(HANDLE hEvent);

3、ResetEvent,使事件狀態設為未觸發,如在創建事件時第二個參數為TRUE手動設置,則需要該函數去恢復事件為未觸發狀態。

BOOL SetEvent(HANDLE hEvent);

4、PulseEvent, 如在創建事件時第二個參數為TRUE手動設置,其功能相當於SetEvent()后立即調用ResetEvent(),最好別用

1 BOOL PulseEvent(HANDLE hEvent)

5、CloseHandle(),關閉該句柄。

**********

WaitForSingleObject函數。使線程處於等待狀態,如等待某一事件的觸發。

1 DWORD WINAPI WaitForSingleObject(
2 
3   HANDLE hHandle,                   //等待的觸發句柄  ,  如前面說的Event的句柄
4 5 DWORD dwMilliseconds //等待多長時間,單位ms 如5000 則為5s 若為INFINITE表示無限等待 6 7 );

******************

一種應用的例子:

 1 BOOL CMainDlg::OnInitDialog()
 2 {
 3     CDialog::OnInitDialog();
 4 
 5     m_handle = CreateEvent(NULL,FALSE,FALSE,NULL);  //自動復位事件狀態,初始狀態未觸發
 6 
 7     return TRUE;  
 8 }
 9 //線程1函數
10 {
11    ....
12    SetEvent(m_handle);       //觸發事件
13 }
14 //線程2函數
15 {
16     ......
17    WaitForSingleObject(m_handle,INFINITE);  //無限等待 事件的觸發才會執行后續程序
18    ...........
19 }

最后,事件是內核對象,事件分為手動置位事件和自動置位事件。事件Event內部它包含一個使用計數(所有內核對象都有),一個布爾值表示是手動置位事件還是自動置位事件,另一個布爾值用來表示事件有無觸發。事件可以由SetEvent()來觸發,由ResetEvent()來設成未觸發。還可以由PulseEvent()來發出一個事件脈沖。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM