事件和消息的区别 - VC框架

在MFC中如何自定义消息及相应事件(VC6.0及VS2005) 首先是VS2005这个开发环境: 自定义消息的步骤如下:(1)建立Single Document的MFC Application,工程名为:MyMessage(2)自定义消息:第一步:定义消息在Resource.h中添加如下代码: //推荐用户自定义消息至少是WM_USER+100,因为很多新控件也要使用WM_USER消息。#define WM_MY_MESSAGE (WM_USER+1 阅读详情

转自:http://hi.baidu.com/mabingjsp/item/137ff644d3e8f3e4bdf45138


事件和消息的区别 - VC框架 
[ 2010/2/5 11:51:48 | Author: 清池浮木 ]
http://www.youkuaiyun.com/develop/article/11/11237.shtm       
标题           回调函数、消息和事件例程         xiaoran(原作)     
        
关键字           回调,消息,事件     
    
回调函数、消息和事件例程   
    
          调用(calling)机制从汇编时代起已经大量使用:准备一段现成的代码,调用者可以随时跳转至此段代码的起始地址,执行完后再返回跳转时的后续地址。CPU为此准备了现成的调用指令,调用时可以压栈保护现场,调用结束后从堆栈中弹出现场地址,以便自动返回。借堆栈保护现场真是一项绝妙的发明,它使调用者和被调者可以互不相识,于是才有了后来的函数和构件,使吾辈编程者如此轻松愉快。若评选对人类影响最大之发明,在火与车轮之后,笔者当推压栈调用。   
          话虽这样说,此调用机制并非完美。回调函数就是一例。函数之类本是为调用者准备的美餐,其烹制者应对食客了如指掌,但实情并非如此。例如,写一个快速排序函数供他人调用,其中必包含比较大小。麻烦来了:此时并不知要比较的是何类数据--整数、浮点数、字符串?于是只好为每类数据制作一个不同的排序函数。更通行的办法是在函数参数中列一个回调函数地址,并通知调用者:君需自己准备一个比较函数,其中包含两个指针类参数,函数要比较此二指针所指数据之大小,并由函数返回值说明比较结果。排序函数借此调用者提供的函数来比较大小,借指针传递参数,可以全然不管所比较的数据类型。被调用者回头调用调用者的函数(够咬嘴的),故称其为回调(callback)。   
          回调函数使程序结构乱了许多。Windows   API   函数集中有不少回调函数,尽管有详尽说明,仍使初学者一头雾水。恐怕这也是无奈之举。无论何种事物,能以树形结构单向描述毕竟让人舒服些。如果某家族中孙辈又是某祖辈的祖辈,恐怕无人能理清其中的头绪。但数据处理之复杂往往需要构成网状结构,非简单的客户/服务器关系能穷尽。   
          Windows   系统还包含着另一种更为广泛的回调机制,即消息机制。消息本是   Windows   的基本控制手段,乍看与函数调用无关,其实是一种变相的函数调用。发送消息的目的是通知收方运行一段预先准备好的代码,相当于调用一个函数。消息所附带的   WParam   和   LParam   相当于函数的参数,只不过比普通参数更通用一些。应用程序可以主动发送消息,更多情况下是坐等   Windows   发送消息。一旦消息进入所属消息队列,便检感兴趣的那些,跳转去执行相应的消息处理代码。操作系统本是为应用程序服务,由应用程序来调用。而应用程序一旦启动,却要反过来等待操作系统的调用。这分明也是一种回调,或者说是一种广义回调。其实,应用程序之间也可以形成这种回调。假如进程   B   收到进程   A   发来的消息,启动了一段代码,其中又向进程   A   发送消息,这就形成了回调。这种回调比较隐蔽,弄不好会搞成递归调用,若缺少终止条件,将会循环不已,直至把程序搞垮。若是故意编写成此递归调用,并设好终止条件,倒是很有意思。但这种程序结构太隐蔽,除非十分必要,还是不用为好。   
          利用消息也可以构成狭义回调。上面所举排序函数一例,可以把回调函数地址换成窗口   handle。如此,当需要比较数据大小时,不是去调用回调函数,而是借   API   函数   SendMessage   向指定窗口发送消息。收到消息方负责比较数据大小,把比较结果通过消息本身的返回值传给消息发送方。所实现的功能与回调函数并无不同。当然,此例中改为消息纯属画蛇添脚,反倒把程序搞得很慢。但其他情况下并非总是如此,特别是需要异步调用时,发送消息是一种不错的选择。假如回调函数中包含文件处理之类的低速处理,调用方等不得,需要把同步调用改为异步调用,去启动一个单独的线程,然后马上执行后续代码,其余的事让线程慢慢去做。一个替代办法是借   API   函数   PostMessage   发送一个异步消息,然后立即执行后续代码。这要比自己搞个线程省事许多,而且更安全。   
          如今我们是活在一个   object   时代。只要与编程有关,无论何事都离不开   object。但   object   并未消除回调,反而把它发扬光大,弄得到处都是,只不过大都以事件(event)的身份出现,镶嵌在某个结构之中,显得更正统,更容易被人接受。应用程序要使用某个构件,总要先弄清构件的属性、方法和事件,然后给构件属性赋值,在适当的时候调用适当的构件方法,还要给事件编写处理例程,以备构件代码来调用。何谓事件?它不过是一个指向事件例程的地址,与回调函数地址没什么区别。   
          不过,此种回调方式比传统回调函数要高明许多。首先,它把让人不太舒服的回调函数变成一种自然而然的处理例程,使编程者顿觉气顺。再者,地址是一个危险的东西,用好了可使程序加速,用不好处处是陷阱,程序随时都会崩溃。现代编程方式总是想法把地址隐藏起来(隐藏比较彻底的如   VB   和   Java),其代价是降低了程序效率。事件例程使编程者无需直接操作地址,但并不会使程序减速。更妙的是,此一改变,本是有损程序结构之奇技怪巧变成一种崭新设计理念,不仅免去被人抨击,而且逼得吾等凡人净手更衣,细细研读,仰慕至今。只是偶然静心思虑,发觉不过一瓶旧酒而已,故引得此番议论,让诸君见笑了


