Асинхронный ввод с консоли Windows во время вывода - PullRequest
1 голос
/ 06 июня 2009

У меня проблемы с попыткой чтения ввода при выводе одновременно. Мне нужна консоль сервера для моей игры, которая может получать входные данные во время вывода и не портить буфер.

Например, я набираю «Hello world», и в процессе в консоль выводятся смерти, убийства и т. Д. Игрока, что приводит к чему-то вроде:

Привет * Игрок убил игрока2 * Мир

Заранее спасибо

Ответы [ 4 ]

4 голосов
/ 06 июня 2009

Вместо того, чтобы записывать вывод непосредственно в консоль, почему бы не вызвать окно графического интерфейса?

Тогда просто укажите одну область, куда направлен вывод, и отдельную область ввода внизу, где вы можете вводить команды. Что-то вроде того, как будет выглядеть клиент IRC.

Если это должно быть только консолью, я бы предложил использовать что-то вроде ncurses (или PDCurses) для создания текстового интерфейса.

1 голос
/ 06 июня 2009

Не задумываясь об этом, мне кажется, что вам нужна неблокирующая подпрограмма ввода для stdin, что-то вроде getch (), но она просто возвращает, если нечего читать, которую вы вызываете в цикле при обработке вывод или вам нужно два thraeds: один для чтения, другой для записи.

0 голосов
/ 09 июня 2009

Похоже, вам нужен слой между кодом и вашей консолью. Создайте объект-оболочку, который выполняет все операции ввода-вывода в консоли. Когда кто-то вызывает его метод WriteLine, оболочка должна стереть текущий отображаемый ввод (если есть), записать строку, а затем снова записать ввод под ней.

0 голосов
/ 08 июня 2009

Вы сами разрабатываете консоль, так что это не должно быть большой проблемой.

Консоль - это в основном набор текстовых строк, которые отображаются. Пользовательский ввод отражается, поэтому пользователь видит, что он печатает. Это означает, что последняя строка консоли является особенной, это «редактируемый входной буфер». Все остальные строки выводятся. Когда пользователь нажимает Enter, вы запускаете буфер редактирования. Шаг 1 при выполнении - создание приватной копии буфера редактирования, шаг 2 - очистка буфера редактирования, а шаг 3 - копирование приватной копии на выход.

Следовательно, в любой момент есть только одна частичная строка, и она изменяется только при вводе пользователем. Все остальные строки заполнены и меняются построчно. Журнал вашей программы происходит между двумя пользовательскими вводами и, следовательно, получает свою собственную строку. В многопоточной программе это означает, что для функции «Console :: AddLine» потребуется внутренний мьютекс (CriticalSection for Win32).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...