我想開發一個遠程一些自定義的QObject(實際上這個QObject訪問某些數據庫,並提出一些統計數據)的服務。爲此我使用QtService和QtRemoteObject,當我在一個簡單的QCoreApplication中託管遠程對象時,一切都很好,我可以連接到主機並運行插槽或獲取信號,但是當我在QtService上託管遠程對象時應用程序,我無法連接到主機,起初我想過防火牆,所以我爲應用程序添加了一個入站出站規則,但仍然不起作用。 代碼有點大(serval文件),如果你需要它的任何部分,我會提供它。QtService和QtRemoteObject如何使然後工作togather
服務類:
#include <QtService>
#include <QCoreApplication>
#include <QRemoteObjectHost>
#include "affairstatero.h"
class AffairStateService : public QtService<QCoreApplication>
{
public:
explicit AffairStateService(int argc, char** argv, const QString& name = "affair_state");
// QtServiceBase interface
protected:
void start() override;
void stop() override;
void pause() override;
void resume() override;
private:
AffairStateRemoteObject* _affairStateRO;
QRemoteObjectHost* _remotingHost;
};
CPP:
#include "affairstateservice.h"
#include <QDebug>
#include <QSqliteSettings>
AffairStateService::AffairStateService(int argc, char **argv, const QString &name):
QtService(argc,argv,name)
{
this->setServiceDescription("report affair states.");
this->setServiceFlags(QtService::CanBeSuspended);
qDebug() << "service starting ...";
}
void AffairStateService::start()
{
_affairStateRO = new AffairStateRemoteObject();
_remotingHost = new QRemoteObjectHost();
qInfo() << "Starting the service";
QSqliteSettings settings;
qInfo() << "Settings filename " << settings.fileName() << settings.organizationName() << settings.applicationName();
_affairStateRO->startTimer();
_remotingHost->setHostUrl(QUrl(settings.value("endpoint").toString()));
_remotingHost->enableRemoting(_affairStateRO, "AffairStateRO");
qInfo() << "Remoting on " << _remotingHost->hostUrl().toString();
qInfo() << "Done";
}
void AffairStateService::stop()
{
_affairStateRO->stopTimer();
_remotingHost->disableRemoting(_affairStateRO);
}
void AffairStateService::pause()
{
_remotingHost->disableRemoting(_affairStateRO);
}
void AffairStateService::resume()
{
_remotingHost->enableRemoting(_affairStateRO);
}
信息:10的Windows/X64 - Qt的5.9.1 MCVS2017