私はいくつかのユーザーテストを実行するプログラムを構築しており、非常に短い間隔(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