Проблемы с живым общением с QProcess и VS C ++ - PullRequest
1 голос
/ 19 апреля 2019

Я пытаюсь установить прямую связь между программой QT и программой VS C ++.Тем не менее, я могу читать что угодно, если не закрою канал записи, в котором я больше не могу ничего писать.Более того, код, который я сейчас читаю, читает непрерывный поток вывода, когда я записываю одну строку в программу VS C ++, когда она должна ожидать следующего ввода.Есть ли способ установить синхронную связь с двумя?Что не так с моей текущей программой?

Я прочитал документацию и не могу получить четкий ответ.

Мой код Qt:

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    process = new QProcess(this);
    connect(process, SIGNAL(readyReadStandardOutput()), this, SLOT(readOutput()));
    //connect(process, SIGNAL(readyReadStandardError()),this,SLOT(readOutput()));
    process->setArguments(args);
    process->setProgram("C:\\Users\\chten\\OneDrive\\Desktop\\QProcess\\test\\Debug\\test.exe");
    process->start();
    process->waitForStarted();
}

MainWindow::~MainWindow()
{
    delete ui;
}




void MainWindow::readOutput() {
    ui->input->append(process->readAllStandardOutput());
}

void MainWindow::on_pushButton_2_pressed()
{
    process->write("left");
    process->waitForBytesWritten();
    process->closeWriteChannel();

}

МойКод C ++:

    cout << "waiting for response..." << endl;
    string input_line;
    //getline(cin, input_line);
    //cout << input_line << endl;
    while (true) {
        getline(cin, input_line);
        cout << input_line << endl;

        for(int i = 0; i<9999999; i++){}
    }
    return 0;

1 Ответ

3 голосов
/ 19 апреля 2019

Я думаю, проблема в том, что вы никогда не пишете строку в дочерний процесс, у вас просто есть ...

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 и т. Д., Может быть удобным, но его следует избегать. Намного лучше подключаться и обрабатывать различные доступные сигналы .

...