日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

消息和事件的区别 VC++解惑

發布時間:2025/3/12 c/c++ 14 豆豆
生活随笔 收集整理的這篇文章主要介紹了 消息和事件的区别 VC++解惑 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
首先要明確VC++中使用消息映射技術處理“消息”和“事件” ,通過DECLARE_MESSAGE_MAP()等宏通殺 ? ?

?? ??事件就是“當....的時候”,事件總是和一個ID有關 ? ?

??? ?消息就是“嗨!你該干....了”?VS2005以上的“消息”標簽中就是VC6 Windows Messages Handler中的內容

???? 我們一般都是在 "當...的時候" 干 XXX0 或者 XXX1 XXX2 .... 也可以 “這件事情我不想理會”(讓Windows去干)。 我們也可能在正干XXXn中突然想起: “嗨!我該晚餐了!” 再附上不經典的描述:事件是一個動作——用戶觸發的動作。 消息是一個信息——傳遞給系統的信息。?事件與消息的概念在計算機中較易混淆,但本質不同: 事件由用戶(操作電腦的人)觸發且只能由用戶觸發,操作系統能夠感覺到由用戶觸發的事件,并將此事件轉換為一個(特定的)消息發送到程序的消息隊列中。 這里強調的是: 可以說“用戶觸發了一個事件”,而不能說“用戶觸發了一個消息”。 用戶只能觸發事件,而事件只能由用戶觸發。 一個事件產生后,將被操作系統轉換為一個消息,所以一個消息可能是由一個事件轉換而來(或者由操作系統產生)。 一個消息可能會產生另一個消息,但一個消息決不能產生一個事件——時間只能由用戶觸發。 ?

?? ? 總結(事件,消息的來源):

??? 事件:只能由用戶通過外設的輸入產生。

??? 消息:(產生消息的來源有三個) (1) 由操作系統產生。 (2) 由用戶觸發的事件轉換而來。 (3) 由另一個消息產生。

(一) 利用用戶定義的消息通信  

?????? 在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)

{ AfxMessageBox("Thread ended."); Retrun 0;}  

??? 上面的例子是工作者線程向用戶界面線程發送消息,對于工作者線程,如果它的設計模式也是消息驅動的,那么調用者可以向它發送初始化、退出、執行某種特定的處理等消息,讓它在后臺完成。在控制函數中可以直接使用::GetMessage()這個SDK函數進行消息分檢和處理,自己實現一個消息循環。GetMessage()函數在判斷該線程的消息隊列為空時,線程將系統分配給它的時間片讓給其它線程,不無效的占用CPU的時間,如果消息隊列不為空,就獲取這個消息,判斷這個消息的內容并進行相應的處理。  

(二)用事件對象實現通信

  在線程之間傳遞信號進行通信比較復雜的方法是使用事件對象,用MFC的Cevent類的對象來表示。事件對象處于兩種狀態之一:有信號和無信號,線程可以監視處于有信號狀態的事件,以便在適當的時候執行對事件的操作。上述例子代碼修改如下:

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();

}

總結

以上是生活随笔為你收集整理的消息和事件的区别 VC++解惑的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。