Главная страница
    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.45 MB
Время: 0.041 c
4-1114757945
Merlot
2005-04-29 10:59
2005.06.29
Как отловить выключение windows.


4-1115604301
Antoxa
2005-05-09 06:05
2005.06.29
Подскажите. Есть ярлыка на рабочем столе в т.ч. и мой надо чтобы


4-1115569421
read_me
2005-05-08 20:23
2005.06.29
узнать имя файла из url


1-1117654366
Drow
2005-06-01 23:32
2005.06.29
непонятный Error


1-1118310092
_BasiL_
2005-06-09 13:41
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский