主事件循环
描述
主事件循环(main event loop)管理所有的glib和gtk+应用的消息源。这些消息源来自多种类型的的如文件描述符(文件,管道,套接字)和超时。
为了让多种独立的消息集合在不通的线程中被处理,每一种消息源被GMainContext关联。一个GMainContext能够在一个线程中运行,而且消息源能被添加和移除从别的线程。
每个事件消息源都有默认的优先级,默认的优先级是G_PRIORITY_DEFAULT,是0,小于0的标识高优先级,大于0的标志低优先级。高优先级级的消息源有限被处理。
空闲函数可以被添加,分配优先级,当没有更高优先级的事件被处理时,这些空函数运行。
GMainLoop 数据类型代表一个主事件循环,一个GMainLoopb被g_main_loop_new()创建。在添加初始化事件后,g_main_loop_run()被调用,不断的检测各种事件源并且派发。最后,处理一个来自g_main_loop_quit()的消息后,退出主事件循环,g_main_loop_run() 返回。
自定义新的事件源
GMainLoop功能的一个不同寻常的功能是除了内置类型的事件源之外,还可以创建和使用新类型的事件源。新事件源类型用于处理GDK事件。通过从GSource结构派生来创建新的源类型。派生类型的源由一个结构表示,该结构具有GSource结构作为第一个元素,以及特定于新源类型的其他元素。要创建新源类型的实例,请调用派生结构的大小和函数表。这些GSourceFuncs确定新源类型的行为。g_source_new()新的源类型基本上以两种方式与主上下文交互。它们在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()。
image.png
网友评论