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?