=========================================================
http://topic.youkuaiyun.com/t/20021015/16/1099048.html
事件是一个动作——用户触发的动作。   
消息是一个信息——传递给系统的信息。   
    
  事件与消息的概念在计算机中较易混淆,但本质不同:   
    
  事件由用户(操作电脑的人)触发且只能由用户触发,操作系统能够感觉到由用户触发的事件,并将此事件转换为一个(特定的)消息发送到程序的消息队列中。   
    
  这里强调的是:   
  可以说“用户触发了一个事件”,而不能说“用户触发了一个消息”。   
  用户只能触发事件,而事件只能由用户触发。   
  一个事件产生后,将被操作系统转换为一个消息,所以一个消息可能是由一个事件转换而来(或者由操作系统产生)。   
  一个消息可能会产生另一个消息,但一个消息决不能产生一个事件——时间只能由用户触发。   
    
  总结(事件,消息的来源):   
  事件:只能由用户通过外设的输入产生。   
  消息:(产生消息的来源有三个)   
  (1)   由操作系统产生。   
  (2)   由用户触发的事件转换而来。   
  (3)   由另一个消息产生。


软件架构设计与模式之:消息队列与事件驱动架构 作者:禅与计算机程序设计艺术 1.背景介绍 随着互联网应用的不断增多,软件系统的复杂度和分布式程度也在不断提高。在软件系统中,各个子系统之间需要进行高效、可靠的交互,这就需要一种有效的方式来处理复杂的业务逻辑。消息队列与事件驱动架构正是针对这一需求而诞生的。 阅读详情

相关推荐

回调函数 windows系统的消息与事件

回调函数 windows系统的消息与事件

回调函数、消息和事件例程

回调函数、消息和事件例程    调用(calling)机制从汇编时代起已经大量使用:准备一段现成的代码,调用者可以随时跳转至此段代码的起始地址,执行完后再返回跳转时的后续地址。CPU为此准备了现成的调用指令,调用时可以压栈保护现场,调用结束后从堆栈中弹出现场地址,以便自动返回。借堆栈保护现场真是一项绝妙的发明,它使调用者和被调者可以互不相识,于是才有了后来的函数和构件,使吾辈编程者如此轻松愉快

xiaoran的专栏 5198

告别Vysor!用Scrcpy在Mac上无线投屏安卓手机(附魅族16th闪退修复实战)

本文详细介绍了如何在Mac上配置和使用开源投屏工具Scrcpy,实现安卓手机无线投屏的高效解决方案。从基础环境准备到高级功能调优,包括无线连接配置、输入控制增强、多设备管理和性能优化等实用技巧,特别针对魅族16th等机型的闪退问题提供了修复方案,帮助用户彻底告别Vysor等商业软件。

