我正在構建一個程序,該程序執行一些用戶測試,並需要以非常小的間隔(每10ms)記錄他們正在執行的操作。大部分數據可以從QT中找到,但不幸的是我需要使用一個單獨的程序來計算鼠標移動(即使鼠標已經觸及屏幕邊緣,我也需要移動,但是QT只是忽略了屏幕外移動)。同步主程序和QProcess之間的輸出?
因此,我構建了一個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」位中添加了一個嘗試解決此問題的嘗試。
我得到的結果是,窗口程序的輸出每隔100ms出現在一個大塊中,而不是在發生時插入到文件流中。好像有一個緩衝區需要填充,或者在readyRead()信號處理之前有一個延遲。有沒有人有任何建議,我怎樣才能實時從主程序和QProcess輸出? (好吧,至少延遲時間少於10ms)。另外,如果它很重要,我運行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("%s\n",output,n);
std::fflush(0);
讓我知道是否需要任何信息。
感謝, -Keilan
它顯示文件中的「每100毫秒」還是每隔「每100毫秒」調用一次您的插槽 –
我不太清楚「文件中」是什麼意思,但基本上發生了什麼是我的主程序輸出當前狀態每10ms(使用一個QTimer)和Windows程序輸出每當信號ReadyRead()發射。我最終得到的是來自主程序的10個(有時是11個)輸出塊,隨後是來自windows程序的一堆數據。這就是我從中獲得100ms數字的地方。 – Keilan