GUI 主循环设计及其在 MiniGUI, GTK, QT 的实现
作者: 刘鹏
日期: 2009-05-22
介绍了 GUI 主循环的设计思路,并分析了 MiniGUI, GTK, QT 的主循环。
|
简介我们知道GUI应用程序都是事件驱动的。这些事件大部分都来自于用户,比如键盘事件、鼠标事件或笔点事件。还有一些事件来自于系统内部,比如定时事件、socket事件和其它文件事件等等。在没有任何事件的情况下,应用程序处于睡眠状态。1 因为这种事件驱动机制,GUI应用程序都毫无例外的需要一个主循环(main loop)。 主循环(main loop)控制应用程序什么时候进入睡眠状态,什么时候被唤醒。主 循环实现得好,应用程序才能工作正常又省电。1 目前常见的主循环设计主要是三种思路:
对于第一种设计思路,主循环不断的从消息队列中提取消息分发给窗口,如果消 息队列中没有消息,主循环调用 sem_wait 进入休眠状态,直到有信息出现被唤 醒。MiniGUI的主循环就是这样实现的。 对于第二种思路,主循环使用 poll 函数监听事件源,若有事件出现则进行处理, 否则进入休眠状态,直到有事件到来。GTK+ 的主循环就是采用的这种思路。 第三种思路与第二种思路类似,不同之处是主循环使用 select 函数监听事件源, < |