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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Ошибка 109 при остановке сервиса под Windows (QtService)  (Прочитано 11360 раз)
vbi
Гость
« : Ноябрь 25, 2010, 13:09 »

Добрый день! У меня такая проблема. Я написал приложение с использованием QTService.

Как показано в примере, в методе Start() я создаю объект, наследованый от QObject:

Код:
obj= new MyObject();

В методе Stop()  я унечтожаю объект:

Код:
delete obj

Впрочем, все это, как и в примере (только в примере вместо MyObject - QLabel) работает нормально.

Но! Когда я в мой клас MyObject добавляю динамическую переменную типа QObject, и в конструкторе класса MyObject создаю ее, а в деструкторе уничтожаю
тоесть:
Код:
MyObject::MyObject()
{
      tmp = new QObject();
}

MyObject::~MyObject()
{
      delete tmp;
}


, то при попытке остановить сервис выдается ошибка: "Error 109: The pipe has been ended". Если деструктор оставить пустой:

Код:
MyObject::~MyObject()
{
      //delete tmp;
}

то все работает нормально.
Если делать так:

Код:
MyObject::~MyObject()
{
      tmp->deleteLater();
}

то вместо этой выдает ошибку "Error 1067 Process Terminated unexpectedly"

Если это все запускать не как сервис, а как обычное приложение то никаких ошибок, не выдает.
Что делать?...
Записан
BRE
Гость
« Ответ #1 : Ноябрь 25, 2010, 14:00 »

А что делается в run( int argc, char ** argv )?
Записан
vbi
Гость
« Ответ #2 : Ноябрь 25, 2010, 15:25 »

В каком run? типа в main?

Вот main.cpp, который запускает сервис:

Код:
#include "MyService.h"

MyLogServer *myLogServer;

int main(int argc, char *argv[])
{
    MyService service(argc, argv, "My service", "Description");
    return service.exec();
}

Вот процедура start:

Код:
void MyService::start()
{
    myLogServer = new MyLogServer(isDebugMode,sDebugOutput);
    dApp = application();
    dMain = new MyServiceMain(dApp); // класс от QObject в котором создается еще один QObject, как описано выше
}
Записан
BRE
Гость
« Ответ #3 : Ноябрь 25, 2010, 15:30 »

Мы про один и тот-же QtService говорим?
http://doc.trolltech.com/solutions/qtservice/qtservice.html
Записан
vbi
Гость
« Ответ #4 : Ноябрь 25, 2010, 16:45 »

Да, но вообщето о новой версии:
http://doc.qt.nokia.com/solutions/4/qtservice/qtservice.html
Записан
ритт
Гость
« Ответ #5 : Ноябрь 25, 2010, 20:29 »

судя по ошибке, обращение к невалидному указателю.
Записан
vbi
Гость
« Ответ #6 : Ноябрь 25, 2010, 22:21 »

У меня конструктор сервиса выглядит следующим образом:

Код:
MyService::MyService(int argc, char **argv, QString pServiceName, QString pServiceDescription)
    : QTService(argc, argv, pServiceName)
{
...
}

Я изменил его следующим обраом:

Код:
MyService::MyService(int argc, char **argv, QString pServiceName, QString pServiceDescription)
    : QTService(argc, argv, pServiceName),obj()
{
...
}

Ошибки пропали.
Но в режиме отладки, когда я отлаживаю процедуру stop();
в окне дебагера получаю текст: "QCoreApplication::postEvent: Unexpected null receiver"
Записан
BRE
Гость
« Ответ #7 : Ноябрь 25, 2010, 22:30 »

Ты бы побольше кода выкладывал, а то как-то в голове это все совмещать лениво.  Улыбающийся
Записан
vbi
Гость
« Ответ #8 : Ноябрь 25, 2010, 22:53 »

Да там кода.....
Я программу 3 месяца писал. + комерция, не хочется как-то выкладывать все  Строит глазки
Спасибо на том. Главное уже без ошибок работает.
.... пока   Смеющийся
Записан
ритт
Гость
« Ответ #9 : Ноябрь 26, 2010, 00:09 »

угу, "QCoreApplication::postEvent: Unexpected null receiver" - это "без ошибок работает"...
Записан
vbi
Гость
« Ответ #10 : Ноябрь 26, 2010, 01:52 »

согласен, но что это значит?
Записан
ритт
Гость
« Ответ #11 : Ноябрь 26, 2010, 02:34 »

это значит, что ваша проблема с использованием невалидного указателя всё ещё актуальна - просто приняла иную форму...
Записан
ритт
Гость
« Ответ #12 : Ноябрь 26, 2010, 02:37 »

Да там кода.....
Я программу 3 месяца писал. + комерция, не хочется как-то выкладывать все  Строит глазки
Спасибо на том. Главное уже без ошибок работает.
.... пока   Смеющийся
нам всё и не надо (и я склонен полагать, что нам ни строчки вашего кода не надо - это вам надо показать код чтобы другие указали на ошибку...или тред не об этом?), подозреваю, что будет достаточно посмотреть на декларацию и реализацию MyService - как оно есть сейчас...
Записан
vbi
Гость
« Ответ #13 : Ноябрь 26, 2010, 11:31 »

Вот, собственно, исходники сервиса Строит глазки:

.H

Код:
#ifndef MySERVICE_H
#define MySERVICE_H

#include "MyMain.h"

class MyService : public QtService<QCoreApplication>
{
private:
    MyMain* dMain;
    QCoreApplication* dApp;
    QString sRootPath;
    bool isDebugMode;

public:
    explicit MyService(int argc, char **argv, QString pServiceName, QString pServiceDescription);
    virtual ~MyService();
protected:

    void start();
    void stop();
    void pause();
    void resume();
    void processCommand(int code);
};

#endif // MySERVICE_H



.CPP

Код:
#include "MyService.h"

extern MDLogServer *srgLogServer;

MyService::MyService(int argc, char **argv, QString pServiceName, QString pServiceDescription)
    : QtService<QCoreApplication>(argc, argv, pServiceName),dMain()
{
    QString sPar = "";
    isDebugMode = false;
    setServiceDescription(pServiceDescription);
    setServiceFlags(QtServiceBase::Default);
    if(argc>1)
    {
        sPar = argv[1];
        if(sPar == "-e" || sPar == "-exec")
        {
            isDebugMode = true;
        }
    }
}

MyService::~MyService()
{

}

void MyService::start()
{
    srgLogServer = new MDLogServer(isDebugMode);
    dApp = application();
    dMain = new MyMain(dApp);
}

void MyService::stop()
{
     delete dMain;
     srgLogServer->deleteLater();
}

void MyService::pause()
{
    dMain->processCommand(0);
}

void MyService::resume()
{
    dMain->processCommand(1);
}

void MyService::processCommand(int code)
{
    dMain->processCommand(code);
}
Записан
BRE
Гость
« Ответ #14 : Ноябрь 26, 2010, 12:16 »

Добавь в методы start, stop, pause, resume, processComand отладочный вывод.
Код
C++ (Qt)
void MyService::start()
{
   qDebug() << "Start";
   srgLogServer = new MDLogServer(isDebugMode);
   dApp = application();
   dMain = new MyMain(dApp);
}
 
void MyService::stop()
{
    qDebug() << "Stop";
    delete dMain;
    srgLogServer->deleteLater();
}
 
...
 

И посмотри, какие методы и в какой последовательности будут вызываться.
Как мне кажется, после отработки stop, кто-то где-то еще пытается добраться до разрушенного объекта.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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