訊息與事件 Message Event

2021-04-30 17:19:33 字數 2605 閱讀 9196

這兩個的區別我實在是搞得不太清楚,google了一下,也不是太明白,先把各個地方的都貼點過來,個人感覺訊息攜帶有資料,可以從訊息的結構體中獲得一些資料,但是事件就沒有這個功能了:

事件就是「當....的時候」     

訊息就是「嗨!你該幹....了」  

我們一般都是在 "當...的時候" 幹 ***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)

while(!bend) 

beep(100,100); 

sleep(1000);

::postmessage(hwnd,wm_usermsg,0,0); 

return 0;

wm_usermsg訊息的響應函式為onthreadended(wparam wparam,lparam lparam)

long ctestview::onthreadended(wparam wparam,lparam lparam)

上面的例子是工作者執行緒向使用者介面執行緒傳送訊息,對於工作者執行緒,如果它的設計模式也是訊息驅動的,那麼呼叫者可以向它傳送初始化、退出、執行某種特定的處理等訊息,讓它在後台完成。在控制函式中可以直接使用::getmessage()這個sdk函式進行訊息分檢和處理,自己實現乙個訊息迴圈。getmessage()函式在判斷該執行緒的訊息隊列為空時,執行緒將系統分配給它的時間片讓給其它執行緒,不無效的占用cpu的時間,如果訊息佇列不為空,就獲取這個訊息,判斷這個訊息的內容並進行相應的處理。  

(二)用事件物件實現通訊

cevent threadstart ,threadend;

uint threadfunction(lpvoid pparam)

::waitforsingleobject(threadstart.m_hobject,infinite); 

afxmessagebox("thread start."); 

while(!bend) 

beep(100,100); 

sleep(1000); 

int result=::waitforsingleobject(threadend.m_hobject,0);  //等待threadend事件有訊號,無訊號時執行緒在這裡懸停  

if(result==wait_object_0)   

bend=true; 

::postmessage(hwnd,wm_usermsg,0,0);

return 0;

/void ctestview::oninitialupdate()

{  hwnd=getsafehwnd(); 

threadstart.setevent();//threadstart事件有訊號 

pthread=afxbeginthread(threadfunction,hwnd);//啟動執行緒

pthread->m_bautodelete=false;

cview::oninitialupdate);

void ctestview::ondestroy()

{ threadend.setevent();

waitforsingleobject(pthread->m_hthread,infinite); 

d elete pthread;

cview::ondestroy();

MFC事件與訊息

1 首先,什麼是訊息,什麼是事件,兩者是一樣的嗎?顯然,兩者是有區別的,舉個簡單的例子來說 獵人在山中布置了乙個陷阱,一頭野豬掉進陷阱中了。這裡的 野豬掉進陷阱 就是乙個事件,但是這個事件發生時,獵人並不一定知道 獵人不可能一直盯著某個陷阱 如果獵人想要在獵物掉入陷阱中時馬上知道,該這麼做呢?可以這...

WinForm事件與訊息

windows下應用程式的執行是通過訊息驅動的。所有的外部事件,如鍵盤輸入 滑鼠移動 按動滑鼠都由os系統轉換成相應的 訊息 進入到應用程式的訊息佇列中,由應用程式引擎輪詢處理。在c 中,訊息被應用程式的工作引擎通過輪詢等方式遍歷獲取並按照訊息的型別逐個分發到對應的元件 例如窗體 按鈕等 最後呼叫對...

訊息與事件的區別

我們通常說 某一件事發生了 和 向什麼傳送某乙個訊息 比如在桌面上單擊滑鼠時,某一件事發生了,windows首先知道這件事的發生,然後使用函式sendmessage向桌面傳送乙個訊息,證明有某件事發生了。這就是 事件驅動 訊息處理 的原理。事件是乙個動作 使用者觸發的動作。訊息是乙個資訊 傳遞給系統...