Como usar ligações Qt-Dbus sem bloquear o thread principal
Meu objetivo é criar uma biblioteca usando oLigações DBus do Qt.
Tentei criar um aplicativo Qt sem iniciar oQEventLoop
(fornecida peloQCoreApplication
classe) no segmento principal.
Aqui está um exemplo de aplicativo minimalista, funcionando bem usando a versão QT-4.6.2, mas bloqueando a introspecção usando o QT-4.8 ou superior.
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());
}
Como você pode ver nomain.cpp
Arquivo,app.exec()
está comentado, mas faz com que o aplicativo funcione bem nas versões QT-4.8 ou superior (5.3.0).
Minha pergunta é a seguinte: É possível usar as ligações DBus do Qt chamandoapp.exec()
em umoutro segmento do que o principal, no Qt-4.8 ou 5.3?