学习MiniGui之多线程机制_第1页
学习MiniGui之多线程机制_第2页
学习MiniGui之多线程机制_第3页
学习MiniGui之多线程机制_第4页
学习MiniGui之多线程机制_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、学习 MiniGui 之多线程机制MiniGUI 在 2.0 版本之后,有三种运行模式MiniGUI-Threads , MiniGUI-Processes 和 MiniGUI-Standalone 。说这些概念之前,我们先来谈谈另外 一些很重要的概念,或许对理解上述运行模式有所帮助。请 务必耐心看完,因为理论是实践的基础。GUI(Graphical User Interface) :是用户接口 (UI) 的一种,提 供了用户与电子设备诸如计算机,手持设备的交互。 这里附带提一下 User Interface(UI) ,也可以称为 HMI(Human Machine Interface) ,它

2、在计算机领域指提供给 用户的图形,文本,听觉信息,以及用户通过它给应用程序 的控制序列 (比如键盘击键,鼠标拖动,触摸屏点击等 )。 UI 的种类有很多, 包括上面提到的 GUI ,另外还有 Web-based UI, CLI(Command line interfaces) 等。窗口系统 (Window System or Windowing System) : 是 GUI 的一部分, 提供了对实现窗口管理器的支持, 以及对 图形硬件,鼠标键盘的基本支持。鼠标光标也是由窗口系统 绘制的。例如 Qtopia ,X Window System ,Y Window System , MiniGUI

3、 等。窗口管理器 (Window manager) :计算机软件, 在一个GUI 的窗口系统中控制窗口的位置和外观,各个窗口的叠加 顺序等。它们与下层的窗口系统一起提供对图形,点设备, 和键盘的支持, 它们通常被实现成使用 widget toolkit 来创建。 例如 KWin ,twm , Metacity 等。桌面环境 (Desktop environment) :指 GUI 的一种风格, 典型地由图标,窗口,工具栏,文件夹,墙纸和桌面部件组 成。提供桌面环境的软件可能也提供了拖放 (drag and drop) 功能。例如: GNOME ,KDE ,Xfce 等。部件工具链 (widge

4、t toolkit) :一个部件的集合用来设计 GUIs 应用程序。通常由操作系统,窗口系统或窗口管理器 提供一组 API ,供应用程序访问 API 来使用部件。比如 Qt, GTK+ 等。例如,在 X 窗口系统中, KDE 是桌面环境,而 X 窗口管 理器可以是KDE提供的KWin KDE桌面环境是基于 Qt/X11 toolkit 开发的。在 MiniGUI 中,图形抽象层 (GAL) 干了与窗口系统一样的 事情,还有一个称为 DESKTOP 的窗口管理器。 控件与整体 框架构成了一套完整的桌面环境。上面的内容就说到这里,下面介绍一下三种运行模式,1. MiniGUI-Threads 。在

5、这种模式下, MiniGUI 本身运行在线程模式下,在启动之初,调用 SystemThreads 函 数启动了 desktop 、parsor 和 timer 三个线程。 desktop 用于 管理 MiniGUI 窗口中的所有主窗口,包括建立、销毁、显 示、隐藏、修改 Z-order 、获得输入焦点等等。 parsor 线程 用来从 IAL 中收集鼠标和键盘事件,并将收集到的事件转换 为消息而邮寄给 desktop 窗口管理器。 timer 线程用来触发 定时器事件。 该线程启动时首先设置 Linux 定时器, 然后等 待 desktop 线程的结束,即处于休眠状态。当接收到 SIGALRM

6、 信号时,该线程处理该信号并向 desktop 服务 器发送定时器消息。当 desktop 接收到定时器消息时, desktop 会查看当前窗口的定时器列表,如果某个定时器过 期,则会向该定时器所属的窗口发送定时器消息。 你可以新建一个线程来创建一个窗口,也可以在同一个线程 内创建多个窗口。 刚说了窗口之间的叠加是由窗口管理器负责的,因此窗口的 创建和销毁应该通知窗口,因此在窗口被创建时,传递 MSG_ADDNEWMAINWIN 给 desktop 窗口管理器,这个操 作是通过消息队列实现的。又如, parsor 线程检测到了键盘 消息之后, 会发一个消息到 desktop 的消息队列中, d

