Вывод асинхронной консоли - PullRequest
       37

Вывод асинхронной консоли

4 голосов
/ 04 февраля 2011

У меня проблема с консолью win32 приложения.

Консоль используется для подачи команд моему приложению. Однако в то же время он используется для вывода сообщений журнала, которые в основном поступают из асинхронных потоков. Это становится проблемой, когда пользователь пытается записать некоторый ввод, и одновременно печатается асинхронное сообщение журнала, что приводит к перебоям в отображении ввода пользователя.

Я хотел бы получить совет относительно того, как справиться с такой ситуацией?

Можно ли, например, выделить последнюю строку в консоли для ввода, аналогично тому, как это выглядит в игровых консолях для некоторых игр?

Ответы [ 3 ]

6 голосов
/ 04 февраля 2011

Вы можете использовать SetConsoleMode , чтобы отключить входной эхо и режим редактирования строки. Затем вы можете повторить ввод, когда ваша программа готова это сделать. Обратите внимание, что это означает, что вам нужно будет реализовать такие вещи, как backspace вручную. И не забудьте сбросить режим обратно, когда закончите с консолью!

3 голосов
/ 04 февраля 2011

Это возможно при использовании API консоли, но это требует много работы, и все потоки, которые используют консоль, должны будут взаимодействовать, вызывая ваш метод вывода, а не прямой вызов функций API консоли или функций вывода библиотеки времени выполнения .

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

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

Вам захочется хорошо познакомиться с приставками Windows .

2 голосов
/ 04 февраля 2011

Каждый раз, когда у вас есть асинхронные потоки, пытающиеся обновить одно и то же устройство одновременно, у вас могут возникнуть подобные проблемы, если что-то их не синхронизирует.

Если у вас есть доступ к исходному коду каждого, возможно, вам нужно создать какой-то объект синхронизации, который каждая задача должна использовать для доступа к консоли (семафор и т. Д.).

...