Я работаю с несколькими системами Windows7-64. Во всех случаях, кроме одного, ввод ^ C в окно CMD с файлом .cmd неизменно (и, как ожидается,) останавливает программу. Что еще более важно, если сценарий .cmd запустил дорогостоящее в вычислительном отношении приложение Win32 (назовите его HIGHCPU), то очевидно, что приложение HIGHCPU слышит ^ C и завершает работу, вызывая завершение сценария .cmd.

Одна специальная машина действует так, как будто приложение HIGHCPU никогда не слышит ^ C. Это приложение просто продолжает работать. Если он завершается или я убиваю его процесс, сценарий .cmd внезапно замечает ^ C и спрашивает, должен ли сценарий быть остановлен.

На всех машинах ^ C действует как текст, выделенный при копировании, в других контекстах, как и ожидалось.

Я проверил, что если я запускаю приложение HIGHCPU непосредственно из командной строки, то ^ C немедленно заставляет его перестать работать и завершиться. Темный угол: HIGHCPU - очень сложное приложение для сборки; кроме того, он перехватывает исключения ^ C, используя стандартный Win32 SEH, и этот механизм перехвата заставляет его завершать работу с ненулевым состоянием.

У меня складывается впечатление, что я как-то настроил Win7 на одной машине, чтобы как-то относиться к ControlC для CMD windows.

1 ответ1

0

Похоже, что моя программа HIGHCPU явно не "включала обработку ^ C". Я добавил следующую строку:

SetConsoleCtrlHandler(NULL,FALSE); // enable ^C processing by our handler

перед уже существующей строкой в исходной программе HIGHCPU:

if(!SetConsoleCtrlHandler( (PHANDLER_ROUTINE) CtrlHandler, TRUE ) ) ...

и это, кажется, вылечило проблему.

На этой странице MS объясняется, что делает первый вызов:http://msdn.microsoft.com/en-us/library/windows/desktop/ms686016%28v=vs.85%29.aspx

Я немного удивлен этим; Такое поведение ^ C было "как и ожидалось" в каждой системе Windows, в которой HIGHCPU работает с 1997 года (Windows/NT). Это первый раз, когда я должен был что-то сделать, чтобы включить его. Документы не понятны в поведении по умолчанию («обрабатывает ^ C/ игнорирует ^ C»); Я полагаю, что в Windows 7 кто-то забыл инициализировать состояние этого бита или изменил способ его инициализации.

Тем не менее, это похоже на "забавную" коробку Windows7. Через несколько дней я узнаю, нарушает ли это поведение в другом месте.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .