標籤:blog http 使用 sp for on 資料 div log
WaitForSingleObject函數用來檢測hHandle事件的訊號狀態,當函數的執行時間超過dwMilliseconds就返回,但如果參數dwMilliseconds為INFINITE時函數將直到相應時間事件變成有訊號狀態才返回,否則就一直等待下去,直到WaitForSingleObject有返回直才執行後面的代碼。
CEvent 類提供了對事件的支援。事件是一個允許一個線程在某種情況發生時,喚醒另外一個線程的同步對象。例如在某些網路應用程式中,一個線程(記為A)負責監聽通訊連接埠,另外一個線程(記為B)負責更新使用者資料。通過使用CEvent 類,線程A可以通知線程B何時更新使用者資料。每一個CEvent 對象可以有兩種狀態:有訊號狀態和無訊號狀態。線程監視位於其中的CEvent 類對象的狀態,並在相應的時候採取相應的操作。
在MFC中,CEvent 類對象有兩種類型:人工事件和自動事件。一個自動CEvent 對象在被至少一個線程釋放後會自動返回到無訊號狀態;而人工事件對象獲得訊號後,釋放可利用線程,但直到調用成員函數ReSetEvent()才將其設定為無訊號狀態。在建立CEvent 類的對象時,預設建立的是自動事件。 CEvent 類的各成員函數的原型和參數說明如下:
1、CEvent(BOOL bInitiallyOwn=FALSE, BOOL bManualReset=FALSE, LPCTSTR lpszName=NULL, LPSECURITY_ATTRIBUTES lpsaAttribute=NULL);
- bInitiallyOwn:指定事件對象初始化狀態,TRUE為有訊號,FALSE為無訊號;
- bManualReset:指定要建立的事件是屬於人工事件還是自動事件。TRUE為人工事件,FALSE為自動事件;
- 後兩個參數一般設為NULL,在此不作過多說明。
2、BOOL CEvent::SetEvent();
將 CEvent 類對象的狀態設定為有訊號狀態。如果事件是人工事件,則 CEvent 類對象保持為有訊號狀態,直到調用成員函數ResetEvent()將其重新設為無訊號狀態時為止。如果CEvent 類對象為自動事件,則在SetEvent()將事件設定為有訊號狀態後,CEvent 類對象由系統自動重設為無訊號狀態。
如果該函數執行成功,則返回非零值,否則返回零。
3、BOOL CEvent::ResetEvent();
該函數將事件的狀態設定為無訊號狀態,並保持該狀態直至SetEvent()被調用時為止。由於自動事件是由系統自動重設,故自動事件不需要調用該函數。如果該函數執行成功,返回非零值,否則返回零。我們一般通過調用WaitForSingleObject函數來監視事件狀態。前面我們已經介紹了該函數。由於語言描述的原因,CEvent 類的理解確實有些難度,但您只要通過仔細玩味下面常式,多看幾遍就可理解
例子:
CEvent g_faxEvent(TRUE);
DWORD WINAPI GetMessageCenterNum(void *p)
{
WaitForSingleObject(g_faxEvent, INFINITE);
g_faxEvent.ResetEvent();
/////////////////////////////////////////////
要保護的代碼
////////////////////////////////////////////
g_faxEvent.SetEvent();
return 0;
}
轉自:http://blog.sina.com.cn/s/blog_64274d080100vfx0.html
WaitForSingleObject和CEvent用法