//事件和互斥體的區別在於,互斥體創建即爲已通知狀態,而事件初始狀態可以設置,即第三個參數
//第二個參數如果爲TRUE,事件被捕捉後,需要自己調用ResetEvent將事件標記爲未通知,如果爲False,會自動調用ResetEvent將事件標記爲未通知
//
1、事件對象的創建
HANDLE CreateEvent(
LPSECURITY_ATTRIBUTES lpEventAttributes, // 安全屬性 NULL時爲系統默認
BOOL bManualReset, // TRUE 通過調用ResetEvent將事件對象標記爲未通知
BOOL bInitialState, // TRUE 已通知狀態 FALSE未通知狀態
LPCTSTR lpName // 對象名稱 以NULL結尾的字符串
);
2、事件對象的控制
BOOL SetEvent(HANDLE hEvent); //將對象設置爲已通知
3、關閉時間對象句柄
//關閉句柄
CloseHandle();
4、線程控制實驗:只讀形式的線程控制
HANDLE g_hEvent;
HWND hEdit1;
HWND hEdit2;
HWND hEdit3;
HWND hEdit4;
HANDLE hThread1;
HANDLE hThread2;
HANDLE hThread3;
HANDLE hThread4;
DWORD WINAPI ThreadProc1(LPVOID lpParameter)
{
//創建事件
//默認安全屬性 手動設置未通知狀態(TRUE) 初始狀態未通知 沒有名字
g_hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
HANDLE hThread[3];
//創建3個線程
hThread[0] = ::CreateThread(NULL, 0, ThreadProc2, NULL, 0, NULL);
hThread[1] = ::CreateThread(NULL, 0, ThreadProc3, NULL, 0, NULL);
hThread[2] = ::CreateThread(NULL, 0, ThreadProc4, NULL, 0, NULL);
//設置文本框的值
SetWindowText(hEdit1,"1000");
//設置事件爲已通知
SetEvent(g_hEvent);
//等待線程結束 銷燬內核對象
WaitForMultipleObjects(3, hThread, TRUE, INFINITE);
CloseHandle(hThread[0]);
CloseHandle(hThread[1]);
CloseHandle(hThread[2]);
CloseHandle(g_hEvent);
return 0;
}
DWORD WINAPI ThreadProc2(LPVOID lpParameter)
{
TCHAR szBuffer[10] = {0};
//當事件變成已通知時
WaitForSingleObject(g_hEvent, INFINITE);
//讀取內容
GetWindowText(hEdit1,szBuffer,10);
SetWindowText(hEdit2,szBuffer);
return 0;
}
DWORD WINAPI ThreadProc3(LPVOID lpParameter)
{
TCHAR szBuffer[10] = {0};
//當事件變成已通知時
WaitForSingleObject(g_hEvent, INFINITE);
//讀取內容
GetWindowText(hEdit1,szBuffer,10);
SetWindowText(hEdit3,szBuffer);
return 0;
}
DWORD WINAPI ThreadProc4(LPVOID lpParameter)
{
TCHAR szBuffer[10] = {0};
//當事件變成已通知時
WaitForSingleObject(g_hEvent, INFINITE);
//讀取內容
GetWindowText(hEdit1,szBuffer,10);
SetWindowText(hEdit4,szBuffer);
return 0;
}
事件
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.