C++ QDBusInterface正在阻塞DBU
我目前正在尝试使用QtDBus实现一个库。我成功地在dbus上注册了服务和对象。但当我使用QDBusInterface时,dbus似乎在内省消息上被阻塞,如dbus监视器跟踪所示:C++ QDBusInterface正在阻塞DBU,c++,multithreading,qt,blocking,dbus,C++,Multithreading,Qt,Blocking,Dbus,我目前正在尝试使用QtDBus实现一个库。我成功地在dbus上注册了服务和对象。但当我使用QDBusInterface时,dbus似乎在内省消息上被阻塞,如dbus监视器跟踪所示: method call sender=:1.363 -> dest=org.freedesktop.DBus serial=3 path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=GetNameOwner string "my.t
method call sender=:1.363 -> dest=org.freedesktop.DBus serial=3 path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=GetNameOwner
string "my.test.test"
method call sender=:1.363 -> dest=my.test.test serial=4 path=/;interface=org.freedesktop.DBus.Introspectable; member=Introspect
下面是一些代码来解释如何管理DBU。
我在QThread中使用它来使用它自己的偶数循环(在实现库时,我不希望在主线程中使用任何阻塞调用,例如exec()。
因此,我以这种方式初始化它:
Worker::Worker()
{
moveToThread(_thread);
_dbus = new DbusHandler();
_dbus->moveToThread(_thread);
connect(_thread, SIGNAL(started()), _dbus, SLOT(initializeDBus()));
connect(this, SIGNAL(sig_send(const QString)), _dbus, SLOT(send(const QString)));
_thread->start();
}
void DBusHandler::initializeDBus()
{
QDBusConnection _connection = QDBusConnection::sessionBus();
if ( ! _connection.isConnected())
throw runtime_error("Could not connect to DBUS.");
// register the serviceName
if ( ! _connection.registerService(serviceName) )
throw runtime_error("Could not register the service using QDBusConnection::registerService");
// register the current object to the path "/"
if ( ! _connection.registerObject("/", this, QDBusConnection::ExportAllSlots))
throw runtime_error("Could not register object using QDBusConnection::registerObject");
}
然后,我使用同一线程在Dbus上发送消息,该线程使用连接到Worker类(在同一线程中)的sig_send()信号的插槽
此方法允许发出sig_发送信号并将消息发送到上述方法
void Worker::send(const QString message)
{
emit sig_send(message);
}
最后,我的主要观点是:
int main(int , char** )
{
Worker* worker = new Worker();
while(true)
worker->send("Hello world!");
}
奇怪的是,这段代码似乎与Qt4.6.2配合得很好,但与Qt4.8.4配合得不好。更令人惊讶的是,如果我删除了main中的无限循环,并且只发送一条消息,它也可以工作。
有人对这个问题有解决办法或解释吗
int main(int , char** )
{
Worker* worker = new Worker();
while(true)
worker->send("Hello world!");
}