Перейти к публикации
СофтФорум - всё о компьютерах и не только
Jin

Службы и процессы

Рекомендованные сообщения

Народ подскажите, как ревлизовать такую несложную схему:

У меня есть приложение, мне нужно добиться максимальной стабильности его работы, например,чтобы при подвисании оно само перезапускалось. Подумал и пришёл к выводу что проще вего это реализовать "прикрутив" это приложение к службам ОС. Возможно ли это сделать?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Jin

Для Виндовс.

Да, можно, но это запарнее.... У сервиса специальизированная структура приложения, его нужно регистрировать в системе, и т.п. Смотри в MSDN в Platform SDK, функцию ServiceMain, и по ссылке там можно выйти на Overview и подробно почитать.

Я бы сделал чуть иначе. Если состояние программы неважно (файлы, оперативные данные, и т.п), то запустить поток через CreateThread, в котором отслеживалось бы значение некой глобальной переменной. Значение этой переменной, нууу, например возрастает в процессе выполнения основного алгоритма - рассовать что-то типа g_dwWatchDogCount++; по тем местам, где может подвиснуть.

В следящем потоке, каждую секунду (Sleep(1000); ) проверять значение этой переменной. Если оно перестало изменяться, то CreateProcess() с именем своегo EXE в качестве параметра (подробне см. CreateProcess- в MSDN). А себе - TerminateProcess(GetCurrentProcess(),MY_HANG_ERROR_CODE); или ExitProcess(MY_HANG_ERROR_CODE).

И тогда советую все файлы открывать с FILE_SHARE_READ как минимум, и после каждой операции записи выполнять FlushFileBuffers.

Это если пишешь с использованием Win32 API. Насколько знаю, в борландовских библиотеках классов есть ср-ва работы с потоками и запуском/прекращением процессов. Но на АПИ точно доберешься до требуемого.

А, вот еще, что. Нужно обрабатывать исключения через try/catch, иначе, система сама может завершить процесс.

Как такое сделать в *nix - не знаю покуда...

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

У меня при выходе в интернет постоянный сбой процесса lsass, подскажите что можно сделать (Просьба: попроще, не все хакеры).

____________________________________________________________________

М

1. Читаем правила!

2. Используем поиск! там пишешь: lsass

Из найденного выбираешь то, что необходимо!

Второе предупреждение (последнее!)

Изменено пользователем matva

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

С организацией процесса, как службы я разобрался, для этого существует хорошая прога FireDaemon. Но он позваляет автономно перезапускать только полностью "упавшие" процессы, у меня чуть-чуть другая задача. Моё приложение требует перезапуска не при полном "упаде" а в случае когда он съедает около 50% процентов ЦП, т.е. нужна прога которая отслеживала этот параметр и при его зашкаливании убивала бы его(процесс). Может кто знает как достать этот параметр из винды?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

гусь

Глянь там служби есть

http://www.oszone.net/windows/winxp/services/index.shtm

Мне кажится что поможет тока формат ц.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Jin:

Кстати говоря, а в чем запара-то? Нормально написанный алгоритм даже опрашивающий что-то занимает около 0% процессорного времени.....

Найди точки, куда можно воткнуть Sleep()

ПРимер:

while(1)

{

if(kbhit()%(0x1B==getch()))

break;

Counter++;///многочегоеще

}

Отъест 90-98% времени. То же самое в виде

while(1)

{

if(kbhit()%(0x1B==getch()))

break;

Counter++;///многочегоеще

Sleep(30);

}

Не занимает практически ничего....

Если расскажешь о задаче более подробно, найдется более точный совет. А делать это внешней прогой - где гарантия, что 1)она не повиснет сама; 2) не нарушатся данные, с которыми твоя прога работает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Моё приложение требует перезапуска не при полном "упаде" а в случае когда он съедает около 50% процентов ЦП, т.е. нужна прога которая отслеживала этот параметр и при его зашкаливании убивала бы его(процесс). Может кто знает как достать этот параметр из винды?

Насчет сервисо - это действительно не лучшее решение. Можно организовать лишний поток, который следит за другими например по алгоритму который привел Andrew.Egorovsky, или просто за процессорным временем, отнимаемым программой. Или есть в винде функция, определяющая зависло приложение или нет. Точнее, 2 функции - для винд 9х и для нт:

IsHungThread - 9х

IsHungAppWindow - нт.

Ну а для определения сколько твоя прога ест процентов ЦП смотри

NtQuerySystemInformation(SystemTimeInformation,...)

NtQuerySystemInformation(SystemPerformanceInformation,...)

Но имхо лучшее решение - реализовать функции слежения и перезапуска в отдельной программе. Не будет усложняться твоя основная программа, да и шансов что после сбоя она будет перезапущена - больше :D

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

×