我正在构建一个程序来执行一些用户测试,并且需要以非常小的间隔(每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程序的输出每100ms左右以大块显示,而不是在它发生时立即插入到文件流中。似乎在某处需要填充缓冲区,或者在处理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);
如果需要更多信息,请告诉我。
谢谢, -Keilan
答案 0 :(得分:1)
不幸的是,QProcess的Windows实现是硬编码的,可以从外部进程每隔100毫秒检查一次stdout / stderr。查看Qt代码,您可以通过频繁调用waitForReadyRead来解决此问题(使用较小的超时值)。
答案 1 :(得分:0)
我永远不会依赖Windows上进程的标准输入/输出。即使没有Qt参与,似乎对我的性能有一些限制,即使没有Qt参与。
使用localhost上的网络连接完全可以。这是最通用和可移植的进程间通信方式。 Qt运行的所有内容都支持它,并且每个平台上的性能预计都是相同的。