Russian Qt Forum

Qt => Дополнительные компоненты => Тема начата: vbi от Ноябрь 25, 2010, 13:09



Название: Ошибка 109 при остановке сервиса под Windows (QtService)
Отправлено: 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"

Если это все запускать не как сервис, а как обычное приложение то никаких ошибок, не выдает.
Что делать?...


Название: Re: Ошибка 109 при остановке сервиса под Windows (QtService)
Отправлено: BRE от Ноябрь 25, 2010, 14:00
А что делается в run( int argc, char ** argv )?


Название: Re: Ошибка 109 при остановке сервиса под Windows (QtService)
Отправлено: vbi от Ноябрь 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, как описано выше
}


Название: Re: Ошибка 109 при остановке сервиса под Windows (QtService)
Отправлено: BRE от Ноябрь 25, 2010, 15:30
Мы про один и тот-же QtService говорим?
http://doc.trolltech.com/solutions/qtservice/qtservice.html


Название: Re: Ошибка 109 при остановке сервиса под Windows (QtService)
Отправлено: vbi от Ноябрь 25, 2010, 16:45
Да, но вообщето о новой версии:
http://doc.qt.nokia.com/solutions/4/qtservice/qtservice.html


Название: Re: Ошибка 109 при остановке сервиса под Windows (QtService)
Отправлено: ритт от Ноябрь 25, 2010, 20:29
судя по ошибке, обращение к невалидному указателю.


Название: Re: Ошибка 109 при остановке сервиса под Windows (QtService)
Отправлено: vbi от Ноябрь 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"


Название: Re: Ошибка 109 при остановке сервиса под Windows (QtService)
Отправлено: BRE от Ноябрь 25, 2010, 22:30
Ты бы побольше кода выкладывал, а то как-то в голове это все совмещать лениво.  :)


Название: Re: Ошибка 109 при остановке сервиса под Windows (QtService)
Отправлено: vbi от Ноябрь 25, 2010, 22:53
Да там кода.....
Я программу 3 месяца писал. + комерция, не хочется как-то выкладывать все  ::)
Спасибо на том. Главное уже без ошибок работает.
.... пока   ;D


Название: Re: Ошибка 109 при остановке сервиса под Windows (QtService)
Отправлено: ритт от Ноябрь 26, 2010, 00:09
угу, "QCoreApplication::postEvent: Unexpected null receiver" - это "без ошибок работает"...


Название: Re: Ошибка 109 при остановке сервиса под Windows (QtService)
Отправлено: vbi от Ноябрь 26, 2010, 01:52
согласен, но что это значит?


Название: Re: Ошибка 109 при остановке сервиса под Windows (QtService)
Отправлено: ритт от Ноябрь 26, 2010, 02:34
это значит, что ваша проблема с использованием невалидного указателя всё ещё актуальна - просто приняла иную форму...


Название: Re: Ошибка 109 при остановке сервиса под Windows (QtService)
Отправлено: ритт от Ноябрь 26, 2010, 02:37
Да там кода.....
Я программу 3 месяца писал. + комерция, не хочется как-то выкладывать все  ::)
Спасибо на том. Главное уже без ошибок работает.
.... пока   ;D
нам всё и не надо (и я склонен полагать, что нам ни строчки вашего кода не надо - это вам надо показать код чтобы другие указали на ошибку...или тред не об этом?), подозреваю, что будет достаточно посмотреть на декларацию и реализацию MyService - как оно есть сейчас...


Название: Re: Ошибка 109 при остановке сервиса под Windows (QtService)
Отправлено: vbi от Ноябрь 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);
}


Название: Re: Ошибка 109 при остановке сервиса под Windows (QtService)
Отправлено: BRE от Ноябрь 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, кто-то где-то еще пытается добраться до разрушенного объекта.


Название: Re: Ошибка 109 при остановке сервиса под Windows (QtService)
Отправлено: vbi от Ноябрь 26, 2010, 13:53
Нет, после stop() больше ни одна процедура не запускается.
Возможно это здесь:

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

srgLogServer - обявлен поза классом. И dMain широко его использует (отправляет и принимает сигналы). Возможно после удаления dMain, он еще пытается какой-то лог на него отправить.