Здравствуйте, Александр!
Решил вот внести ясность по поводу Ваших рассуждений на тему снятия
"зависших" задач в Win2000/XP:
"...меня вот раздражает софтовая "мелочь"
в виндузах - что в Win2k, что в WinXP: зачастую невозможность снять
задачу. Например, MS Word - если повис, хоть унажимайся в списке
задач кнопку "Снять задачу"... Видимо, винда туда сигнал
посылает о завершении, а приложение не реагирует... Странно, да?
:) Я для того вообще-то в диспетчер и залез, потому что оно не реагирует...
Действие-то простое: освободил дескриптор и память - и все. Ну да,
грубо, а что делать... Вот FAR в 99% случаев просто убивает процесс.
Без всяких прелюдий. Почему в винде-то это не всегда проходит?"
Именно потому, что при нажатии на кнопку "Снять задачу"
в диспетчере задач, происходит то же самое, что при закрытии приложения
"крестом" в правом верхнем углу, а именно: система "говорит"
приложению: "давай, закрывайся...", предоставляя тем самым
приложению возможность завершить работу корректно, с сохранением
данных и т.д. - что уж там в самом приложении на этот счет прописано.
Поэтому вполне понятно, что раз уж приложение "зависло",
т.е. не реагирует на внешние раздражители, то и на "Снять задачу"
оно тоже вполне может "положить". В таком случае в Windows
включается следующий алгоритм: система несколько раз повторяет сообщение
о закрытии данному приложению, увеличивая при этом интервал ожидания
реакции от приложения. Если по истечении нескольких попыток приложение
так и не отреагировало (не закрылось), пользователю выводится окошко
на тему "Приложение не отвечает. Снять задачу? <Да>/<Нет>".
Если пользователь говорит "да" - приложение (процесс)
тут же "прибивается". Если - "нет", то цикл
посылов приложению сообщений о закрытии повторяется. В принципе,
точные цифры - количество повторов, время ожидания и алгоритм его
увеличения от попытки к попытке - известны, но мне, честно говоря,
просто лень сейчас рыться в "ресурс кит'ах", "течнете",
и т.д. (не помню я сейчас точно, где именно это видел). На вскидку
- первая выдача сообщения "Приложение не отвечает. Снять задачу?"
происходит не более, чем через минуту после нажатия в диспетчере
задач кнопки "Снять задачу" - это в худшем случае.
Далее. В WinNT/2000/XP в диспетчере задач кроме вкладки "Приложения"
есть еще вкладка "Процессы", на которой присутствует кнопка
"Завершить процесс". Вот эта кнопка как раз "убивает"
процесс без лишних раздумий (предварительно, конечно, спросив пользователя,
а так ли он уверен, что ему это таки надо?), т.е. работает а-ля
"kill -9" в юниксах/линуксах. Так что если неохота ждать,
пока Windows попытается завершить работу приложения корректно -
пользуйтесь именно "завершением поцесса", а не "снятием
задачи".
Хинт: Как точно определить нужный процесс, чтобы не промахнуться?
Очень просто - в диспетчере задач на вкладке "Приложения"
кликаем правой кнопкой нужное приложение и из контекстного меню
выбираем пункт "Перейти к процессам". Сразу после чего
попадаем на вкладку "Процессы", причем курсор уже установлен
на соответствующий процесс - осталось только нажать кнопку "Завершить
процесс" и в ответ на запрос подтвердить свое решение.
Да, еще: Что касается Win'9x/ME то там снятие зависшего приложения
возможно только по алгоритму, аналогичному кнопке "Снять задачу"
в WinNT/2000/XP. Однако, т.к. Win'9x/ME сама по себе система менее
стабильная, то этот путь может и не принести нужного результата.
Тот же "зависший" FAR например - да и практически любое
Win32 _консольное_ приложение - в Win'9x/ME "убивать"
замучаешься. Проще перезагрузиться.
С уважением, Александр, MCP
|