作者godman362 (青)
看板NUU_CSIE
標題[筆記] WinAPI Thread & Event (2)
時間Sun Jun 21 19:22:56 2009
剛考完期末考,所以有空來把剩下的打完
上次沒有把
Handle和
Event講完
其實,Handle就是
void *
這個就可能要翻一下header file了,這個就自己去找吧
所以他的用途就很廣
但是相對地,
很廣就很複雜,很複雜就很容易用錯(
至理名言)
上次提到的,有一個部份有點小問題
就是我說CreateThread回傳的東西,可以用來管理Thread
這句話其實是有點小問題的
這句話應該改成:「
可以藉由回傳的東西,來確認Thread是否開啟」
而不是管理Thread的起始,起動是由CreateThread函數
結束則是靠我們宣告的ThreadID去處理,
所以他回傳的東西和管理無關
好,接著來講
Event
Event是什麼東西?就中文的翻譯來說,叫「事件」
那事件是做什麼用途的?事件是某個物件被觸發了某個動作
而該
動作要有相對應的處理方式,而那個處理方式就是事件要做的事情
但是在WinAPI中很特別,他的Event並不是一個Function Point
(
C#中則是前面所述的那種)
不會因為觸發後,然後去執行某個函數
他的感覺比較類似於
Flag(旗標)
Flag就是設立之後,有其他地方會來檢查這個Flag是否被設立
藉此來判斷是否應該執行某動作
以下,先來看一下CreateEvent函數的參數內容:
HANDLE CreateEvent(
LPSECURITY_ATTRIBUTES IpEventAttributes,
BOOL bManuaIReset,
BOOL bInitialState,
LPCTSTR IpName
);
參數
IpEventAttributes 安全防護性
NULL表示使用預設屬性
此屬性Windows95會被忽略。
bManualRest
如為FALSE,表示這個event將在變成激發狀態
態的event重置為非激發狀態。
(因而喚醒一個執行緒)之後,自動重置reset)為
非激發狀態。如果是TRUE,表示不會自動重置,
必防護屬性。NU比表示使用預設屬性。此屬性
須靠程式動作(呼叫ResetEvent())才能將激發狀
bIntialState
如為TRUE,表示這個event一開始處於激發狀
態。如為FALSE,表示這個event一開始處於非
激發狀
lpName
Event物件的名稱。任何執行緒或行程都可以根據
這個文字名稱,使用此一event物件。
以下,再來看個如何使用的例子:
HANDLE EventHandle;
EventHandle = CreateEvent(NULL, FALSE, FALSE, "Test");
而EventHandle這個東西,就是可以用來等待某事件的觸發
而觸發的方式,則是利用:
SetEvent(EventHandle);
這樣代表這個Event被觸發,表示應該要執行某動作
重點是,要檢查這個Event應該沒辦法在主程式中做infinite loop,對吧?
如果你這樣做了,
假設這個Event一直都沒被觸發,你的程式也跟著一起自殺不是嗎
所以,這也是為什麼我把Thread提出來講得原因
這樣應該知道該怎麼做了吧,下面就不多做提示了
講得太明白,就失去了
思考的意義
Thread和Event就講到這邊了,有機會下次見,拜拜。
媽的,惡靈古堡四的電鋸鄉民真是機車。
--
要
感謝的人太多了,那就
謝天吧
要
改得程式碼太多了,那就
改天吧
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 122.118.41.49