首先要明确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++解惑相关推荐

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

    首先要明确VC++中使用消息映射技术处理"消息"和"事件" ,通过DECLARE_MESSAGE_MAP()等宏通杀 事件就是"当....的时候&qu ...

  2. vc 消息与事件的区别

    事件是一个动作--用户触发的动作.    消息是一个信息--传递给系统的信息.            事件与消息的概念在计算机中较易混淆,但本质不同:            事件由用户(操作电脑的人) ...

  3. 阿里云消息队列 RocketMQ 5.0 全新升级:消息、事件、流融合处理平台

    从"消息"到"消息.事件.流"的大融合 消息队列作为当代应用的通信基础设施,微服务架构应用的核心依赖,通过异步解耦能力让用户更高效地构建分布式.高性能.弹性健壮 ...

  4. 云栖发布|阿里云消息队列 RocketMQ 5.0:消息、事件、流融合处理平台

    简介:RocketMQ5.0 的发布标志着阿里云消息正式从消息领域正式迈向了"消息.事件.流"场景大融合的新局面. 引言:从"消息"到"消息.事件.流 ...

  5. 临界区,互斥量,信号量,事件的区别

    临界区(Critical section)与互斥体(Mutex)的区别 1.临界区只能用于对象在同一进程里线程间的互斥访问:互斥体可以用于对象进程间或线程间的互斥访问. 2.临界区是非内核对象,只在用 ...

  6. 微信自定义菜单以及消息and事件通知

    1.微信如果开启服务那么消息和事件通知(包括菜单)都会转到微信公众号后台配置的服务器URL. 微信请求的消息结构参考: <xml><ToUserName><![CDATA ...

  7. onchange onpropertychange 和oninput事件的区别

    汇总onchange onpropertychange 和oninput事件的区别: 1.onchange事件与onpropertychange事件的区别:  onchange事件在内容改变(两次内容 ...

  8. C#开发微信门户及应用(21)-微信企业号的消息和事件的接收处理及解密

    在上篇随笔<C#开发微信门户及应用(19)-微信企业号的消息发送(文本.图片.文件.语音.视频.图文消息等)>介绍了有关企业号的消息发送,官方特别声明消息是不用加密发送的.但是在回调的服务 ...

  9. 你知道socket.io中connect事件和connection事件的区别吗?

    server端的socket.io中有两个连接事件.一个是.on('connect'),一个是.on('connection'). 官网上没有对这两个事件的区别进行解释. 那么这两个事件有什么区别呢? ...

最新文章

  1. 参加微软新技术预览大会
  2. java spring怎么运行_java – 如何使用spring异步运行方法?
  3. iOS Provisioning Portal概述
  4. android使用ImageLoader实现图片缓存(安卓开发必备)
  5. c# OpenRead 请求被中止: 未能创建 SSL/TLS 安全通道。
  6. [笔记][mooc]《程序设计入门—C语言》
  7. c语言判断这天是星期几,【求指导!!】输入年,月,日,然后判断这天是星期几!!!!!...
  8. 【英语学习】【Level 07】U03 Amazing wonders L3 A pearl of East Asia
  9. Mysql的master,slave的配置
  10. html5游戏开发--动静结合(二)-用地图块拼成大地图 初探lufylegend
  11. CMD attrib命令详解
  12. css border 圆角气泡案例
  13. SQL Server 默认跟踪应用4 -- 检测日志文件自动增长
  14. OAM 与 KubeVela 项目整体捐赠进入 CNCF,让云端应用交付更加简单
  15. 计算机网络习题集_主打选择填空
  16. [python案例]金融知识图谱构建流程
  17. 色彩管理实验 matlab,EFI色彩管理实验指导手册.doc
  18. 引用百度新闻热门搜索html,百度新闻搜索技巧(之一)
  19. 用计算机谈狂狼,抖音狂狼原唱是谁 抖音狂狼完整版歌词
  20. FPGA数字信号处理(十八)Quartus CIC IP核实现

热门文章

  1. c语言char数字转int补位,关于char强制转换成int到底是用0还是用1补位的猜想与检验...
  2. 20211003 矩阵的值域(列空间)和核空间(零空间)
  3. requests模块的入门使用
  4. iptables基本配置方法
  5. MySQL - 日常操作二 备份还原
  6. iOS Safari 中click点击事件失效的解决办法
  7. NOJ---1408----map的运用
  8. hdu1796容斥原理
  9. 物联网带着诚意扑面而来
  10. 一定要搜藏的20个非常有用的PHP类库