- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 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 内核执行一个循环,每次循环都到键盘队列中获取键码。将获取到的键码
作为消息的内容封装在按键消息中,把这个消息发送给当前的活动
您可能关注的文档
- 嵌入式开发-stm32 总结.docx
- 嵌入式开发-STM32Cube.pdf
- 嵌入式开发-T9输入法.doc
- 嵌入式开发-TTL与CMOS电平 OC门介绍.pdf
- 嵌入式开发-UC-8410-8416-8418-8430产品介绍.pdf
- 嵌入式开发-uCGUI学习笔记——内存管理.pdf
- 嵌入式开发-uCOS-II源码详解.docx
- 嵌入式开发-USB教程.doc
- 嵌入式开发-ucosII任哲高清析版 (1).pdf
- 嵌入式开发-VxWorks操作系统指南(中文).doc
- 嵌入式开发-中文AT指令集.pdf
- 嵌入式开发-AVR单片机课件-第1章 单片嵌入式系统概述.doc
- 嵌入式开发-AVR单片机课件-第3章 AVR的指令与汇编系统.doc
- 嵌入式开发-AVR单片机课件-第2章 AVR单片机的基本结构.doc
- 嵌入式开发-AVR单片机课件-第4章 AVR单片机系统设计与开发工具.doc
- 嵌入式开发-AVR单片机课件-第5章 实战练习一.doc
- 嵌入式开发-AVR单片机课件-第6章 通用IO接口基本结构与输出应用.doc
- 嵌入式开发-AVR单片机课件-第9章 键盘输入接口与状态机编程.doc
- 嵌入式开发-AVR单片机课件-第10章 模拟比较器和ADC接口.doc
- 嵌入式开发-AVR单片机课件-第11章 实战练习二.doc
文档评论(0)