Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ QDBusInterface正在阻塞DBU_C++_Multithreading_Qt_Blocking_Dbus - Fatal编程技术网

C++ QDBusInterface正在阻塞DBU

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

我目前正在尝试使用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.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!");
}