事件和消息的通信机制
2010-01-26 08:22
162 查看
(一) 利用用户定义的消息
通信
在Windows程序设计中,应用程序的每一个线程都拥有自己的消息
队列,甚至工作线程也不例外,这样一来,就使得线程之间利用消息
来传递信息就变的非常简单。首先用户要定义一个用户消息
,
如下所示:#define WM_USERMSG
WMUSER+100;在需要的时候,在一个线程中调用::PostMessage((HWND)param,WM_USERMSG,0,0)或
CwinThread::PostThradMessage()来向另外一个线程发送这个消息
,上述函数的四个参数分别是消息
将要发送到的目的窗口的句柄、要发送的消息
标志符、消息
的参数WPARAM和LPARAM。下面的代码的结果是在线程结束时显示一个对话框,提示线程结束:
上面的例子是工作者线程向用户界面线程发送消息
,对于工作者线程,如果它的设计模式也是消息
驱动的,那么调用者可以向它发送初始化、退出、执行某种特定的处理等消息
,让它在后台完成。在控制函数中可以直接使用::GetMessage()这个SDK函数进行消息
分检和处理,自己实现一个消息
循环。GetMessage()函数在判断该线程的消息
队列为空时,线程将系统分配给它的时间片让给其它线程,不无效的占用CPU的时间,如果消息
队列不为空,就获取这个消息
,判断这个消息
的内容并进行相应的处理。
(二)用事件
对象实现通信
在线程之间传递信号进行通信比较复杂的方法是使用事件
对象,用MFC的Cevent类的对象来表示。事件
对象处于两种状态之一:有信号和无信号,线程可以监视处于有信号状态的事件
,以便在适当的时候执行对事件
的操作。上述例子代码修改如下:
通信
在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); delete pThread; Cview::OnDestroy(); }
相关文章推荐
- Flex事件机制学习-自定义事件实现类间通信
- Android的消息机制,用Android线程间通信的Message机制,Android中Handler的使用方法
- 事件驱动机制和消息循环
- Qt消息机制和事件(二)
- PHP的消息通信机制测试实例
- [iPhone开发]消息通信机制NSNotificationCenter
- 消息通信机制NSNotificationCenter
- IOS开发笔记-消息通信机制NSNotificationCenter
- 利用消息机制实现进程通信
- 事件和消息机制的理解
- Android的消息机制,用Android线程间通信的Message机制,Android中Handler的使用方法——在子线程中更新界面,handler机制
- 安卓事件处理---Handler消息处理机制
- 进程通信-消息机制 .
- 谈一谈JS消息机制和事件机制的理解
- 模拟EventCenter,flash自带的事件机制的一个解耦框架,callback回调方式用于模块之间的通信
- 在Unity中使用事件/委托机制(event/delegate)进行GameObject之间的通信
- Win32基于事件驱动的消息机制(ZZ)
- 事件处理机制之Handler消息传递机制浅析
- Cocos2d-x v3.x 的事件派发机制(消息处理机制CCNotificationCenter)
- OpenStack建立实例完整过程源码详细分析(12)----依据AMQP通信架构实现消息发送机制解析之一