簡體   English   中英

沒有主循環的 GLIB 使用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM