2

我的程序中有一个主循环,它从 dbus 调用这个方法: dbus_connection_read_write_dispatch 我有一些注册的回调,当消息到达时被调用。在此回调中,我还处理响应并发送回响应。问题是有时它需要很长时间,所以它可能会阻止接收来自 DBUS 的消息。问题 - 我可以从多个线程在同一个连接上调用 dbus_connection_read_write_dispatch() 方法吗?然后可能会在处理前一个 DBUS 消息时接收到新的 DBUS 消息。或者也许更好的想法是在另一个线程中处理响应而不是主循环,从回调被调用?

谢谢

4

2 回答 2

1

如果您至少调用了函数dbus_threads_init_default()一次,则可以从多个线程调用dbus_connection_read_write_dispatch ( ) 。相反,更好的方法是让单个线程运行 dbus 调度程序并使用线程池来处理来自回调的数据。 有关更多信息,请参见dbus_threads_init_default()

于 2013-07-20T23:06:45.050 回答
0

通过freedesktop.org 提供的文档,您可以。

但是,如果您直接使用来自不同线程的相同 DBusConnection 实例进行操作,例如。dbus_connection_send_with_reply_and_block在另一个线程阻塞时调用一个线程dbus_connection_read_write_dispatch,连接可能工作不正常。根据官方文档,调用回调函数时DBus连接会被锁定。DBusConnection

在我的情况下,dbus_connection_send_with_reply_and_block即使返回消息被发送到我的进程(我在 上看到过dbus-monitor)也没有返回。呼叫dbus_thread_init根本不起作用。

最近我使用委托在一个线程中发送/接收/发送所有 dbus 消息,问题消失了。

freedesktop.org 邮件列表中的邮件

于 2018-04-12T16:34:21.987 回答