2017-08-02 63 views
0

我想開發一個遠程一些自定義的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

回答

1

好吧,我會回答我的問題,這個問題在服務器端,我通過做QRemoteObjectHost::enableRemoting(&object,"Object");給遠程對象命名,但在客戶端,我只是購買了一個副本,而沒有給出源名稱,如QRemoteObjectNode::acquire<ObjReplica>();

我不知道到底是什麼,但我想QtRemoteObject將遠程對象設置爲沒有名稱的默認對象,但是當命名遠程對象時,我們需要獲取同名的副本,甚至如果源只是遠程處理一個對象。

當在服務器端遠程處理的對象作爲QRemoteObjectHost::enableRemoting(&obj, "Object");,在我們需要QRemoteObjectNode::acquire<ObjReplica>("Object");

它沒有涉及到QtService客戶端。

相關問題