Jin Опубликовано 28 марта, 2005 Жалоба Поделиться Опубликовано 28 марта, 2005 Народ подскажите, как ревлизовать такую несложную схему: У меня есть приложение, мне нужно добиться максимальной стабильности его работы, например,чтобы при подвисании оно само перезапускалось. Подумал и пришёл к выводу что проще вего это реализовать "прикрутив" это приложение к службам ОС. Возможно ли это сделать? Ссылка на комментарий Поделиться на другие сайты Поделиться
Andrew.Egorovsky Опубликовано 28 марта, 2005 Жалоба Поделиться Опубликовано 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 - не знаю покуда... Ссылка на комментарий Поделиться на другие сайты Поделиться
гусь Опубликовано 28 марта, 2005 Жалоба Поделиться Опубликовано 28 марта, 2005 (изменено) У меня при выходе в интернет постоянный сбой процесса lsass, подскажите что можно сделать (Просьба: попроще, не все хакеры). ____________________________________________________________________ М1. Читаем правила! 2. Используем поиск! там пишешь: lsass Из найденного выбираешь то, что необходимо! Второе предупреждение (последнее!) Изменено 28 марта, 2005 пользователем matva Ссылка на комментарий Поделиться на другие сайты Поделиться
Jin Опубликовано 29 марта, 2005 Автор Жалоба Поделиться Опубликовано 29 марта, 2005 С организацией процесса, как службы я разобрался, для этого существует хорошая прога FireDaemon. Но он позваляет автономно перезапускать только полностью "упавшие" процессы, у меня чуть-чуть другая задача. Моё приложение требует перезапуска не при полном "упаде" а в случае когда он съедает около 50% процентов ЦП, т.е. нужна прога которая отслеживала этот параметр и при его зашкаливании убивала бы его(процесс). Может кто знает как достать этот параметр из винды? Ссылка на комментарий Поделиться на другие сайты Поделиться
<N@O> Опубликовано 1 апреля, 2005 Жалоба Поделиться Опубликовано 1 апреля, 2005 гусь Глянь там служби есть http://www.oszone.net/windows/winxp/services/index.shtm Мне кажится что поможет тока формат ц. Ссылка на комментарий Поделиться на другие сайты Поделиться
Andrew.Egorovsky Опубликовано 4 апреля, 2005 Жалоба Поделиться Опубликовано 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) не нарушатся данные, с которыми твоя прога работает. Ссылка на комментарий Поделиться на другие сайты Поделиться
__alex Опубликовано 4 апреля, 2005 Жалоба Поделиться Опубликовано 4 апреля, 2005 Моё приложение требует перезапуска не при полном "упаде" а в случае когда он съедает около 50% процентов ЦП, т.е. нужна прога которая отслеживала этот параметр и при его зашкаливании убивала бы его(процесс). Может кто знает как достать этот параметр из винды? Насчет сервисо - это действительно не лучшее решение. Можно организовать лишний поток, который следит за другими например по алгоритму который привел Andrew.Egorovsky, или просто за процессорным временем, отнимаемым программой. Или есть в винде функция, определяющая зависло приложение или нет. Точнее, 2 функции - для винд 9х и для нт: IsHungThread - 9х IsHungAppWindow - нт. Ну а для определения сколько твоя прога ест процентов ЦП смотри NtQuerySystemInformation(SystemTimeInformation,...) NtQuerySystemInformation(SystemPerformanceInformation,...) Но имхо лучшее решение - реализовать функции слежения и перезапуска в отдельной программе. Не будет усложняться твоя основная программа, да и шансов что после сбоя она будет перезапущена - больше :D Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Для публикации сообщений создайте учётную запись или авторизуйтесь
Вы должны быть пользователем, чтобы оставить комментарий
Создать учетную запись
Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!
Регистрация нового пользователяВойти
Уже есть аккаунт? Войти в систему.
Войти