[英]GLIB usage without mainloop
我在使用 Glib 時遇到問題。 我想訂閱一個 dbus 信號而不用 g_main_loop_run 啟動主循環。
我創建到正確總線的連接並調用函數g_dbus_connection_signal_subscribe 。
我用 while(1) 替換了 main 函數中對g_main_loop_run的調用。
不幸的是,它不起作用。 如果我正確理解 GLib,則無需啟動主循環進行此類處理。
請幫忙。
示例代碼:
session_bus = g_bus_get_sync(G_BUS_TYPE_SESSION,
NULL,
NULL );
g_dbus_connection_signal_subscribe(session_bus,
"org.freedesktop.Notifications",
"org.freedesktop.Notifications",
"NotificationClosed",
"/org/freedesktop/Notifications",
NULL,
G_DBUS_SIGNAL_FLAGS_NONE,
(GDBusSignalCallback) onNotifClosed,
NULL,
NULL );
loop = g_main_loop_new(NULL, FALSE);
g_main_loop_run(loop);
g_main_loop_unref(loop);
g_object_unref(session_bus);
如果我正確理解 GLib,則無需啟動主循環進行此類處理。
如果要等待傳入的 DBus 事件,則必須運行主循環。 主循環所做的是等待和處理事件,而您要等待然后處理事件。 作為g_main_loop_run
的替代g_main_loop_run
,您可以嘗試在while(1)
運行g_main_context_iteration
。
我也有類似的需要以非阻塞方式處理 GLib 事件,但我在任何地方都找不到完整的答案,所以我在這里發布我的解決方案以供參考。
正如el.pescado所說, g_main_loop_run()
的一種替代方法是在GMainLoop
對象的上下文中重復調用g_main_context_iteration()
。 例如,這可以在循環中完成,允許在事件處理周期之間執行一些intervening_task()
直到滿足某種termination_condition()
:
GMainLoop *loop = g_main_loop_new();
while (!termination_condition())
{
g_main_context_iteration(g_main_loop_get_context(loop), FALSE);
intervening_task();
}
g_main_loop_unref(loop);
在上面的片段中,循環上下文由g_main_loop_get_context()
檢索,任何掛起的 GLib 事件由g_main_context_iteration()
。 如果沒有掛起的事件,將may_block
參數設置為FALSE
會導致函數立即返回(否則它會阻塞等待處理某事)。
然而值得注意的是,如果以上就是你想要做的,那么你最好堅持使用g_main_loop_run()
並使用g_timeout_add()
或g_idle_add()
將中間任務和終止條件注冊為事件回調——后者會調用g_main_loop_quit()
終止循環。 這里的重點不是按原樣使用該代碼,而只是演示如何以非阻塞方式處理 GLib 事件,以便將其集成到另一個框架的主循環中。 例如 Qt 或 ROS。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.