Моя цель — создать библиотеку, используя привязки Qt к DBus.
Я попытался создать приложение Qt, не запуская QEventLoop
(предоставляемый классом QCoreApplication
) в основном потоке.
Вот минималистичный пример приложения, которое отлично работает с версией QT-4.6.2, но блокируется при самоанализе с использованием QT-4.8 или выше.
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());
}
Как вы можете видеть в файле main.cpp
, app.exec()
закомментировано, но позволяет приложению нормально работать на QT-4.8 или более поздних версиях (5.3.0).
У меня следующий вопрос: возможно ли использовать привязки DBus Qt, вызывающие app.exec()
в другом потоке, отличном от основного, на Qt-4.8 или 5.3?
app.exec()
в основном потоке на Qt-4.8 или 5.3? Разве это не должно быть с, согласно тому, что он продемонстрировал? - person Tay2510   schedule 10.06.2014app.exec()
в основном потоке код работает с Qt 4.6.2. И ожидаемое решение - это какой-то способ использовать Qt EventLoops, не блокируя основной поток. Разве нельзя использовать Qt как библиотеку, начиная с версии 4.8.4, без блокировки основного потока и использования QEventLoops (для работы сигналов/слотов)? - person naab   schedule 10.06.2014app.exec()
в основном потоке. Извините, я не хотел играть словами, я просто хочу убедиться, в чем проблема. Поскольку случай безapp.exec()
уже был продемонстрирован и работал на версии 4.8, почему мы должны снова запрашивать без? - person Tay2510   schedule 10.06.2014