В этом ответе предлагается несколько иной подход, но он позволяет избежать многих сложностей, которые вы бы представили, используя текущий метод. Я надеюсь, что возможно реализовать эти упрощения.
Используйте termio для отключения канонического режима.
Пример кода (здесь) точно покажет, как настроить такой входной цикл. Этот пример «опрашивает и спит», что может означать задержку, если вы не уменьшите сон. Также я думаю , что вы можете использовать termio для установки таймаута (подождите секунду и верните 'no input' или дайте мне ввод NOW, если он наступит раньше). Но если вы действительно собираетесь следить за другим процессом, опрос может быть более гибким вариантом. Вы действительно можете опрашивать 30 раз в секунду и жить с ударом процессора .00001%, который он вызовет, но вам понравится простота и ошибка профилактика это дает.
Избегайте множественных потоков и процессов, таких как чума
Вам не нужно использовать 2 процесса / потока, если единственная проблема, которую вы пытаетесь решить, это то, что getch () блокирует. Это потребовалось бы, если бы было невозможно предотвратить блокировку входных функций. «Канонический» (основанный на правилах) означает, что действуют всевозможные «правила», например, «не вводите данные в программу, пока не нажмете ENTER». Для полноэкранного консольного приложения вы хотите, чтобы отключил все правила и делал все сам.
Поставь главный поток, отвечающий за окно ...
... Тогда вы можете просто использовать ansi escape csi коды , чтобы переместить курсор туда, где вы хотите. Предостережение: вы не можете писать в нижнем правом окне на экране. Все будет прокручиваться.
В программировании MS Windows есть раздражающая вещь, где только поток, который создает окно, может безопасно обновить его. На самом деле есть причина для этого. Будь то консоль или оконная система. рано или поздно, если у вас есть несколько потоков / обработок, попадающих на одно устройство вывода, вы прервете escape-последовательность (или вам придется создать дополнительный код для управления этим, что плохо), будете бороться за выходной «порт» и т. д. . вам нужен один поток для управления выводом.
если вы действительно заботитесь о том, что делает какой-то другой поток или процесс, просто отметьте это в цикле управления главной консоли. Например, у вас есть другой процесс, который вы просто хотите сообщить о своем прогрессе, запустите его из вашей программы, запишите его стандартный вывод и посмотрите на него; другой поток, просто заблокируйте что-то общее, что вы можете проверить в своей процедуре опроса. Черт возьми, если это просто байт, и он используется только для статусов, даже не блокируйте эту чертову штуку. Вы также можете добавить пару GOTO, просто чтобы показать свою индивидуальность: -)
предостережение Я не знаю, что ncurses будет хорошо с вами играть, если вы будете вручную связываться с termio? Я предполагаю, что он хочет сделать это сам. Никогда не пробовал смешивать. Если ваше приложение простое, вы можете использовать его самостоятельно без помощи, особенно если вы можете заставить ncurses делать то, что вы хотите. Я не эксперт по тем приложениям, о которых вы упомянули, но держу пари, что они все управляют микро.