在主程序和QProcess之间同步输出?

时间:2012-05-24 16:12:31

标签: c++ winapi qt4 qprocess

我正在构建一个程序来执行一些用户测试,并且需要以非常小的间隔(每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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

使用localhost上的网络连接完全可以。这是最通用和可移植的进程间通信方式。 Qt运行的所有内容都支持它,并且每个平台上的性能预计都是相同的。