Подтвердить что ты не робот

Как и почему режим QuickEdit в командных запросах заморозит приложения?

Недавно я столкнулся с проблемой с командной строкой в ​​Windows, где был включен режим QuickEdit, и щелчок по окну выбирал текст и вешал запущенную программу. Это, по-видимому, известное поведение - я нашел несколько связанных с ним вопросов:

Как приложение "приостановлено" / "приостановлено"? Является ли процесс похожим на сигнал SIGSTOP на * nix? (Мне также интересно понять, почему эта функциональность существует в первую очередь? Это кажется неинтуитивным и опасным.)

4b9b3361

Ответ 1

Это очень по дизайну. Там нет разумного способа, которым пользователь может выбрать текст, когда ваша программа продолжает прокручивать содержимое окна консоли. Таким образом, консольная хост-программа просто перестает читать ваш вывод stdout/stderr, и ваша программа зависает, пока пользователь не завершит операцию. Это можно изменить, вам нужно будет вызвать Get + SetConsoleMode() и отключить параметр ENABLE_QUICK_EDIT_MODE.

Обратите внимание, что эта "зависание" принципиально не отличается от пауз выполнения, которые вы получаете, когда ваша программа генерирует вывод stdout со скоростью, намного превышающей ее хост. Хотя эти задержки конечны.

И это не единственный способ, которым пользователь может остановить вашу программу, он также может просто нажать Ctrl + S. Нажатие Ctrl + Q возобновляет его снова. Если вы достаточно взрослые, вы можете распознать эти управляющие коды как Xon/Xoff, символы рукопожатия для терминала. Это то, что на самом деле представляет собой консоль, простая эмуляция терминала так же, как и в 1970-х годах. Это также можно изменить, вам придется перестать полагаться на встроенный буферный ввод в консоль и переключиться на ReadConsole(). Или, отключив опцию консоли ENABLE_LINE_INPUT, не так уверен, какие побочные эффекты, которые с тех пор, как вы не упоминали о какой-либо языковой среде, вам придется попробовать.

И, конечно, прекратить свою программу очень легко. Вы получаете EOF на stdin, когда пользователь набирает Ctrl + Z, что должно закончиться вашей программой. И есть Ctrl + C и Ctrl + Break для мгновенного завершения, независимо от того, что делает ваша программа. Вы можете получить уведомление для них с помощью SetConsoleCtrlHandler(), но вы не можете его заблокировать.

Если поведение по умолчанию опасно и рискует здоровьем человека, я настоятельно рекомендую вам нанять консультанта. И не знаю, кто написал этот ответ.

Ответ 2

У меня было много проблем, когда я выяснил, почему мое приложение С# некоторое время не отвечало, пока я не нажал клавишу! Для тех, кто нуждается в программном отключении QuickEdit, посмотрите здесь.