事件内核对象 CreateEvent
事件內核對象是在線程同步時比較常用的內核對象。
一個事件內核對象的觸發表示一個操作已經完成。有兩種類型的事件內核對象:手動重置事件和自動重置事件。
當一個手動重置對象被觸發的時候,正在等待該事件的所有線程都將變成可調度狀態。而當一個自動重置事件被觸發時,只有一個正在等待該事件的線程會變成可調度狀態。
事件內核對象最通常的用途是:讓一個線程執行初始化工作,然后觸發另一個線程,讓他執行剩余的工作,一開始的時候我們將時間初始化為未觸發狀態,然后當線程完成初始化工作的時候觸發事件。此時,另一個線程一直在等待該事件,它發現事件被觸發,于是變成可調度狀態,第二個線程知道第一個線程已經完成了他的工作。
HANDLE?CreateEvent(??LPSECURITY_ATTRIBUTES?lpEventAttributes,//?安全屬性??BOOLb?ManualReset,//?復位方式??BOOLb?InitialState,//?初始狀態??LPCTSTR?lpName?//?對象名稱?? );??參數bManualReset是一個布爾值,用來告訴系統應該創建一個手動重置時間(TRUE)還是一個自動重置時間(FALSE)。
參數bInitialState表示應該事件初始化為觸發狀態(TRUE)還是未觸發狀態(FALSE)。
當系統插件事件對象之后,返回一個事件內核對象。
還有一個是CreateEvent的增強版CreateEventEx。
其他進程中的線程可以通過多種方式來訪問該事件對象,這包括調用CreateEvent并在pszName參數中傳入相同的值,使用繼承,使用DuplicateHandle函數或者調用OpenEvent并在pszName參數指定與CreateEvent中相同的名字:
HANDLE?OpenEvent(????DWORD?dwDesiredAccess,????BOOL?bInherit,????PCTSTR?pszName?? );????一旦我們不需要事件內核對象的時候調用closehandlel來關閉。通過調用SetEvent可以直接控制它的狀態,變成觸發狀態,使用ResetEvent使得事件變成未觸發狀態。BOOL?SetEvent(HANDLE?hEvent);?? BOOL?ResetEvent(HANDLE?hEvent);????
簡單的例子
HANDLE?g_hEvent;???? int?main()????{????g_hEvent=CreateEvent(NULL,true,false,NULL);????HANDLE?hThread=CreateThread????NULL,0,Thread1,NULL,0,NULL);????//打開文件并讀取內存。????SetEvent(g_hEvent);//通知Thread1開始運行。????//其他操縱。????}????DWORD?WINAPI?Thread1(PVOID?param)????{????WatiForSingleObject(g_hEvent,INFINITE);????//訪問內存。????ResetEvent(g_hEvent);????}????
總結
以上是生活随笔為你收集整理的事件内核对象 CreateEvent的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HTML中字体的垂直排列
- 下一篇: vs下使用qt设置应用程序的图标