So verwenden Sie Qt-Dbus-Bindungen, ohne den Haupt-Thread zu blockieren

Mein Ziel ist es, eine Bibliothek mit dem zu erstellenQts DBus-Bindungen.

Ich habe versucht, eine Qt-Anwendung zu erstellen, ohne die zu startenQEventLoop (zur Verfügung gestellt von derQCoreApplication Klasse) im Haupt-Thread.

Hier ist ein minimalistisches Anwendungsbeispiel, das mit der QT-4.6.2-Version einwandfrei funktioniert, jedoch Introspection mit QT-4.8 oder höher blockiert.

DBusHandler.hpp

#pragma once
#include <iostream>
#include <QtCore/QThread>
#include <QtCore/QtCore>
#include <QtDBus/QDBusInterface>

class DBusHandler : public QThread
{
    Q_OBJECT;

private:     
    void run(void)
    {
        QDBusConnection connection = QDBusConnection::sessionBus();

        connection.registerService("my.qdbus.example");
        connection.registerObject("/", this, QDBusConnection::ExportAllSlots);
        exec();
    }

public:
    DBusHandler(void) {}
    virtual ~DBusHandler(void) {}

    void stop(void)
    {
        QDBusConnection connection = QDBusConnection::sessionBus();

        connection.unregisterObject("/");
        connection.unregisterService("my.qdbus.example");
        connection.disconnectFromBus(connection.name());
        QThread::quit();
    }

public slots:
    void remoteCall(QByteArray message)
    {
        std::cout << "Message size: " << message.size() << std::endl;
    }
};

main.cpp

#include "DBusHandler.hpp"

int main(int ac, char **av)
{
    QCoreApplication app(ac, av);
    DBusHandler handler;

    handler.moveToThread(&handler);

    handler.start();
    while (not handler.isRunning());

    // app.exec();
    sleep(10); // Gives time to call using the command line: "qdbus my.qdbus.example / local.DBusHandler.remoteCall a_message"

    handler.stop();
    while (handler.isRunning());
}

Wie Sie in der sehen könnenmain.cpp Datei,app.exec() ist auskommentiert, aber macht die Anwendung auf QT-4.8 oder höheren Versionen (5.3.0) gut.

Meine Frage ist die folgende: Ist es möglich, den DBus-Bindungsaufruf des Qt zu verwendenapp.exec() in einem (nanderer Thread als die Hauptversion auf Qt-4.8 oder 5.3?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage