我知道这可能是一个新手GLib问题,但我很难找到解决我的问题的代码示例。所以在我走错路之前,我想听听您的建议。
我的代码监听D-Bus消息。其中一个D-Bus消息是“Quit”消息,旨在指示主循环关闭。如果主循环中没有其他任务,则可以在下面的代码中简单地调用g_main_loop_run()
,并且当接收到“Quit”消息时(此处未显示)执行g_main_loop_quit()
的D-Bus消息处理代码来实现解决方案。
然而,我更喜欢由主循环做出退出的决定,这样可以执行除了监听D-Bus消息以外的各种其他任务。以下代码在设置工作中的D-Bus服务器后按预期执行此操作:
GMainLoop *glib_mainloop = g_main_loop_new( NULL, false );
/* Set up the D-Bus connection to work in the GLib event loop. */
dbus_connection_setup_with_g_main( dbus_connection, NULL );
/* Run the GLib event loop. */
GMainContext *glib_context = g_main_context_default( );
while( quit_indicator == false )
{
g_main_context_iteration( glib_context, /*allow blocking=*/false );
/* Do a variety of other tasks. */
}
g_main_loop_quit( glib_mainloop );
注意:上述代码是为了阐明我的问题而提供的最少量代码,我知道主循环中的“其他任务”可能更好地由线程、
GSource
或其他方式处理。例如,如果上述代码直接使用,会出现明显的繁忙等待或时间问题。我的问题是:上面的代码示例是否是实现我的目标的正确方式,还是有更“真正”的GLib方法可以做到这一点?