CreateEvent行程間同步
??CreateEvent可以創建或是打開一個命名或是未命名的event物件,
HANDLE CreateEvent(
??LPSECURITY_ATTRIBUTES lpEventAttributes**,** // pointer to security attributes ??BOOL bManualReset**,** // flag for manual-reset event ??BOOL bInitialState**,** // flag for initial state ??LPCTSTR lpName // pointer to event-object name );
??LPSECURITY_ATTRIBUTES結構體用于創建物件的訪問控制屬性的,為NULL的話則使用默認的安全描述符,并且物件可被子行程繼承,
??bManualReset引數為TRUE時,被創建物件需要手動呼叫ResetEvent函式恢復為__非信號態__(即不可回應);如果為FALSE,event物件在回應等待執行緒后自動恢復成非信號態,
??bInitialState引數為TRUE時,被創建的物件初始狀態為__信號態__(可回應);否則為非信號態,
??lpName引數為event物件名,長度不超過MAX_PATH,字符敏感;如果為NULL,則創建未命名物件,
??現在測驗一下如何實作行程間同步,
#include "stdio.h"
#include "Windows.h"
int main() {
HANDLE hEvtObj = NULL;
DWORD hRet = NULL;
CHAR objName[] = { "ObjTestEvt_123" };
if (hEvtObj = CreateEventA(
NULL,
TRUE, // 手動重置為非信號態
FALSE, // 初始不可回應
objName))
{
if (ERROR_ALREADY_EXISTS == GetLastError()) { // 事件物件已存在
printf("Event Obj \"%s\" has EXISTED ...\n", objName);
for (int i = 0; i < 10;) { // 回應10次
hRet = WaitForSingleObject(hEvtObj, 300); // 超時時間為0.3秒
if (!hRet) {
printf("\"%s\" is now SIGNALED %d\n", objName, i++); // 信號態
}
else {
if (WAIT_TIMEOUT == hRet)
printf("\"%s\" is now NONSIGNALED\n", objName); // 非信號態
else
printf("Wait Error %#x...\n", GetLastError());
}
Sleep(1000); // 休眠一秒
}
}
else { // 成功創建事件物件
printf("Create Evt Obj \"%s\" Successful\n", objName);
Sleep(1000); // 等待同步行程運行
printf("Set Event \"%s\" To SIGNALED for 4 seconds...\n", objName);
SetEvent(hEvtObj); // 設定為事件物件為信號態
Sleep(4000); // 休眠4s
printf("Reset Event \"%s\" To NONSIGNALED for 4 seconds...\n", objName);
ResetEvent(hEvtObj); // 設定為非信號態
Sleep(4000); // 讓事件物件處于非信號態4s
printf("Set Event \"%s\" To SIGNALED...\n", objName);
SetEvent(hEvtObj); //
}
CloseHandle(hEvtObj);
hEvtObj = NULL;
}
else { // 創建失敗
printf("CreateEvent Error = %#x", GetLastError());
}
return 0;
}
??除了行程間,執行緒也可使用這種方式,
??參考:CreateEvent
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/38521.html
標籤:C++
下一篇:P5727 冰雹猜想
