Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

OnStop в службе... [D7]


Makhanev Alexander ©   (2007-07-13 20:31:00) 

Есть служба, которая иногда делает рутинные операции, занимающие ~ минуу (аплоад файлов по фтп).

Тесты показывают, что когда в момент выполнения рутинной операции сервис стопается (программно, через controlservice), то событие OnStop не наступает. Оно и не наступает потом, после завершения операции.

Есть идеи что может быть не так и как выкрутиться?

А то служба потом только вручную стопается..


Сергей М.   (2007-07-16 08:19:00) [1]

К чему этот код ?

Код метода Execute приводи.


Makhanev Alexander   (2007-07-14 19:43:00) [2]

всё же ProcessRequests не всегда срабатывал и вариант с цикличным выполнением stop (пока не остановится) пока работает стабильно.

хотя msdn вроде пишет, что после посылки стопа ничего не надо слать...

кто знает, какая здесь есть потенциальная опасность?


     ControlService(hService, SERVICE_CONTROL_STOP, State);
     QueryServiceStatus(hService, State);
     j := 0;
     while (j < 20) and (State.dwCurrentState <> SERVICE_STOPPED) do
     begin
       ControlService(hService, SERVICE_CONTROL_STOP, State);
       Sleep(1000);
       QueryServiceStatus(hService, State);
       Inc(j);
     end;


Сергей М.   (2007-07-14 11:58:00) [3]


> Оно и не наступает потом, после завершения операции


И не наступит. Так задумано - OnStop возникает лишь как ответная реакция сервиса на требование SCM остановиться.

Естественно, если сервис чем-то занят и не может вовремя обработать SCM-команду останова (попросту "проспал" ее появление), событие тоже не возникнет.


> аналога processmessages в сервисах нет?


Есть. ProcessRequests()


Makhanev Alexander   (2007-07-14 10:24:00) [4]

кстати, а аналога processmessages в сервисах нет?


Makhanev Alexander   (2007-07-14 10:15:00) [5]


> Т.е. сервис взаимодействует с рабочим столом? Тогда плохой
> стиль.
> Остается асинхронная работа с сокетом.


Он не взаимодействует с раб. столом. Он просто юзает невизуальный компонент ftpClient из ICS. Я точно не знаю, относится оно к VCL или нет и соответсвтенно, можно с ним работать в потоке или нет..


atruhin   (2007-07-14 04:39:00) [6]

> я юзаю vcl компонет

Т.е. сервис взаимодействует с рабочим столом? Тогда плохой стиль.
Остается асинхронная работа с сокетом.


Makhanev Alexander   (2007-07-13 23:19:00) [7]


> Хотя чем не целесообразен доп. поток не понятно.


я юзаю vcl компонет и если постоянно делать synchronize то в чем смысл потока ? он сможет среагировать на сообщение?


atruhin   (2007-07-13 22:19:00) [8]

> хочется понять почему всё же нет события.

Потому что некому на него реагировать. Основной поток сервиса не отвечает.

> Я б рад вынести рутинную операцию в поток, но там это малоцелесообразно

Работать с сетью в асинхронном режиме, не будет подвисания.
Хотя чем не целесообразен доп. поток не понятно.


Makhanev Alexander   (2007-07-13 20:39:00) [9]

когда стопаю вручную в момент уртинных операций, то винда пишет что


> Не удалось остановить службу XXX на Локальный компьютер.
> Эта служба не возвращала ошибки. Возможно, это внутренняя ошибка Windows или внутренняя ошибка службы.
> Если проблема не исчезает, обратитесь к системному администратору.
>


При повторной попытке служба стопается. Но событие OnStop всё равно не ловится.

Я б рад вынести рутинную операцию в поток, но там это малоцелесообразно и хочется понять почему всё же нет события.


Наверх

Титульная страница Поиск, карта сайта Написать письмо