Jump to content
СофтФорум - всё о компьютерах и не только

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


Jin
 Share

Recommended Posts

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

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

Link to comment
Share on other sites

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 - не знаю покуда...

Link to comment
Share on other sites

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

____________________________________________________________________

М

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

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

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

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

Edited by matva
Link to comment
Share on other sites

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

Link to comment
Share on other sites

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) не нарушатся данные, с которыми твоя прога работает.

Link to comment
Share on other sites

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

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

IsHungThread - 9х

IsHungAppWindow - нт.

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

NtQuerySystemInformation(SystemTimeInformation,...)

NtQuerySystemInformation(SystemPerformanceInformation,...)

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

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...