3

QProcessを使用して、readyReadStandardOutputをスロットに接続します。しかし、スロットを開始した後、2回実行します。なぜですか?

{
    myProcess = new QProcess(parent);
    myProcess->start("mayabatch.exe -file "+scene);
    connect(myProcess, SIGNAL(readyReadStandardOutput()), this, SLOT(readOutput()));
}

void MainWindow::readOutput()
{
    qDebug()<<"Read";
    QByteArray outData = myProcess->readAllStandardOutput();
    qDebug()<<QString(outData);
}

出力:

Read 
"File read in 0 seconds.
" 
Read 
"cacheFi" 
Read 
"le -attachFile -fileName "nClothShape1" -directory ...

最後の文字列が壊れていました。単語の間に「読み取り」が表示されます。

4

1 に答える 1

8

のドキュメントからQProcess::readyReadStandardOutput()

このシグナルは、プロセスが標準出力チャネル (stdout) を介して新しいデータを利用できるようにしたときに発行されます。現在の読み取りチャネルに関係なく発行されます。

スロットは、基になるプロセスが個別のランダムな方法で出力をフラッシュしたという単純な理由で、複数回実行されます。これは、制御できないものに依存するため、気にする必要はありません。

出力全体を保存したい場合は、次のことを行う必要があります

void MainWindow::readOutput(){
   bigbuffer.append(myProcess->readAllStandardOutput();)
}

行ごとに読みたい場合は、

void MainWindow::readOutput(){
   while(myProcess.canReadLine()){
       qDebug() << myProcess.readLine();
  }
}

2 番目の呼び出しは、プロセス バッファにデータを残して、「壊れた」読み取りがないようにしますcacheFi

于 2013-02-01T10:18:41.860 に答える