?? ex.txt
字號:
上一課中我們演示了如何用WINDOWS消息在不同的線程之間進行通訊。另外的兩種,即:使用全局變量和事件對象,將在本課中講解。
事件對象就像一個開關:它只有兩種狀態---開和關。當一個事件處于”開”狀態,我們稱其為”有信號”否則稱為”無信號”。您可以在一個線程的執行函數中創建一個事件對象,然后觀察它的狀態,如果是”無信號”就讓該線程睡眠,這樣該線程占用的CPU時間就比較少。
產生事件對象的函數如下:
CreateEvent proto lpEventAttributes:DWORD,\
bManualReset:DWORD,\
bInitialState:DWORD,\
lpName:DWORD
lpEventAttribute--> 如果是NULL值,產生的事件對象有缺省的安全屬性。
bManualReset--> 如果想在每次調用WaitForSingleObject 后讓WINDOWS為您自動地把事件地狀態恢復為”無信號”狀態,必須把該參數設為FALSE,否則,您必須每次調用ResetEvent函數來清除事件的信號。
bInitialState--> 剛剛產生事件對象時的狀態。如果設為TRUE是”有信號”,否則是”無信號”。
lpName --> 事件對象的名稱。您在OpenEvent函數中可能使用。
如果CreateEvent調用成功的話,會返回新生成的對象的句柄,否則返回NULL。
這里有兩個API函數用來修改事件對象的信號狀態:SetEvent和ResetEvent。前者把事件對象設為”有信號”狀態,而后者正好相反。
在事件對象生成后,必須調用WaitForSingleObject來讓線程進入等待狀態,該函數的語法如下:
WaitForSingleObject proto hObject:DWORD, dwTimeout:DWORD
hObject -->指向同步對象的指針。事件對象其實是同步對象的一種。
dwTimeout --> 等待同步對象變成”有信號”前等待的時間,以毫秒計。當等待的時間超過該值后無信號同步對象仍處于”無信號”狀態,線程不再等待,WaitForSingleObject函數會返回。如果想要線程一直等待,請把該參數設為INFINITE(該值等于0xffffffff)。
例子:
下面的例子顯示了一個窗口,當用戶選擇了菜單項”run thread”后,線程開始簡單的計數運算。結束后彈出一個對話框通知用戶。在整個的計數期間,您可以選擇菜單項”stop thread”來隨時終止線程。
void InitializeCriticalSection ( LPCRITICAL_SECTION );
void EnterCriticalSection ( LPCRITICAL_SECTION );
void LeaveCriticalSection ( LPCRITICAL_SECTION );
void DeleteCriticalSection ( LPCRITICAL_SECTION );
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -