Как программа информирует консоль о запросе ввода?
Это больше теоретический вопрос, так как я хочу понять в какую сторону мне вообще нужно копать в решении моей задачи.
Пусть у нас есть программа, которая пишет в консоль раз в секунду какой-нибудь текст. Мы можем её запустить напрямую, через консоль PowerShell, через новый терминал Windows. Будем считать, что мы неплохие программисты и все работает программа выполняет свою задачу. Но именно мне одна деталь не дает покоя - а как консоль понимает, что программа ничего не запросила от пользователя? То есть через какую-бы мы консоль не запустили программу, сама консоль не будет позволять вводить данные.
Аналогично, если мы пишем программу, которая запрашивает строку из консоли и выводит её, то консоль уже будет позволять вводить данные, но опять же ровно в тот момент когда программа эти данные запросила. Добавив паузу после строки вводящей данные, мы ничего не сможем вводить в момент её действия.
Если перейти больше к сути, для чего это делаю, то это взаимодействие моей программы написанной на c#, через потоки ввода-вывода с некоторой другой абстрактной программой, которая использует эти потоки. Она в общем случае-то тоже может быть написана на c#. Проблема с которой я столкнулся в том, что я могу писать в стандартный поток ввода когда угодно. Безусловно отсутствие ограничение приятно, но возможно ли все же как-то узнать, запросила программа ввод, или нет?
Проверял свойства объекта представляющего стандартный поток ввода в c#, никакой зависимости между значениями этих свойств, когда программа запрашивает данные и не запрашивает найти не удалось
Никак она не знает. Когда запускается код запроса пользовательских данных, то он так же включает механизм "эха", т.е. введённый символ так же отправляется на вывод, чтобы пользователь видел свой труд.
Во время выполнения программы так же можно тыкать в клаву, и эти данные уйдёт на ввод, просто мы не видим их на экране. Бывают даже программы, где перед запуском кода запроса данных от пользователя они не очищают буфер и весь тот мусор, что мы жамкали раньше попадает на вход.
Получается все введенные символы в консоли (даже без нажатия enter) заносятся в стандартный поток ввода программы. Когда мы вызываем Console.ReadLine(), то стандартный поток ввода очищается, а уже следующие введенные символы, которые заносятся в него, отправляются в стандартный поток вывода?
Сергей, Да, enter служит только разделителем, что мол вот конец ввода. Насчёт очищает или нет в данном случае я не знаю, либо пробовать, либо код метода смотреть.
Для правильного вопроса надо знать половину ответа
А зачем консоли что-то понимать? Если ваша программа запущена в foreground, то она перехватывает stdin, stdout и stderr на себя и консоль просто ждёт завершения программы. Если запущена в фоне, то у неё свои потоки, никак не связанные с консолью, и консоли всё равно, что делает программа.
Понял, но смотрите, вот консоль может быть любая, как я сказал Windows Terminal или PowerShell, но они обе не позволяют вводить данные, пока они не запрошены, например с помощью Console.ReadLine(). Так, что ощущение, что какая-то обратная связь от программы к консоли все же имеется.
Сергей, Никакой обратной связи. Консоль - это отдельная программа. Она запускает вашу программу, отдаёт ей потоки ввода-вывода и ждёт, пока ваша програма не завершится и не вернёт потоки.