DBUS——多线程处理

Posted

技术标签:

【中文标题】DBUS——多线程处理【英文标题】:DBUS - multithread processing 【发布时间】:2013-06-19 03:50:21 【问题描述】:

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

谢谢

【问题讨论】:

【参考方案1】:

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

【讨论】:

【参考方案2】:

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

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

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

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

A mail in mailing list of freedesktop.org

【讨论】:

以上是关于DBUS——多线程处理的主要内容,如果未能解决你的问题,请参考以下文章

Delphi多线程怎么处理?

多线程是啥

linux 多线程信号处理总结

什么是多线程,多进程?

C# 多线程同步访问一个文件怎么处理

多线程多线程中的异常处理