2011-02-09 121 views
2

我正试图从qprocess读取和写入现在。我做了一个小测试程序,它能够输入并在一个循环中重新显示它在屏幕上。下面是从Qt的QProcess读取和写入

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

    } 

} 

回答

1

从DOC:

QIODevice中的某些亚类,例如 如与QTcpSocket和QProcess中,是 异步。这意味着,当控制返回到事件循环时,总是可以立即返回诸如write()或read() 之类的函数,而与设备本身的 通信可能发生。 了QIODevice提供 功能,使您可以强制 这些操作的执行 立即,而阻断 调用线程,并没有进入 事件循环。

...

waitForBytesWritten() - 直到一个数据有效载荷 被写入设备,此功能 暂停在调用的 线程操作。

...

调用从主, GUI线程这些功能,可能会导致你的用户界面 冻结。

link

+0

是啊,但我追赶的信号,所以我不认为应该的问题。但也许我对此有所了解。无论如何,我把一个tcd-> waitForBytesWritten();在我的代码中,仍然没有。编辑:我有一个按钮,将输入发送到我的代码,所以它是在信号启动后,仍然没有。 – 2011-02-09 20:38:47