DBUS — многопоточная обработка

У меня есть основной цикл в моей программе, который вызывает этот метод из dbus:
dbus_connection_read_write_dispatch
У меня есть несколько зарегистрированных обратных вызовов, которые вызываются, когда приходит сообщение. В рамках этого обратного вызова я также обрабатываю ответ и отправляю ответ обратно. Проблема в том, что иногда это занимает много времени, поэтому, вероятно, он заблокирует получение сообщений от DBUS.
Вопрос — можно ли вызвать метод dbus_connection_read_write_dispatch () для одного и того же соединения из более чем одного потока? Тогда, возможно, будет возможно получать новые сообщения DBUS, пока обрабатывается предыдущее.
Или, может быть, лучшая идея состоит в том, чтобы обрабатывать ответы в другом потоке, кроме основного цикла, из обратного вызова вызывается?

Спасибо

2

Решение

ты можешь позвонить dbus_connection_read_write_dispatch () из нескольких потоков, если вы вызвали функцию dbus_threads_init_default () Хотя бы один раз.
Вместо этого лучше использовать один поток, работающий с диспетчером dbus, и использовать пул потоков для обработки данных из обратных вызовов.

Увидеть dbus_threads_init_default () для получения дополнительной информации.

1

Другие решения

С помощью документа, предоставленного 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

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector