我的目标是使用Qt的DBus绑定创建一个库。
我尝试创建一个不需要在主线程中启动
这是一个最简应用示例,使用QT-4.6.2版本正常工作,但在使用QT-4.8或更高版本时会阻塞introspection。
如您在
我的问题是:在Qt-4.8或5.3上,是否可以在与主线程不同的其他线程中使用Qt的DBus绑定调用
我尝试创建一个不需要在主线程中启动
QCoreApplication
类提供的QEventLoop
的Qt应用程序。这是一个最简应用示例,使用QT-4.6.2版本正常工作,但在使用QT-4.8或更高版本时会阻塞introspection。
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)上使应用程序正常工作。我的问题是:在Qt-4.8或5.3上,是否可以在与主线程不同的其他线程中使用Qt的DBus绑定调用
app.exec()
?
app.exec()
调用?”根据他所展示的内容,难道不应该是 需要 吗? - Tay2510app.exec()
,代码可以在Qt 4.6.2中工作。期望的解决方案是找到一种不阻塞主线程的方法来使用 Qt EventLoops。在4.8.4版本及以上,是否有可能使用 Qt 作为库而不阻塞主线程,并使用 QEventLoops(使信号/插槽正常工作)? - naabapp.exec()
调用。抱歉我不是在玩文字游戏,我只是想确保问题是什么。因为没有app.exec()
的情况已经被证明可以在 4.8 上工作了,为什么我们还要再次询问是否“没有”? - Tay2510