GUI 主循环设计及其在 MiniGUI, GTK, QT 的实现
2013-10-26 16:37
316 查看
来源: http://blog.chinaunix.net/uid-26125381-id-3197872.html
原文地址:GUI 主循环设计及其在 MiniGUI, GTK, QT 的实现 作者:hawkorchid
原文地址:GUI 主循环设计及其在 MiniGUI, GTK, QT 的实现 作者:hawkorchid
作者: 刘鹏 日期: 2009-05-22 介绍了 GUI 主循环的设计思路,并分析了 MiniGUI, GTK, QT 的主循环。 |
我们知道GUI应用程序都是事件驱动的。这些事件大部分都来自于用户,比如键盘事件、鼠标事件或笔点事件。还有一些事件来自于系统内部,比如定时事件、socket事件和其它文件事件等等。在没有任何事件的情况下,应用程序处于睡眠状态。1 |
来自资料1 |
GSource的接口函数有:
gboolean (*prepare) (GSource *source, gint *timeout_);进入睡眠之前, 在g_main_context_prepare里,mainloop调用所有Source的prepare函数, 计算最小的timeout时间,该时间决定下一次睡眠的时间。
gboolean (*check) (GSource *source); poll被唤醒后,在 g_main_context_check里,mainloop调用所有Source的check函数,检查是 否有Source已经准备好了。如果poll是由于错误或者超时等原因唤醒的,就 不必进行dispatch了。
gboolean (*dispatch) (GSource*source, GSourceFunc callback,gpointer user_data); 当有Source准备好了,在 g_main_context_dispatch里,mainloop调用所有Source的dispatch函数, 去分发消息。
void (*finalize) (GSource *source); 在Source被移出时,mainloop调用 该函数去销毁Source。
Main loop的工作流程简图如下:
来自资料1 |
Idle 它主要用实现异步事件,功能类似于Win32下的PostMessage。但它还支持 重复执行的特性,根据用户注册的回调函数的返回值而定。
g_idle_prepare把超时设置为0,也就是即时唤醒,不进入睡眠状态。
g_idle_check 始终返回TRUE,表示准备好了。
g_idle_dispatch 调用用户注册的回调函数。
Timeout 它主要用于实现定时器,支持一次定时和重复定时,根据用户注册的回调函数的返回值而定。
g_timeout_prepare 计算下一次的超时时间。
g_timeout_check 检查超时时间是否到了,如果到了就返回TRUE,否则返回FALSE。
g_timeout_dispatch调用用户注册的回调函数。
线程可以向自己的mainloop中增加Source,也可以向其它线程的mainloop增加 Source。向自己的mainloop中增加Source时,mainloop已经唤醒了,所以不会存 在什么问题。而向其它线程的mainloop增加Source时,对方线程可能正挂在poll 里睡眠,所以要想法唤醒它,否则Source可能来不及处理。在Linux下,这是通
过wake_up_pipe管道实现的,mainloop在poll时,它除了等待所有的Source外, 还会等待wake_up_pipe管道。要唤醒poll,调用 g_main_context_wakeup_unlocked向wake_up_pipe里写入字母A就行了。
QT 的主循环
QT 采用的是基于 select 的主循环。主循环使用 select 函数监听事件源,当 有事件发生时对其进行处理,若没有事件则休眠等待。QT 的事件处理模块如下图所示:
类 QAbstractEventDispatcher 封装了所有的事件处理接口,包括事件的处理 (processEvents),Socket 的登记和注销 (xxxSocketNotifier),Timer 的注册 与注销(xxxTimer)等。
不同版本的 QT 代码实现不同的 QAbstractEventDispathcer 子类。这里,我分 析了 X11
平台的 QT 实现,它实现了 QEventDispathcerUnix 类,并派生出 QEventDispatcherX11 类。
processEvents 方法负责处理事件;select 方法提供了监听事件的接口,它实际上去调系统的 select 函数。
QT 相关代码在 src/gui/kernel 和 src/corelib/kernel 目录下。
Reference
GTK+主循环(main loop)的工作原理Common main loop: Qt ported to glib main loop (experimental)
GTK编程——Gtk+的主循环
相关文章推荐
- GUI 主循环设计及其在 MiniGUI, GTK, QT 的实现
- GUI 主循环设计及其在 MiniGUI, GTK, QT 的实现
- GUI 主循环设计及其在 MiniGUI, GTK, QT 的实现
- /LGC设计模式/GUI 主循环设计及其在 MiniGUI, GTK, QT 的实现
- GUI 主循环设计及其在 MiniGUI, GTK, QT 的实现
- GUI 主循环设计及其在 MiniGUI, GTK, QT 的实现
- QT Designer 设计Gui 及其好处
- cocos2d-x之CCGUI设计与实现(3)循环列表框的实现(数字选择器)
- “有毒”移动电源Android版的设计及其实现
- 数据结构基础(12) --双向循环链表的设计与实现
- 二十三种设计模式及其python实现
- 基于哈希查找的字库设计与实现及其自动生成工具的实现
- Python之学习笔记(QT:GUI设计)
- LFS进阶版(QT)——GUI界面的实现
- QT 类及其实现效果(4)--字体设置
- QT 类及其实现效果(6)--画图
- Python GUI--Tkinter简单实现个性签名设计
- 通用分页实现及其OO设计探讨
- QT 类及其实现效果(8)--橡皮筋线,Graphics view
- Python Qt GUI快速编程-第四章的Currency例子的python3+pytq5+Qt Designer实现