精華區beta NUU_CSIE 關於我們 聯絡資訊
剛考完期末考,所以有空來把剩下的打完 上次沒有把HandleEvent講完 其實,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