С прокси-сервером Qt DBus, построенным на QDbusAbstractInterface (через qdbusxml2cpp), каков наилучший способ обработки службы / объекта, к которым вы хотите подключиться, чтобы они не были доступны при запуске? Примечание: мне не интересно просто знать это (вы можете использовать BlahService.isValid (), чтобы узнать это); Я хочу знать, действительно ли он действителен, и знать, когда он станет действительным, чтобы я мог изменить состояние (и передать это изменение состояния с помощью сигнала), и с этим изменением состояния делать другие вещи. И наоборот, я хочу знать, когда он больше не действителен по аналогичным причинам.
Без отслеживания состояния услуги:
#define CONNECT_DBUS_SIG(x,y) connect(blah,SIGNAL(x),this,SLOT(y))
// FIX - should watch for service, and also handle it going away and
// coming back
blah = new BlahService("com.xyzzy.BlahService", "/com/xyzzy/BlahService",
QDBusConnection::sessionBus(), this);
if (!blah)
return 0;
if (blah.isValid())
{
CONNECT_DBUS_SIG(foo(),Event_foo());
}
else
{
// Since we aren't watching for registration, what can we do but exit?
}
Вероятно, нам нужно следить за NameOwnerChanged на объекте соединения DBus - если только код dbus QT не сделает это за нас - и затем, когда мы получим это состояние изменения сигнала, и при необходимости подключим или отключим сигналы от объекта.
Все примеры, которые я нахожу, либо игнорируют проблему, либо просто завершаются, если объект сервера не существует, и не устраняют его. Пример Car / Controller Qt по крайней мере замечает, если сервер уходит, и печатает «Отключено», если isValid () становится ложным во время использования, но опрашивает isValid ().
Добавлено:
Обратите внимание, что QtDbusAbtractInterface регистрирует изменения владельца сервера (NameOwnerChanged) и обновляет isValid () при возникновении изменений. Поэтому я подозреваю, что вы можете подключиться к этому сигналу serverOwnerChanged напрямую, чтобы узнать об изменениях владельца и использовать его в качестве индикатора для повторной попытки - хотя вы не сможете доверять isValid, поскольку он может быть обновлен до или после получения сигнала.
В качестве альтернативы (безобразно) вы можете установить таймер и опросить isValid ().