2

我现在正在尝试从 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);

    }

}
4

1 回答 1

1

从文档:

QIODevice 的某些子类,例如 QTcpSocket 和QProcess,是异步的。这意味着诸如 write() 或 read() 之类的 I/O 函数总是立即返回,而当控制返回事件循环时,可能会发生与设备本身的通信。QIODevice 提供的功能允许您强制这些操作立即执行,同时阻塞调用线程并且不进入事件循环。

...

waitForBytesWritten() - 此函数暂停调用线程中的操作,直到一个有效负载数据已写入设备。

...

从主 GUI 线程调用这些函数可能会导致您的用户界面冻结。

关联

于 2011-02-09T19:52:34.077 回答