![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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 всё равно не ловится.
Я б рад вынести рутинную операцию в поток, но там это малоцелесообразно и хочется понять почему всё же нет события.