Форум: "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.117 c