У меня длинное консольное приложение Sender
, которое отправляет простой текст в STDOUT с использованием небуферизованного вывода, такого как cout << "Message" << flush()
. Я хочу создать диалоговое приложение MFC (с именем Receiver
), которое запускает Sender
и может читать его вывод. Receiver
также должен обнаруживать, когда Sender
умер, или можно убить Sender
, если он захочет. Sender
ничего не знает о Reciever
, и я не могу изменить код Sender
.
Моя первая попытка состояла в том, чтобы создать каналы с перенаправленными STDIN и STDOUT для дочернего процесса и использовать асинхронные вызовы ReadFileEx для чтения в Sender
данных. Это работает некорректно, и Я разместил отдельный поток об этих конкретных проблемах.
Мой вопрос: как я должен это делать, в общих архитектурных терминах? Я не хочу, чтобы основной цикл Receiver
блокировал или опросил, но должен использовать некоторый вкус Wait function.
У вас есть 2 основных варианта. Вариант 1, который вы уже пробовали, делает асинхронный (ака неблокирующий) IO для чтения/записи из дочернего процесса. Вариант 2 заключается в создании отдельного потока в процессе приема, который блокирует чтение/запись из/дочернего процесса.
Я бы рекомендовал вариант 2, я нахожу его намного проще. У вас тогда, конечно, есть проблема, как получить данные из вспомогательной нити в основной поток. Для этого вам понадобятся блокировки и, возможно, семафоры. Однако это должно быть меньше хлопот, чем неблокирующий IO.