1

私はいくつかのユーザーテストを実行するプログラムを構築しており、非常に短い間隔(10ミリ秒ごと)でユーザーが行っていることに関するデータを記録する必要があります。ほとんどのデータはQTから見つけることができますが、残念ながら、マウスの動きを計算するために別のプログラムを使用する必要があります(マウスがすでに画面の端に当たっていても動きを取得する必要がありますが、QTは画面外の動きを無視します)。

そのため、低レベルのマウス入力を処理し、検出された座標の変化を出力するWindowsプログラムを作成しました。ただし、問題は、Windowsプログラムからデータを取得して、メインプログラムからの出力と一致させることができないことです。

私のメインプログラムでは、次のコードを使用しています。

mouseTracker = new QProcess();
mouseTracker->start("C:\\WindowsFun.exe",QIODevice::ReadWrite|QIODevice::Unbuffered);
mouseTracker->setProcessChannelMode(QProcess::MergedChannels);
connect(mouseTracker,SIGNAL(readyRead()), this, SLOT(readMouseData()),Qt::DirectConnection);

readMouseData関数は次​​のようになります。

void HideWindow::readMouseData(){
    QByteArray data = mouseTracker->readAll();
    QString text = QString(data);
    saveFileStream << text.toStdString();
}

このようなもののいくつかは不要かもしれません。この問題を解決するために、「MergedChannels」モードと「DirectConnection」ビットを追加しました。

私が得ている結果は、Windowsプログラムからの出力が、発生時にファイルストリームに挿入されるのではなく、100ミリ秒ごとに大きなブロックで表示されることです。どこかに埋める必要のあるバッファがあるか、readyRead()シグナルが処理されるまでに遅延があるようです。メインプログラムとQProcessの両方からリアルタイムで出力を取得する方法について誰か提案がありますか?(まあ、少なくとも10ms未満の遅延で)。

また、重要な場合は、Windows 7を実行し、メインプログラムのコンパイルにMinGWを使用し、マウスの動きを検出するWindowsプログラムにVisualStudio2008を使用しています。Windowsでの出力は次のようになります。

int xPosRelative = raw->data.mouse.lLastX;
int yPosRelative = raw->data.mouse.lLastY;
char output[100];
int n;
n = std::sprintf(output,"%d %d",xPosRelative,yPosRelative);
std::printf("%s\n",output,n);
std::fflush(0);

これ以上情報が必要な場合はお知らせください。

ありがとう、-Keilan

4

2 に答える 2

1

残念ながら、QProcessのWindows実装は、外部プロセスからのstdout/stderrを100ミリ秒ごとに1回チェックするようにハードコーディングされています。Qtコードを見ると、waitForReadyReadを頻繁に呼び出すことで(タイムアウト値を小さくして)これを回避できる場合があります。

于 2012-05-28T18:01:51.120 に答える
0

Windowsでのプロセスの標準入出力に依存することは決してありません。Qtが関与していなくても、パフォーマンスにはいくつかの制限があり、何度も私を襲ったようです。

ローカルホストでネットワーク接続を使用すると、問題なく実行できます。これは、最も普遍的でポータブルなプロセス間通信手段です。Qtが実行されるすべてのものがそれをサポートし、パフォーマンスは各プラットフォームで同じ球場になると予想されます。

于 2012-05-29T00:01:28.817 に答える