同步主程序和 QProcess 之间的输出
Synchronizing output between a main program and a QProcess?
我正在构建一个程序,该程序可以执行一些用户测试,并且需要以非常小的间隔(每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运行的所有内容都支持它,并且预计每个平台上的性能都是相同的。
- 为什么在其他输出线之间得到"1"输出?
- 如何在 的开头<x>和结尾<y>之间更改带有文件输出的字符串的值
- 如何使用 ALSA API 在应用程序中在单声道和立体声之间切换声音输出?
- 如何包含整数之间的空格作为输出
- Raku中C++和NativeCall之间的输出不同
- 无法在同一行上获取输出,在 C++ 中两个输出之间有空格
- 尝试查找数组中点之间的最小距离时的随机垃圾输出
- 为什么两个相同的代码给出不同的输出,而它们之间的唯一区别是不同的变量名称和写作样式
- 将线程之间的标准输入/输出重定向
- 提升正则表达式 cpp 用于查找 %% 之间的字符串,输出不包括 % 字符本身
- 这些代码之间的区别在哪里?输出不应该是一样的吗?
- (c++) 返回和函数输出之间的错误
- 在 c++ 中反转数组时,为什么在输入和输出之间得到一个"random"数字?
- GCC和MSVC之间的文件输出不一致
- 可视化GDB在MSVC2012和GCC 7.3.1之间打印不同的C++输出
- C++子级在复制构造函数和输出之间的某个时间点更改父成员
- g++输出和Visual Studio输出之间存在差异.浮点变量
- 这两个程序的输出之间有什么区别以及为什么
- 在输入和输出之间使用不同数量的样本对音频ffmpegc++进行编码
- Qt:调试和发布中moc输出之间的差异