Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2005.06.29;
Скачать: [xml.tar.bz2];

Вниз

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 вся ветка

Форум: "WinAPI";
Текущий архив: 2005.06.29;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.049 c
14-1117797762
Aldor
2005-06-03 15:22
2005.06.29
Автоматические телефонные сервисы


14-1117908515
Udaff
2005-06-04 22:08
2005.06.29
проблема с печатью


1-1118063196
Иван П.
2005-06-06 17:06
2005.06.29
Первое-последнее число текущего месяца в DateTimePicker


6-1112392985
Muh
2005-04-02 02:03
2005.06.29
Почему у флешгета получается, а у меня нет :)


4-1114721597
i-s-v
2005-04-29 00:53
2005.06.29
Постраничная организация памяти?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский