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 的输出有任何建议吗?(嗯,至少延迟小于 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);

让我知道是否需要更多信息。

谢谢,-基兰

4

2 回答 2

1

不幸的是,QProcess 的 Windows 实现被硬编码为每 100 毫秒检查一次来自外部进程的 stdout/stderr。通过查看 Qt 代码,您可以通过频繁调用 waitForReadyRead(使用较小的超时值)来解决此问题。

于 2012-05-28T18:01:51.120 回答
0

我永远不会依赖 Windows 上进程的标准输入/输出。即使没有 Qt 参与,似乎对我多次打击的性能也存在一些限制。

使用本地主机上的网络连接你会做得很好。这是最通用和可移植的进程间通信方式。Qt 运行的所有东西都支持它,并且性能预计在每个平台上都是相同的。

于 2012-05-29T00:01:28.817 回答