我正在构建一个程序来执行一些用户测试,并且需要以非常小的间隔(每 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 的输出有任何建议吗?(嗯,至少延迟小于 10 毫秒)。
此外,如果它很重要,我正在运行 Windows 7 并使用 MinGW 编译主程序,使用 Visual Studio 2008 编译检测鼠标移动的 Windows 程序。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);
让我知道是否需要更多信息。
谢谢,-基兰