事件是乙個動作——使用者觸發的動作。訊息是乙個資訊——傳遞給系統的資訊。
事件就是「當....的時候」,事件總是和乙個id有關上面的例子是工作者執行緒向使用者介面執行緒傳送訊息,對於工作者執行緒,如果它的設計模式也是訊息驅動的,那麼呼叫者可以向它傳送初始化、退出、執行某種特定的處理等訊息,讓它在後台完成。在控制函式中可以直接使用::getmessage()這個sdk函式進行訊息分檢和處理,自己實現乙個訊息迴圈。getmessage()函式在判斷該執行緒的訊息隊列為空時,執行緒將系統分配給它的時間片讓給其它執行緒,不無效的占用cpu的時間,如果訊息佇列不為空,就獲取這個訊息,判斷這個訊息的內容並進行相應的處理。訊息就是「嗨!你該幹....了」
,vs2005以上的「訊息」標籤中就是vc6 windows messages handler中的內容
我們一般都是在 "當...的時候" 幹 ***0 或者 ***1 ***2 .... 也可以 「這件事情我不想理會」(讓windows去幹)。 我們也可能在正幹***n中突然想起: 「嗨!我該晚餐了!」 再附上不經典的描述:事件是乙個動作——使用者觸發的動作。 訊息是乙個資訊——傳遞給系統的資訊。
事件與訊息的概念在計算機中較易混淆,但本質不同: 事件由使用者(操作電腦的人)觸發且只能由使用者觸發,作業系統能夠感覺到由使用者觸發的事件,並將此事件轉換為乙個(特定的)訊息傳送到程式的訊息佇列中。 這裡強調的是: 可以說「使用者觸發了乙個事件」,而不能說「使用者觸發了乙個訊息」。 使用者只能觸發事件,而事件只能由使用者觸發。 乙個事件產生後,將被作業系統轉換為乙個訊息,所以乙個訊息可能是由乙個事件轉換而來(或者由作業系統產生)。 乙個訊息可能會產生另乙個訊息,但乙個訊息決不能產生乙個事件——時間只能由使用者觸發。
事件:只能由使用者通過外設的輸入產生。
(一) 利用使用者定義的訊息通訊
在windows程式設計中,應用程式的每乙個執行緒都擁有自己的訊息佇列,甚至工作執行緒也不例外,這樣一來,就使得執行緒之間利用訊息來傳遞資訊就變的非常簡單。首先使用者要定義乙個使用者訊息,如下所示:
#define wm_usermsg wmuser+100;在需要的時候,在乙個執行緒中呼叫::postmessage((hwnd)param,wm_usermsg,0,0)或cwinthread::postthradmessage()來向另外乙個執行緒傳送這個訊息,上述函式的四個引數分別是訊息將要傳送到的目的視窗的控制代碼、要傳送的訊息標誌符、訊息的引數wparam和lparam。
uint threadfunction(lpvoid pparam)
::postmessage(hwnd,wm_usermsg,0,0);
return 0;
}wm_usermsg訊息的響應函式為onthreadended(wparam wparam,lparam lparam)
long ctestview::onthreadended(wparam wparam,lparam lparam)
(二)用事件物件實現通訊
cevent threadstart ,threadend;
uint threadfunction(lpvoid pparam)
::postmessage(hwnd,wm_usermsg,0,0);
return 0;
}void ctestview::oninitialupdate()
void ctestview::ondestroy()
訊息與事件的區別
我們通常說 某一件事發生了 和 向什麼傳送某乙個訊息 比如在桌面上單擊滑鼠時,某一件事發生了,windows首先知道這件事的發生,然後使用函式sendmessage向桌面傳送乙個訊息,證明有某件事發生了。這就是 事件驅動 訊息處理 的原理。事件是乙個動作 使用者觸發的動作。訊息是乙個資訊 傳遞給系統...
vc 訊息與事件的區別
事件是乙個動作 使用者觸發的動作。訊息是乙個資訊 傳遞給系統的資訊。事件與訊息的概念在計算機中較易混淆,但本質不同 事件由使用者 操作電腦的人 觸發且只能由使用者觸發,作業系統能夠感覺到由使用者觸發的事件,並將此事件轉換為乙個 特定的 訊息傳送到程式的訊息佇列中。這裡強調的是 可以說 使用者觸發了乙...
委託和事件的區別
首先,我們知道委託和事件都可以用來呼叫跟自己方法簽名一樣的方法。容易混淆大家的地方大多在於這兩者之間的區別。從我們使用委託delegate和事件event上的主要有兩大區別 如表1所示 表1 委託和事件的區別 序號區別 委託事件 1是否可以使用 來賦值是否 2是否可以在類外部進行呼叫是否 3是否是乙...