psa1974
Full Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Maks150988 Не, пользовать "net stop" нехорошо. Если в батнике - то никуда не денешься, но в программе это не красиво и не управляемо. Плюс - запуск отдельного процесса интерпретатора, пусть даже и скрытого, а это лично мне вообще не нравится. Небольшое уточнение: зачем ты это делаешь в отдельном потоке? В это время основной поток что-то делает или просто чтобы интерфейс программы "дышал"? В любом случае, Sleep, на мой взгляд, некрасивое решение (особенно в основном потоке - пока Sleep не вернется, интерфейс не "дышит", поскольку не происходит выборка сообщений из очереди). Лучше сделать, как сказал greenpc: организовать ожидание останова службы в цикле проверкой ее статуса. Вот пример для использования в основном потоке (при необходимости, добавляем первым условием в while проверку not Terminated, как в примере greenpc): Код: // ...код остановки службы из примера greenpc... while (QueryServiceStatus(schService, ssStatus)) and (ssStatus.dwCurrentState = SERVICE_RUNNING) do begin {проверяем статус и если служба еще выполняется, то обрабатываем сообщения в очереди и заново проверяем} Application.processmessage; end; // вот тут служба уже остановлена, можно ее заново запускать | Этот код годится и в основном потоке (не требуется выносить в отдельный поток только для того чтобы интерфейс дышал), поскольку вызовом Application.processmessage организуется локальная петля сообщений и программа продолжает реагировать на внешние раздражители Можно организовать счетчик и скажем, вызывать Application.processmessage на каждом 50-м шаге, или вызывать тот же Sleep c малюсеньким временем, скажем 500 мс перед Application.processmessage, но это уже "бантики" А если уж хочешь использовать Sleep, можно ориентироваться на величину таймаута значение параметра WaitToKillServiceTimeout (плюс какая-то небольшая дельта) в ветке: [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control] - Это величина таймаута для всех служб в системе по-умолчанию (если сама служба не заказала себе иное значение), в течение которого, если служба не вернула системе свой статус, она считается зависшей. Т.е. опять же делать проверку статуса в цикле, со значением Слипа, равным WaitToKillServiceTimeout... | Всего записей: 438 | Зарегистр. 08-11-2005 | Отправлено: 12:03 08-10-2009 | Исправлено: psa1974, 12:22 08-10-2009 |
|