Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.06.29;
Скачать: CL | DM;

Вниз

TServiceApplication и два TService   Найти похожие ветки 

 
Igor_ ©   (2005-04-30 02:40) [0]

Мне нужно написать приложение, в котором будут несколько сервисов. Я с сервисами раньше не сталкивался, поэтому для тестирования написал сервис, который запускает поток а тот просто вызывает Beep - здесь было все ОК.
Приведу исходники (писано на BCB6)

поток:

//----------------------------------------------------
__fastcall DbGuardSrvcThead::DbGuardSrvcThead(bool CreateSuspended, int mSecs, int uType)
   : TThread(CreateSuspended)
{
   _mSecs = mSecs;
   _uType = uType;
}
//----------------------------------------------------
void __fastcall DbGuardSrvcThead::Execute()
{
   while (!this->Terminated){
       MessageBeep(_uType);
       Sleep(_mSecs);
   }
}
//----------------------------------------------------

И собственно сервис:

__fastcall TdBGuardService::TdBGuardService(TComponent* Owner)
: TService(Owner)
{
}
//----------------------------------------------------
TServiceController __fastcall TdBGuardService::GetServiceController(void)
{
return (TServiceController) ServiceController;
}
//----------------------------------------------------
void __stdcall ServiceController(unsigned CtrlCode)
{
dBGuardService->Controller(CtrlCode);
}
//----------------------------------------------------
void __fastcall TdBGuardService::ServiceStart(TService *Sender,
     bool &Started)
{
   _workThead = new DbGuardSrvcThead(true, 10000, MB_ICONHAND);
   _workThead->Priority = tpNormal;
   _workThead->FreeOnTerminate = true;
   _workThead->Resume();
   Started = true;        
}
//----------------------------------------------------
void __fastcall TdBGuardService::ServiceStop(TService *Sender,
     bool &Stopped)
{
   _workThead->Terminate();
   Stopped = true;
}
//----------------------------------------------------
void __fastcall TdBGuardService::ServicePause(TService *Sender,
     bool &Paused)
{
   _workThead->Suspend();
   Paused = true;
}
//----------------------------------------------------
void __fastcall TdBGuardService::ServiceContinue(TService *Sender,
     bool &Continued)
{
   _workThead->Resume();
   Continued = true;
}
//----------------------------------------------------


В этом случае все работает на ура.
Я добавил еще один сервис (сделал его полностью аналогичным, только имя поменял)
Тут начались непонятные для меня вещи.

И первый и второй сервис запускаются нормально. Когда я пытаюсь остановить (или поставить на паузу) второй сервис - сообщение приходит почему-то к первому (запускал отладчик) первый останавливается, а Windows выдает сообщение, что не может остановить 2-й сервис.

1-й сам по себе, даже если работает 2-й нормально запускается и ставится на паузу,останавливается.
2-й даже если работает сам, все равно глючит: не может поставиться на паузу, вроде останавливается - при этом окошко остановки висит, пока его руками не закроешь...

В общем, какая-то фигня..

Может кто-нибудь знает, что это такое? Или есть какие-нибудь идеи..


 
Digitman ©   (2005-04-30 14:29) [1]

совесть имей, да ?
форум предполагает Делфи-код, а ты оперируешь BCB-кодом ..

а проблема как минимум здесь :

void __fastcall TdBGuardService::ServiceStop(TService *Sender,
    bool &Stopped)
{
  _workThead->Terminate(); //здесь ты просто взвел флаг, предписывающий некоему своему трэду workThead принять меры к завершению, но отнюдь не завершающий этот трэд немедленно !
  Stopped = true; //и тут же, ничтоже сумняшеся, отвечаешь, мол, все в порядке, мол, все мои ВНУТРЕННИЕ "дела" по команде "стоп" безусловно завершены на сей момент (хотя workThead скорей всего как работал так и продолжает работать !)
}



Страницы: 1 вся ветка

Текущий архив: 2005.06.29;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.029 c
14-1117844669
Белолипский Александр
2005-06-04 04:24
2005.06.29
Я увлекаюся спортивною рыбалкой!


14-1117189726
Alexius
2005-05-27 14:28
2005.06.29
Помогите найти компонент!


1-1118314831
dimon2
2005-06-09 15:00
2005.06.29
Класс в другом модуле не найден


3-1116322658
Term
2005-05-17 13:37
2005.06.29
Запрос к базе в потоке


1-1118208961
Mefodiy
2005-06-08 09:36
2005.06.29
Число строк в документе Word