嵌入式开发-消息机制.pdfVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
消息机制 一、消息管理器设计 采用的队列是顺序表示(即数组表示)的循环队列,循环队列的好处是可以充分的利用 队列的空间。消息包含了一定的信息,为了实现消息结构的尽可能的通用性,设计了如下的 消息结构: typedef struct { union { const void* p; //消息中附带的数据 int v; } data; myGUI_Handle hObjDst; //接收消息的目标对象 myGUI_Handle hObjSrc; U16 msgId; //消息类型号 }myGUI_Msg; 其中,msgId 表示的是消息的类型,比如 MSG_TOUCH_STATE_DOWN 表示触摸屏被 触摸(按下) ,MSG_SHOW 表示显示窗体的消息等;hWinDst 则表示接收并处理消息的目标 窗体;hObjSrc 表示发送消息的对象;data 字段是一个联合体,其成员包含一个 void*类型的 指针 p 和一个 int 型的变量 v ,通过它们可以用来传递消息所包含的数据。 定义好消息结构以后,定义消息队列控制结构了,如下: #define MSG_QUEUE_LEN 300 // 预定义消息队列的长度 Q_DEFINE(myGUI_Msg, msgQueue, MSG_QUEUE_LEN) msgQueue;// 消息队列 其中 MSG_QUEUE_LEN 指定了消息队列的长度。 消息队列的控制结构是一个队列“模板“ 。因为队列结构在其他地方(如键盘的键码队列) 也要用到,所以设计了队列模板(利用宏替换技术实现)。 #define Q_TYPE(_T) struct Queue_##_T #define Q_DEFINE(ET, queue, len) \ ET qBuf##queue[len]; \ int qBufLen##queue = sizeof(ET)*len; \ Q_TYPE(ET)\ { \ ET* pElems; \ int front, rear, size; \ int maxSize; \ } 参数的含义: ET :队列中元素的类型。 queue :队列名字。 len :队列的长度。 把队列的元素类型定义为消息结构类型,front 表示队头索引,rear 表示队尾索引,len 表示当前有效消息的个数,maxSize 表示队列的总长度。 定义好队列控制结构,还需要一个真正的队列(数组)来存放消息,因此定义该数组为: ET qBuf##queue[len]; 其中 len 是预定义的消息队列支持的总长度。 消息队列的数据结构定义好后就可以对消息进行管理了,包括消息队列的初始化,消息 入队列,消息出队列,判断消息队列是否为空,发送消息,消息派送等操作。 消息队列的初始化,主要是将队列控制结构初始化,包括设置 pElems,使其指向消息 数组,初始化 front、rear、len、maxSize 等。 另外,发送消息实际上就是将消息入队,而消息派送则是将消息真正的发给处理它的窗 体或控件来处理。 二、消息管理的过程 应用程序进入循环以后,系统开始执行,在这个过程中,由于某些原因产生并发送了消 息(主要包括:触摸屏按下抬起消息,退出系统消息,重画控件消息,控件获得失去焦点消 息,按键消息,窗体移动消息,窗体显示隐藏消息,用户自定义消息等),这些消息先被寄 存在消息队列中。一旦触发消息处理函数,该函数将对本次收集的消息进行一次集中处理, 直到消息队列空为止。如果有需要,可以在任意的地方手动触发消息处理函数,这样可以及 时的处理需要处理的消息,提高效率。 三、消息处理流程设计 1)键盘消息 首先,键盘驱动程序接收键码(键码中包含实际键码和按下放开信息),并将其保存在 一个队列中。GUI 内核执行一个循环,每次循环都到键盘队列中获取键码。将获取到的键码 作为消息的内容封装在按键消息中,把这个消息发送给当前的活动

文档评论(0)

kolr + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档