weixin_28712661的博客 394

利用win32 API和HID设备通信

第一步:获取HID设备的GUID 函数: 第二步:获取设备信息集合 第三步:获取设备接口信息 第四步:获取设备接口详细信息 正确使用方法: 第五步:创建设备 第六步:读写

dididaifly的博客 1078

网络安全面试题

在当今社会网络安全行业越来越发达,也有越来越多的人去学习,为了更好地进行工作,除了学好知识外还要应对企业的面试。 所以在这里我归总了一些网络安全方面的常见面试题,希望对大家有所帮助。 windows常见 1:描述tcp/udp的区别及优劣,及其发展前景 TCP—传输控制协议,提供的是面向连接、可靠的字节流服务。当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能...

fzx_hsaj的博客 6万+

告别Qt Creator?手把手教你用VSCode+MinGW调试QT项目(附完整launch.json配置)

本文详细介绍了如何在VSCode中配置完整的QT开发环境,特别是针对使用MinGW编译器的用户。从环境搭建到调试配置,包括生成.pro文件、Makefile,以及配置task.json和launch.json文件,帮助开发者高效调试QT项目。

weixin_27180827的博客 185

关于c#中的消息处理函数和vc中的消息处理函数区别

 从vc入门编程的,相信大家都很熟悉PreTranslateMessage和WindowProc两个函数,前者是预处理windows发给控件的消息,后者是处理剩余的控件消息。对于PreTranslateMessage函数,一般来说,我们是这样处理控件消息的: BOOL test::PreTranslateMessage(MSG* pMsg) {if(pMsg->hwnd==GetSafeHwnd(

ncucf的专栏 2915

ROS环境下UR机械臂与Realsense相机手眼标定实战指南

本文提供了在ROS环境下,对UR机械臂与Realsense相机进行手眼标定的完整实战指南。详细介绍了从环境搭建、软件包安装、硬件配置到分步数据采集与计算的完整流程,并分享了常见的避坑技巧与精度优化方法,旨在帮助开发者高效、准确地完成标定,为后续的机器人视觉应用奠定坚实基础。

sunny的博客 646

VC中的事件、消息与重写

<br /><br />回调函数、消息和事件例程   <br />    调用(calling)机制从汇编时代起已经大量使用:准备一段现成的代码,调用者可以随时跳转至此段代码的起始地址,执行完后再返回跳转时的后续地址。CPU为此准备了现成的调用指令,调用时可以压栈保护现场,调用结束后从堆栈中弹出现场地址,以便自动返回。借堆栈保护现场真是一项绝妙的发明,它使调用者和被调者可以互不相识,于是才有了后来的函数和构件,使吾辈编程者如此轻松愉快。若评选对人类影响最大之发明,在火与车轮之后,笔者当推压栈调用。   <b

浩男工作室 2925

USB设备识别码VID和PID详解:如何查询和自定义你的设备ID

本文详细解析了USB设备识别码VID和PID的核心作用、查询方法及自定义配置技巧。VID(供应商识别码)和PID(产品识别码)是USB设备的唯一身份证,用于驱动匹配和功能识别。文章提供了Windows和Linux系统下的查询方法,并探讨了如何合法获取和自定义VID/PID,适合硬件开发者和DIY爱好者参考。

weixin_29168675的博客 1438

yolov5 部署jetson nano(通用) 保姆级教学

Jetson nano从配置环境到yolov5成功推理检测全过程 文章目录Jetson nano从配置环境到yolov5成功推理检测全过程一、烧录镜像二、配置环境并成功推理1.更新系统和包2、配置环境2.1 配置CUDA2.2 修改Nano板的显存1.打开终端输入:2.修改nvzramconfig.sh文件:3.重启:4.终端输入:3、安装archiconda(也就是jetson nano板上的anaconda)1.下载地址:2.安装:3.测试conda:4.创建运行yolov5的虚拟环境:5.在conda

weixin_44312422的博客 3万+

VC中的消息

VC中的消息        消息,就是Windows向应用程序发出的通知。事件,就是你对硬件设备的操作。例如,当你单击鼠标、敲击键盘等,这本身就是一个事件的发生,Windows会捕捉到你操作硬件的这些事件,然后会产生对应的消息,并将消息放入消息队列,最后应用程序从消息队列按顺序取走属于自己的消息,将消息和对应函数联系起来。这就是面向对象编程的基本原理。 消息本身是作为一个记录传递给应用程

水上漂的专栏 1440

Windows 11下WSL2安装CUDA避坑指南:从驱动版本匹配到环境变量配置

本文详细解析了在Windows 11的WSL2中搭建CUDA开发环境的完整流程与核心避坑要点。关键在于理解“驱动在Windows,工具链在Linux”的独特架构,并确保显卡驱动与CUDA Toolkit版本严格匹配。指南涵盖了从驱动验证、WSL-Ubuntu专用仓库安装、环境变量配置到GCC版本冲突、GPU算力不匹配等常见问题的解决方案,帮助开发者高效构建稳定的深度学习与高性能计算环境。

smartcontract5的博客 465

vc 消息与事件的区别

事件是一个动作——用户触发的动作。   消息是一个信息——传递给系统的信息。         事件与消息的概念在计算机中较易混淆,但本质不同:         事件由用户(操作电脑的人)触发且只能由用户触发,操作系统能够感觉到由用户触发的事件,并将此事件转换为一个(特定的)消息发送到程序的消息队列中。         这里强调的是:     可以说“用户触发了一个事件”,而不能说“

机器视觉之家 1285

【虚幻引擎UE】UE5 阴影异常与优化

【虚幻引擎UE】UE5 阴影异常与优化解决方案合集

灵境引路人 3万+

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

c#中的消息处理函数和vc中的消息处理函数区别

c#

u011555996的博客 758

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

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

首先要明确VC++中使用消息映射技术处理“消息”和“事件” ,通过DECLARE_MESSAGE_MAP()等宏通杀          事件就是“当....的时候”,事件总是和一个ID有关          消息就是“嗨!你该干....了” ,VS2005以上的“消息”标签中就是VC6 Windows Messages Handler中的内容      我们一般都是在 "当.

Qsir的专栏 3439

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

事件和消息的区别

事件是一个动作——用户触发的动作。 消息是一个信息——传递给系统的信息。 事件就是“当....的时候”,事件总是和一个ID有关         消息就是“嗨!你该干....了” ,VS2005以上的“消息”标签中就是VC6 Windows Messages Handler中的内容     我们一般都是在 "当...的时候" 干 XXX0 或者 XXX1 XXX2 .... 也可以 “这件

dkss0309的博客 2803

深度解析VC中的消息(上)

     摘要:Windows编程和Dos编程,一个很大的区别就是,windows编程是事件驱动,消息传递的。所以,要做好windows编程,必须对消息机制有一个清楚的认识,本文希望能够对消息的传递做一个全面的论述,由于小生初学VC,里面可能有一些错误的地方,还往各位大虾批评、指正。     消息是指什么?     消息系统对于一个win32程序来说十分重要,它是一个程序运行的动力源泉。一个消

hustli的专栏 3403

深度解析VC中的消息(中)

深度解析VC中的消息(中)作者:hustli提交者:eastvc 发布日期:2003-11-18 13:02:54原文出处:http://www.youkuaiyun.com/队列消息和非队列消息   从消息的发送途径来看,消息可以分成2种:队列消息和非队列消息。消息队列由可以分成系统消息队列和线程消息队列。系统消息队列由Windows维护,线程消息队列

gxj1680的专栏 742

VC++事件与消息

消息(Message)就是用于描述某个事件所发生的信息,而事件(Event)则是用户操作应用程序产生的动作或Windows系统自身所产生的动作。事件和消息两者密切相关,事件是原因,消息是结果,事件产生消息,消息对应事件。 首先要明确VC++中使用消息映射技术处理“消息”和“事件” ,通过DECLARE_MESSAGE_MAP()等宏通杀          事件就是“当....的时候”,事件总是

jietu163_1的专栏 1267

vc 消息 事件

事件是一个动作——用户触发的动作。     消息是一个信息——传递给系统的信息。         事件与消息的概念在计算机中较易混淆,但本质不同:         事件由用户(操作电脑的人)触发且只能由用户触发,操作系统能够感觉到由用户触发的事件,并将此事件转换为一个(特定的)消息发送到程序的消息队列中。         这里强调的是:     可以说“用户触发了一个事件”,而不能说“用户触发了一

lchunli的专栏 801
上一篇: 编码总结.
下一篇: C# 获取资源文件中的DLL,调用DLL中的方法
「已注销」
博客等级 码龄14年 116粉丝 43原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值