Russian Qt Forum

Qt => Вопросы новичков => Тема начата: virtual_root от Август 30, 2012, 15:40



Название: QtService и QObject
Отправлено: virtual_root от Август 30, 2012, 15:40
и снова добрый день) собственно, пытаюсь сделать службу приложение. Вот код:
Код
C++ (Qt)
class Service: public QtService<QCoreApplication>
   {
 
       drivenClient::Client _dc;
       drivenClient2::ClientForPlugin _dcP;
 
 
   public:
       Service(int argc, char **argv);
       Service();
       ~Service();
       void restartService();
 
   protected:
       void start();
       void stop();
       void pause();
       void resume();
       void processCommand(int code);
 
   };

Возникла проблема, в том что моя служба, которая запускается и работает должна принимать сигнал от другого класса, но я не могу сделать connect, так как класс службы не наследуется от QObject.
Пробовала сделать множественное наследование, но возникают ошибки в moc_ файлах.
Ребята, подскажите пожалуйста как быть  ???


Название: Re: QtService и QObject
Отправлено: kambala от Август 30, 2012, 20:02
поставь QObject первым в списке наследования


Название: Re: QtService и QObject
Отправлено: virtual_root от Август 31, 2012, 14:33
сделала как вы и сказали, но при использовании макроса Q_OBJECT вываливаются ошибки связанные с таблицей виртуальных функций.
Код
C++ (Qt)
#include "service/service.hpp"
#include "drivenClient/client.hpp"
#include "drivenClient/clientforplugin.h"
//#include "managerPlugin/managerplugin.h"
#include <QtCore/QCoreApplication>
#include <QObject>
 
namespace grabber
{
   class Service: public QObject,public QtService<QCoreApplication>
   {
 
 
       Q_OBJECT
 
   public:
       Service(int argc, char **argv);
       Service();
       ~Service();
       void restartService();
 
   protected:
       void start();
       void stop();
       void pause();
       void resume();
       void processCommand(int code);
   private:
       drivenClient::Client _dc;
       drivenClient2::ClientForPlugin _dcP;
 
   };
}
Код:
ошибка: undefined reference to `vtable for grabber::Service'

Может есть ещё какие-то способы использовать сигналы и слоты в службах?


Название: Re: QtService и QObject
Отправлено: kambala от Август 31, 2012, 14:51
ну тогда убери множественное наследование и сделай QObject полем класса, который и будет заниматься раздачей/приёмом сигналов


Название: Re: QtService и QObject
Отправлено: virtual_root от Август 31, 2012, 15:00
всё-таки собралось, я пересобрала всё и вроде без ошибок. Но у меня остаётся вопрос:
будет ли всегда срабатывать нормально приём сигналов и слотов, если само приложение у меня создаётся раньше в (QtService) и в нем у меня запускается цикл обработки событий. Как будет вести себя QObject ?


Название: Re: QtService и QObject
Отправлено: virtual_root от Август 31, 2012, 16:16
у меня ещё вопрос. В документации к QtService написано, что службой можно управлять с помощью класса QtServiceController из gui приложения. Написала свою службу, запустила, она работает. Пытаюсь с другого приложения поуправлять ей, но ничего не выходит...
Объясните, пожалуйста почему? Что я не так делаю?
Код службы:
Код
C++ (Qt)
#include <QDebug>
#include "service.hpp"
 
   Service::Service(int argc, char **argv)
       : QtService<QCoreApplication>(argc, argv, "tania")
 
   {
 
   }
 
   Service::~Service()
   {
 
   }
 
   void Service::start()
   {
       qDebug()<<"!!!!start!!!!";
   }
 
   void Service::restartService(){
       qDebug()<<"restart pora";
   }
 
   void Service::stop()
   {
       qDebug()<<"stop!";
   }
 
   void Service::pause()
   {
       Q_ASSERT(!"not impl");
 
   }
 
   void Service::resume()
   {
       Q_ASSERT(!"not impl");
 
   }
 
   void Service::processCommand(int code)
   {
       Q_ASSERT(!"not impl");
       qDebug()<<"comand geted!";
 
   }
 
 

Код при клике по кнопке в gui приложении:
Код
C++ (Qt)
void Widget::on_pushButton_2_clicked()
{
 
   QtServiceController *controller = new QtServiceController("tania");
   if (controller->isRunning()){
        QMessageBox::information(this, tr("Service Status"),
                                 tr("The %1 service is started").arg(controller->serviceName()));
        controller->sendCommand(3);
        controller->stop();
   }
}