事件是線程闰挡、進(jìn)程通信上的一個(gè)重要的點(diǎn)涕蜂。
一個(gè)事件有兩種狀態(tài),分別是signaled和nonsignaled皿哨。nonsignaled阻斷線程浅侨,signaled開啟。
它可以阻斷多個(gè)線程证膨,也可以開啟多個(gè)線程:
HANDLE CreateEvent(
LPSECURITY_ATTRIBUTES lpEventAttributes, // 安全屬性
BOOL bManualReset, // 復(fù)位方式
BOOL bInitialState, // 初始狀態(tài), 如果為TRUE如输,初始狀態(tài)為有信號(hào)狀態(tài);否則為無信號(hào)狀態(tài)央勒。
LPCSTR lpName // 對(duì)象名稱
);
手動(dòng)Reset的事件:bManualReset 為true
必須通過ResetEvent顯示將其從將從signaled狀態(tài)變?yōu)閚onsignaled不见。當(dāng)事件狀態(tài)為signaled,所有等待此對(duì)象的線程逐個(gè)被喚醒崔步。
自動(dòng)reset的事件:bManualReset 為false
只要有一個(gè)線程釋放事件稳吮,系統(tǒng)自動(dòng)將狀態(tài)改為nonsignaled。如果有多個(gè)線程在等待井濒,那么只會(huì)喚醒其中一個(gè)線程灶似。
// 設(shè)置signaled狀態(tài)
BOOL SetEvent(
HANDLE hEvent
);
// 設(shè)置nonsignaled狀態(tài)
BOOL ResetEvent(
HANDLE hEvent
);
// 一般用于跨進(jìn)程獲取已經(jīng)創(chuàng)建的事件對(duì)象
HANDLE OpenEventA(
DWORD dwDesiredAccess,
BOOL bInheritHandle,
LPCSTR lpName
);
Demo:
svn://gitee.com/sudaidai/Knowledge_List_of_C
文件夾路徑:WindowsAPI/Event