我正在尝试从qprocess读取和写入。我做了一个小测试程序,接受输入并在循环中重新显示在屏幕上。这是我的Qt代码
QString path = "./test";
tcd = new QProcess(this);
QStringList args;
args << "";
tcd->start(path,args);
if(!tcd->waitForStarted(3000))
{
stdoutput->append("<h1><font color=red>There was a problem starting the software, please try running the program again.</font></h1>");
}
tcd->write("hello\n");
tcd->write("hello\n");
tcd->write("hello\n");
tcd->write("hello\n");
//tcd->write("quit\n");
QObject::connect(tcd, SIGNAL(readyReadStandardOutput()), this, SLOT(appendTextBox()));
除非我发送最后一次退出命令(终止我的测试程序),否则这将无效。
这是我的阅读命令:
void TCD2_GUI::appendTextBox(){
stdoutput->append("new output available: \n");
QByteArray newData = tcd->readAllStandardOutput();
stdoutput->append(QString::fromLocal8Bit(newData));
}
如果我发送退出,我会立即从程序中获取所有输出,包括我发送的所有内容。
我在这里做错了什么?
根据要求,以下是该计划的代码:
int main(int argC[], char* argV[]){
printf("Welcome!\n");
char* input = malloc(160);
gets(input);
while(strcmp(input,"quit") != 0)
{
printf("Got input %s\n", input);
gets(input);
}
}
答案 0 :(得分:1)
来自doc:
QIODevice的某些子类,例如 作为QTcpSocket和 QProcess ,是 异步。这意味着I / O. write()或read()等函数 总是立刻回来,而 与设备本身通信 当控制权回归时,可能会发生 事件循环。 QIODevice提供 允许你强制的功能 这些操作要执行 立即,同时阻止了 调用线程而不进入 事件循环。
...
waitForBytesWritten() - 这个函数 暂停呼叫中的操作 线程,直到一个数据有效负载 已被写入设备。
...
从主要调用这些函数, GUI线程,可能会导致您的用户 界面冻结。