使用QProcess和VS C ++进行实时通信时出现问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用QProcess和VS C ++进行实时通信时出现问题相关的知识,希望对你有一定的参考价值。

我正在尝试在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;
答案

我认为问题是你永远不会在子进程中写一行,你只需...

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
");
    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函数,如waitFoStartedwaitForBytesWritten等可能很方便,但应该避免。更好地连接和处理各种signals可用。

以上是关于使用QProcess和VS C ++进行实时通信时出现问题的主要内容,如果未能解决你的问题,请参考以下文章

VS DataBreakpoints:C 和 C++ 的区别

使用 C 在 Windows 上捕获和分析音频

使用WebSocket构建实时聊天

vs2010和vs2019double转wf_char

C#SerialPort多线程发送/接收冲突

使用C#应用程序与Arduino开发板进行通信