2012-05-24 122 views
1

我正在構建一個程序,該程序執行一些用戶測試,並需要以非常小的間隔(每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

+0

它顯示文件中的「每100毫秒」還是每隔「每100毫秒」調用一次您的插槽 –

+0

我不太清楚「文件中」是什麼意思,但基本上發生了什麼是我的主程序輸出當前狀態每10ms(使用一個QTimer)和Windows程序輸出每當信號ReadyRead()發射。我最終得到的是來自主程序的10個(有時是11個)輸出塊,隨後是來自windows程序的一堆數據。這就是我從中獲得100ms數字的地方。 – Keilan

回答

1

不幸的是,Windows實現QProcess中的硬編碼到從外部流程/標準錯誤檢查一次,每100毫秒標準輸出。仔細查看Qt代碼,您可以通過頻繁地調用waitForReadyRead(具有較小的超時值)來解決此問題。

+0

很高興知道,感謝您的幫助。我最終將兩個程序混合在一起,這看起來非常醜陋,但似乎完成了這項工作,因爲它消除了使用QProcess的需要。 – Keilan

0

我永遠不會依賴Windows上的進程的標準輸入/輸出。看起來,即使沒有Qt參與,性能也會受到多次限制。

使用本地主機上的網絡連接,你會做得很好。這是最通用和便攜式的進程間通信手段。 Qt運行的所有東西都支持它,並且性能預計會在每個平臺上保持一致。

相關問題