Текущий архив: 2007.09.23;
Скачать: CL | DM;
ВнизOnStop в службе... Найти похожие ветки
← →
Makhanev Alexander (2007-07-13 20:31) [0]Есть служба, которая иногда делает рутинные операции, занимающие ~ минуу (аплоад файлов по фтп).
Тесты показывают, что когда в момент выполнения рутинной операции сервис стопается (программно, через controlservice), то событие OnStop не наступает. Оно и не наступает потом, после завершения операции.
Есть идеи что может быть не так и как выкрутиться?
А то служба потом только вручную стопается..
← →
Makhanev Alexander (2007-07-13 20:39) [1]когда стопаю вручную в момент уртинных операций, то винда пишет что
> Не удалось остановить службу XXX на Локальный компьютер.
> Эта служба не возвращала ошибки. Возможно, это внутренняя ошибка Windows или внутренняя ошибка службы.
> Если проблема не исчезает, обратитесь к системному администратору.
>
При повторной попытке служба стопается. Но событие OnStop всё равно не ловится.
Я б рад вынести рутинную операцию в поток, но там это малоцелесообразно и хочется понять почему всё же нет события.
← →
atruhin © (2007-07-13 22:19) [2]> хочется понять почему всё же нет события.
Потому что некому на него реагировать. Основной поток сервиса не отвечает.
> Я б рад вынести рутинную операцию в поток, но там это малоцелесообразно
Работать с сетью в асинхронном режиме, не будет подвисания.
Хотя чем не целесообразен доп. поток не понятно.
← →
Makhanev Alexander (2007-07-13 23:19) [3]
> Хотя чем не целесообразен доп. поток не понятно.
я юзаю vcl компонет и если постоянно делать synchronize то в чем смысл потока ? он сможет среагировать на сообщение?
← →
atruhin © (2007-07-14 04:39) [4]> я юзаю vcl компонет
Т.е. сервис взаимодействует с рабочим столом? Тогда плохой стиль.
Остается асинхронная работа с сокетом.
← →
Makhanev Alexander (2007-07-14 10:15) [5]
> Т.е. сервис взаимодействует с рабочим столом? Тогда плохой
> стиль.
> Остается асинхронная работа с сокетом.
Он не взаимодействует с раб. столом. Он просто юзает невизуальный компонент ftpClient из ICS. Я точно не знаю, относится оно к VCL или нет и соответсвтенно, можно с ним работать в потоке или нет..
← →
Makhanev Alexander (2007-07-14 10:24) [6]кстати, а аналога processmessages в сервисах нет?
← →
Сергей М. © (2007-07-14 11:58) [7]
> Оно и не наступает потом, после завершения операции
И не наступит. Так задумано - OnStop возникает лишь как ответная реакция сервиса на требование SCM остановиться.
Естественно, если сервис чем-то занят и не может вовремя обработать SCM-команду останова (попросту "проспал" ее появление), событие тоже не возникнет.
> аналога processmessages в сервисах нет?
Есть. ProcessRequests()
← →
Makhanev Alexander (2007-07-14 19:43) [8]всё же 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-16 08:19) [9]К чему этот код ?
Код метода Execute приводи.
Страницы: 1 вся ветка
Текущий архив: 2007.09.23;
Скачать: CL | DM;
Память: 0.46 MB
Время: 0.039 c