与 QProcess 和 VS C++ 进行实时通信时遇到问题
Trouble with live communication with QProcess and 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;
我认为问题在于您从未将 行 写入 child 进程,您只是...
process->write("left");
没有换行符。同时 child 正在执行...
getline(cin, input_line);
等待换行符。
关闭写入通道似乎有效的原因是它会导致 child 中的 getline
调用接收 end-of-file 条件和 return。但是,它还会在输入流的状态中设置 eofbit
,导致立即进一步调用 getline
到 return:因此您引用的 "continuous stream of output"
。
尝试将 MainWindow::on_pushButton_2_pressed
的实现更改为...
void MainWindow::on_pushButton_2_pressed ()
{
process->write("left\n");
process->waitForBytesWritten();
}
并将 child 的源代码更改为...
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
等可以很方便,但应该避免。更好地连接和处理各种可用的 signals。
我正在尝试在 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;
我认为问题在于您从未将 行 写入 child 进程,您只是...
process->write("left");
没有换行符。同时 child 正在执行...
getline(cin, input_line);
等待换行符。
关闭写入通道似乎有效的原因是它会导致 child 中的 getline
调用接收 end-of-file 条件和 return。但是,它还会在输入流的状态中设置 eofbit
,导致立即进一步调用 getline
到 return:因此您引用的 "continuous stream of output"
。
尝试将 MainWindow::on_pushButton_2_pressed
的实现更改为...
void MainWindow::on_pushButton_2_pressed ()
{
process->write("left\n");
process->waitForBytesWritten();
}
并将 child 的源代码更改为...
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
等可以很方便,但应该避免。更好地连接和处理各种可用的 signals。