使用 C 强制立即处理 Glib 中的事件

Forcing immediate handling of events in Glib with C

针对 Bluez 的 C GDBus API 进行编程,我注意到我通过代理使用 DBUS 进行的方法调用不会 return 它们的结果,直到主循环结束。

例如,在终端应用程序中输入我创建的函数 "cmd_bpm" 会执行这些操作:

cmd_scan("on"); //Outputs "Discovery started", then posts results through a callback.
printf("test"); 
cmd_scan("off"); //Outputs "Discovery stopped", then posts results through a callback.

但是,直到 GMainLoop 结束时才会处理这些回调。输出是:

test
discovery started
discovery stopped

虽然靠输出来检查消息调用的顺序不是我做过的;我知道打印与行缓冲区有关。但是通过脚本设置断点表明回调总是在循环结束时处理。 有什么办法可以强制 glib 在调用时处理这些事件。例如。等待回复,运行回调,然后继续代码。而不是等待代码 运行 然后执行所有回调函数。我什至不确定 glib 是否是罪魁祸首,因为试图强制主循环迭代是不成功的。

我也试过让 dbus 方法调用阻塞并等待回复,但是我用 cmd_scan() 执行的 StartDiscovery() 函数是 void,所以没有回复.

我想提供更多信息,但我不知道该包括什么,我在任何地方都没有注意到类似的主题。

正在准备主循环和回调。

main_loop = g_main_loop_new(NULL, FALSE);
dbus_conn = g_dbus_setup_bus(DBUS_BUS_SYSTEM, NULL, NULL);

signal = setup_signalfd();

client = g_dbus_client_new(dbus_conn, "org.bluez", "/org/bluez");

g_dbus_client_set_connect_watch(client, connect_handler, NULL);
g_dbus_client_set_disconnect_watch(client, disconnect_handler, NULL);
g_dbus_client_set_signal_watch(client, message_handler, NULL);
g_dbus_client_set_proxy_handlers(client, proxy_added, proxy_removed,
                        property_changed, NULL);

input = 0;

g_dbus_client_set_ready_watch(client, client_ready, &input);

g_main_loop_run(main_loop);

在此主循环中,我可以输入用户命令。

GDBus 拥有所有方法调用函数的同步版本。例如。而不是调用 g_dbus_proxy_call() 你调用 g_dbus_proxy_call_sync().

一些方法 return 在有任何 "results" 之前:StartDiscovery() 可能是其中之一——甚至顾名思义它只开始发现:它不等待发现结果出现在 returning 之前,但会在结果可用时发送信号或 属性 更改。如果您需要在执行某些操作之前等待这些结果,那么您将不得不在信号(或 属性 更改)处理程序中执行该操作,而不是在主代码体中。