Russian Qt Forum
Ноябрь 25, 2024, 08:00 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QtService и QObject  (Прочитано 4111 раз)
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_ файлах.
Ребята, подскажите пожалуйста как быть  Непонимающий
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #1 : Август 30, 2012, 20:02 »

поставь QObject первым в списке наследования
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
virtual_root
Гость
« Ответ #2 : Август 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'

Может есть ещё какие-то способы использовать сигналы и слоты в службах?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #3 : Август 31, 2012, 14:51 »

ну тогда убери множественное наследование и сделай QObject полем класса, который и будет заниматься раздачей/приёмом сигналов
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
virtual_root
Гость
« Ответ #4 : Август 31, 2012, 15:00 »

всё-таки собралось, я пересобрала всё и вроде без ошибок. Но у меня остаётся вопрос:
будет ли всегда срабатывать нормально приём сигналов и слотов, если само приложение у меня создаётся раньше в (QtService) и в нем у меня запускается цикл обработки событий. Как будет вести себя QObject ?
Записан
virtual_root
Гость
« Ответ #5 : Август 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();
   }
}
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.129 секунд. Запросов: 23.