Jin Posted March 28, 2005 Report Share Posted March 28, 2005 Народ подскажите, как ревлизовать такую несложную схему: У меня есть приложение, мне нужно добиться максимальной стабильности его работы, например,чтобы при подвисании оно само перезапускалось. Подумал и пришёл к выводу что проще вего это реализовать "прикрутив" это приложение к службам ОС. Возможно ли это сделать? Quote Link to comment Share on other sites More sharing options...
Andrew.Egorovsky Posted March 28, 2005 Report Share Posted March 28, 2005 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 - не знаю покуда... Quote Link to comment Share on other sites More sharing options...
гусь Posted March 28, 2005 Report Share Posted March 28, 2005 (edited) У меня при выходе в интернет постоянный сбой процесса lsass, подскажите что можно сделать (Просьба: попроще, не все хакеры). ____________________________________________________________________ М1. Читаем правила! 2. Используем поиск! там пишешь: lsass Из найденного выбираешь то, что необходимо! Второе предупреждение (последнее!) Edited March 28, 2005 by matva Quote Link to comment Share on other sites More sharing options...
Jin Posted March 29, 2005 Author Report Share Posted March 29, 2005 С организацией процесса, как службы я разобрался, для этого существует хорошая прога FireDaemon. Но он позваляет автономно перезапускать только полностью "упавшие" процессы, у меня чуть-чуть другая задача. Моё приложение требует перезапуска не при полном "упаде" а в случае когда он съедает около 50% процентов ЦП, т.е. нужна прога которая отслеживала этот параметр и при его зашкаливании убивала бы его(процесс). Может кто знает как достать этот параметр из винды? Quote Link to comment Share on other sites More sharing options...
<N@O> Posted April 1, 2005 Report Share Posted April 1, 2005 гусь Глянь там служби есть http://www.oszone.net/windows/winxp/services/index.shtm Мне кажится что поможет тока формат ц. Quote Link to comment Share on other sites More sharing options...
Andrew.Egorovsky Posted April 4, 2005 Report Share Posted April 4, 2005 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) не нарушатся данные, с которыми твоя прога работает. Quote Link to comment Share on other sites More sharing options...
__alex Posted April 4, 2005 Report Share Posted April 4, 2005 Моё приложение требует перезапуска не при полном "упаде" а в случае когда он съедает около 50% процентов ЦП, т.е. нужна прога которая отслеживала этот параметр и при его зашкаливании убивала бы его(процесс). Может кто знает как достать этот параметр из винды? Насчет сервисо - это действительно не лучшее решение. Можно организовать лишний поток, который следит за другими например по алгоритму который привел Andrew.Egorovsky, или просто за процессорным временем, отнимаемым программой. Или есть в винде функция, определяющая зависло приложение или нет. Точнее, 2 функции - для винд 9х и для нт: IsHungThread - 9х IsHungAppWindow - нт. Ну а для определения сколько твоя прога ест процентов ЦП смотри NtQuerySystemInformation(SystemTimeInformation,...) NtQuerySystemInformation(SystemPerformanceInformation,...) Но имхо лучшее решение - реализовать функции слежения и перезапуска в отдельной программе. Не будет усложняться твоя основная программа, да и шансов что после сбоя она будет перезапущена - больше :D Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.