概述
头文件
#include <glib.h>
描述
主事件循环管理GLib
和GTK+
应用程序的所有可用事件源。这些事件可以来自任何数量的不同类型来源,如文件描述符(普通文件、管道或套接字)和超时。也可以使用g_source_attach()
添加新类型的事件源。
为了允许在不同线程中处理多个独立的源集,每个源都与一个GMainContext
相关联。一个GMainContext
只能在单个线程中运行,但可以从其他线程将事件源加入或移除。所有在GMainContext
或内置GSource
上运行的函数都是线程安全的。
每个事件源都被分配了一个优先级。默认优先级 G_PRIORITY_DEFAULT
为 0。小于 0 的值表示更高的优先级。大于 0 的值表示较低的优先级。来自高优先级源的事件总是在来自低优先级源的事件之前处理。
也可以添加空闲函数,并分配优先级,这些将运行,只要没有更高优先级的事件准备好被处理。
所述GMainLoop
数据类型表示一个主事件循环。GMainLoop
是用g_main_loop_new()
. 添加初始事件源后, g_main_loop_run()
被调用。这会不断检查来自每个事件源的新事件并分派它们。最后,对来自其中一个源的事件的处理导致调用g_main_loop_quit()
退出主循环并g_main_loop_run()
返回。
可以递归地创建GMainLoop
的新实例。当显示模式对话框时,这通常用于 GTK+
应用程序中。请注意,事件源与特定的GMainContext
相关联 ,并且将针对与该 GMainContext
相关联的所有主循环进行检查和调度。
GTK+
包含其中一些函数的包装器,例如gtk_main()
, gtk_main_quit()
和gtk_events_pending()
。
创建新的源类型
GMainLoop
功能的不寻常特性之一是,除了内置类型的事件源之外,还可以创建和使用新类型的事件源。一种新的事件源类型用于处理 GDK
事件。通过从GSource
结构“派生”来创建新的源类型。源的派生类型由具有GSource
结构作为第一个元素和其他特定于新源类型的元素的结构表示。要创建新源类型的实例,请调用 g_source_new()
传递派生结构的大小和函数表。这些GSourceFuncs
确定新源类型的行为。
新的源类型基本上以两种方式与主上下文交互。他们在GSourceFuncs
中的准备功能可以设置超时,以确定主循环在再次检查源之前将休眠的最长时间。此外,或同样,源可以将文件描述符添加到主上下文使用 g_source_add_poll().
自定义主循环迭代
GMainContext
的单次迭代可以使用 g_main_context_iteration().
在某些情况下,需要更详细地控制主循环的工作细节,例如,将GMainLoop
与外部主循环集成时。在这种情况下,您可以g_main_context_iteration()
直接调用的组件函数 。这些功能是 g_main_context_prepare(),g_main_context_query(), g_main_context_check()
和g_main_context_dispatch()
。
主上下文的状态
在 UNIX 上,GLib 主循环与fork()是不相容的. 任何使用主循环的程序都不应该在子进程中使用exec()
或exit()
来返回。
源的内存管理
最后
以上就是冷傲路人为你收集整理的Glib官方文档阅读 The Main Event Loop的全部内容,希望文章能够帮你解决Glib官方文档阅读 The Main Event Loop所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复