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

これは、最後のquitコマンド(テストプログラムを終了する)を送信しない限り機能しません。

これが私の読み取りコマンドです:

void TCD2_GUI::appendTextBox(){
    stdoutput->append("new output available: \n");
    QByteArray newData = tcd->readAllStandardOutput();
    stdoutput->append(QString::fromLocal8Bit(newData));
}

quitを送信すると、送信したすべてのものを含め、プログラムからのすべての出力が一度に取得されます。

私はここで何が間違っているのですか?

リクエストに応じて、プログラムからのコードは次のとおりです。

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

ドキュメントから:

QTcpSocket やQProcessなど、QIODevice の特定のサブクラスは非同期です。つまり、write() や read() などの I/O 関数は常にすぐに戻りますが、デバイス自体との通信は、制御がイベント ループに戻ったときに発生する可能性があります。QIODevice は、呼び出し元のスレッドをブロックし、イベント ループに入ることなく、これらの操作を強制的にすぐに実行できる機能を提供します。

...

waitForBytesWritten() - この関数は、データの 1 つのペイロードがデバイスに書き込まれるまで、呼び出しスレッドでの操作を一時停止します。

...

これらの関数をメインの GUI スレッドから呼び出すと、ユーザー インターフェイスがフリーズする可能性があります。

リンク

于 2011-02-09T19:52:34.077 に答える