Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在主程序和QProcess之间同步输出?_C++_Winapi_Qt4_Qprocess - Fatal编程技术网

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

C++ 在主程序和QProcess之间同步输出?,c++,winapi,qt4,qprocess,C++,Winapi,Qt4,Qprocess,我正在构建一个程序,它可以执行一些用户测试,并且需要以非常小的间隔(每10毫秒)记录他们正在做的事情的数据。大部分数据都可以从QT中找到,但不幸的是,我需要使用单独的程序来计算鼠标移动(即使鼠标已经碰到屏幕边缘,我也需要获得移动,但QT只是忽略了屏幕外的移动) 因此,我构建了一个windows程序,用于处理低级鼠标输入并输出检测到的坐标变化。但问题是,我无法从windows程序中获取数据,使其与主程序的输出一致 在我的主程序中,我使用以下代码 mouseTracker = new QProces

我正在构建一个程序,它可以执行一些用户测试,并且需要以非常小的间隔(每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();
}
如果需要更多信息,请告诉我

谢谢,
-Keilan

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

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

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


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

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


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

它是在文件中显示“每100毫秒”,还是每隔“每100毫秒”调用插槽?我不太清楚“在文件中”是什么意思,但基本上我的主程序每10毫秒输出一次当前状态(使用QTimer)只要发出ReadyRead()信号,windows程序就会输出。我最终得到的是主程序的10个(有时11个)输出块,然后是windows程序的一组数据。这就是我获取100ms数字的原因。它是在文件中显示“每隔100ms”还是每隔“每隔100ms”调用插槽我不太清楚“在文件中”是什么意思,但基本上是我的主程序每10ms输出一次当前状态(使用QTimer),windows程序在信号ReadyRead()时输出发射。我最终得到的是主程序的10个(有时11个)输出块,然后是windows程序的一组数据。这就是我得到100毫秒号码的地方。很高兴知道,谢谢你的帮助。我最终把这两个程序混合在一起,这看起来很难看,但似乎完成了任务,因为它消除了使用QProcess的需要。很高兴知道这一点,谢谢你的帮助。我最终将这两个程序混合在一起,这看起来很难看,但似乎完成了任务,因为它消除了使用QProcess的需要。
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);