Я думаю, проблема в том, что вы никогда не пишете строку в дочерний процесс, у вас просто есть ...
process->write("left");
Нет новой строки. Тем временем ребенок исполняет ...
getline(cin, input_line);
ожидание разделителя новой строки.
Причина, по которой закрытие канала записи, по-видимому, работает, заключается в том, что он вызовет getline
в дочернем элементе для получения условия конца файла и возврата. Однако он также установит eofbit
в состоянии входного потока, в результате чего последующие вызовы к getline
будут немедленно возвращены: отсюда "continuous stream of output"
, на который вы ссылаетесь.
Попробуйте изменить реализацию MainWindow::on_pushButton_2_pressed
на ...
void MainWindow::on_pushButton_2_pressed ()
{
process->write("left\n");
process->waitForBytesWritten();
}
и измените исходный код ребенка на ...
std::cout << "waiting for response..." << endl;
std::string input_line;
while (std::getline(std::cin, input_line)) {
std::cout << input_line << std::endl;
for(int i = 0; i<9999999; i++) {
}
}
return 0;
(Все не проверено.)
Кроме того, использование Qt
функций, таких как waitFoStarted
, waitForBytesWritten
и т. Д., Может быть удобным, но его следует избегать. Намного лучше подключаться и обрабатывать различные доступные сигналы .