我有这个简单的C++程序:
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QProcess ps;
QByteArray ba;
ps.start("ls J:");
ba = ps.readAllStandardOutput();
char *someData = ba.data();
cout << "Testing QProcess ..." << endl;
cout << someData << endl;
cout << "done!" << endl;
return a.exec();
}
Run Code Online (Sandbox Code Playgroud)
输出是:
Testing QProcess ...
done!
Run Code Online (Sandbox Code Playgroud)
如果我从Windows cmd运行"ls J:"它可以工作.我错过了什么?
在循环中使用QIODevice :: waitForReadyRead(),然后才返回,然后调用readAllStandardOutput().正如文档中所述,QProcess::readAllStandardOutput()将读取所有可用数据,但不会等待.在开始阅读之前,您需要等待该过程开始QProcess::waitForStarted().
快速未经测试的部分代码,替换ba = ps.readAllStandardOutput();为:
if (ps.waitForStarted(-1)) {
while(ps.waitForReadyRead(-1)) {
ba += ps.readAllStandardOutput();
}
}
// else report error or whatever
Run Code Online (Sandbox Code Playgroud)
当出现错误或子进程终止时,应该退出循环,但在此之前保持读取,没有超时.
注意:在"常规"Qt程序中,您将运行事件循环,然后您将不会调用waitForReadyRead()或其他类似的便利功能.他们会阻止事件循环并停止其他一切.在这样的程序中,你最好使用信号和插槽,或者用线程开始乱码(但这通常不是优选的,它只会增加不必要的复杂性).
| 归档时间: |
|
| 查看次数: |
8388 次 |
| 最近记录: |