4

I have this simple C++ program:

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();
}

The output is:

Testing QProcess ...


done!

If I run "ls J:" from Windows cmd it works. What am I missing?

4

2 回答 2

5

在循环中使用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

当出现错误或子进程终止时,它应该退出循环,但继续阅读直到那时,没有超时。

注意:在“常规”Qt 程序中,您将运行事件循环,然后您不会调用waitForReadyRead()或其他类似的便利功能。他们会阻止事件循环并停止其他一切。在这样的程序中,您最好使用信号和插槽,或者开始使用线程(但这通常不是首选,它只会增加不必要的复杂性)。

于 2013-03-25T12:37:22.603 回答
3

QProcess文档说,QProcess当有数据可供读取时,该对象会发出信号:readyRead()andreadyReadStandardOutput()readyReadStandardError().

最简单的方法是将这些信号连接到您的插槽,并使用例如。readAllStandardOutput()那里。

当然海德斯循环也可以。

于 2013-03-25T12:39:49.817 回答