同步主程序和 QProcess 之间的输出

Synchronizing output between a main program and a QProcess?

本文关键字:输出 之间 QProcess 主程序 同步      更新时间:2023-10-16

我正在构建一个程序,该程序可以执行一些用户测试,并且需要以非常小的间隔(每10ms)记录有关他们正在做的事情的数据。大多数数据都可以从 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();
}

其中一些东西可能是不必要的。我添加了"合并频道"模式和"直接连接"位以尝试解决问题。

我得到的结果是,Windows 程序的输出每 100 毫秒左右以大块显示一次,而不是在发生时立即插入到文件流中。似乎某处有一个缓冲区需要填充,或者在处理 readyRead() 信号之前有一个延迟。有没有人对如何实时获取主程序和 QProcess 的输出有任何建议?(好吧,至少延迟小于 10 毫秒)。

另外,如果它很重要,我正在运行Windows 7并使用MinGW编译主程序,并使用Visual Studio 2008用于检测鼠标移动的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("%sn",output,n);
std::fflush(0);

如果还需要信息,请告诉我。

谢谢-基兰

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

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

在本地主机上使用网络连接可以很好地完成。这是最通用和可移植的处理间通信方式。Qt运行的所有内容都支持它,并且预计每个平台上的性能都是相同的。