7、esktop 从消息队列中取出该消息,并放到当前活动窗口 (_mg_active_mainwnd) 的消息队列中,_mg_active_mainwnd 窗口就可以处理键盘消息了。 由此可 见, desktop 窗口管理器可以看作一个服务器,而普通的窗 口线程可以看作客户端, 这种称之为微客户 /服务器结构, 因 为客户和服务器是在同一进程中的不同线程,因此是微客户/服务器。由此可见你创建的窗口与窗口管理器在不同的线程 中。窗口管理器由全局变量 _mg_desktop 引用,因此在一 个客户端线程里,可以做到向窗口管理器发送消息。2. MiniGUI-Processes 。在这种模式下, 每个

8、MiniGUI 程序都是一个独立的进程,每个进程可以创建多个窗口。这 也就意味着,作为服务器的窗口管理器进程必须作为服务器 进程运行,而其他窗口作为客户端进程运行。区分服务器和 客户端通过全局变量 mgServer 的值来判断。服务器与客户 端间的进程通信使用 Unix Domain Socket 实现。3. MiniGUI-Standalone 。这种运行模式下, MiniGUI 以独立进程的方式运行,适合功能单一的应用场合。 注意:针对以上三种运行模式分别定义了不同的宏。MiniGUI-Threads: _MGRM_THREADS MiniGUI-Processes: _MGRM_PROC

9、ESSES 和 _LITE_VERSIONMiniGUI-Standalone: _MGRM_STANDALONE 和 LITE_VERSION 和 _STAND_ALONE下面详细介绍 MiniGUI-Threads 模式下的消息驱动模型。 parsor 线程负责收集来自底层设备的键盘敲击, 鼠标点击事 件,并封装成约定好的消息格式投递到桌面管理器的消息队 列中。桌面管理器的消息循环不停地从消息队列中获取消息,并处理消息,或自己处理或派发给具体的窗口MiniGUI 支持的消息传递机制如下:PostMessage :异步消息。消息发送完毕则立即返回,不需 要等待消息被处理完。PostSyncM

10、essage :同步消息。 发送窗口和接收窗口为多线 程时才起作用,通过创建信号量并等待,直至消息被处理完 则返回。SendMessage :这是一种同步消息, 利用该函数向任何一个 窗口发送消息,并不是立即返回而是等待该消息被处理完之 后才返回。当发送窗口和接收窗口在同一线程则直接调用; 不同线程的情况下,则同 PostSyncMessage 。SendNotifyMessage :异步消息。消息发送完毕则立即返回, 不需要等待消息被处理完。并且这种消息会被存放到链表中, 因此保证消息不会丢失。SendAsyncMessage :异步消息。无论发送消息窗口和接收 消息是否在同一个线程,都直接

11、调用。消息队列 MSGQUEUE 结构定义如下,由于只考察 Threads 模式下,因此把不相关的内容去掉了: struct _MSGQUEUEDWORD dwState; / 消息队列的当前状态,是否有新的消息等pthread_mutex_t lock; / 互斥锁sem_t wait; /信号量,有消息时可以获得信号量,否 则睡眠,之所以用信号量是因为避免了 CPU 的忙等PQMSG pFirstNotifyMsg; /Notify 消息链表的首指针PQMSG pLastNotifyMsg; /Notify 消息链表的尾指针PSYNCMSG pFirstSyncMsg; / 同步消息链表的

12、首指针PSYNCMSG pLastSyncMsg;/ 同步消息链表的尾指针MSG* msg; / 普通消息存放的队列, 它 是一个数组int len; / 数组长度int readpos, writepos;/读写指针WORD TimerMask; / 是否有定时器超时发生int loop_depth; /PostQuitMessage 使用的变量,也不 清楚;/普通消息结构typedef struct _QMSGMSG Msg; struct _QMSG* next;QMSG;/ 同步消息结构typedef struct _SYNCMSGMSG Msg;Int retval;/ 返回值sem_t sem_han

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论