2012-05-24 1 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"비트를 추가했습니다.

내가 얻는 결과는 Windows 프로그램의 출력이 일어날 때 바로 필터 스트림에 삽입되는 것이 아니라 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

파일에 "every 100ms"가 표시 되나요? 아니면 "every 100ms"마다 슬롯이 호출 되나요? –

+0

"파일"로 무엇을 의미하는지 모르겠지만 근본적으로 무슨 일이 일어나는지는 내 프로그램의 현재 출력 (QTimer를 사용하여) 매 10ms마다 신호를 보내고 ReadyRead() 신호가 나올 때마다 windows 프로그램이 출력합니다. 내가 끝내는 것은 메인 프로그램의 출력 블록 10 개 (때로는 11 개)이며, 그 다음에는 Windows 프로그램의 데이터가 뒤 따른다. 그것이 내가 100ms 번호를 얻은 곳입니다. – Keilan

답변

1

불행하게도, QProcess의 윈도우 구현되는 외부 프로세스/열려진 표준 출력에 대해 한 번 매 100 밀리 초를 확인하기 위해 하드 코딩. Qt 코드를 살펴보면 waitForReadyRead를 빈번히 (작은 시간 초과 값으로) 호출하여이 문제를 해결할 수 있습니다.

+0

도움이되기를 바랍니다. 감사합니다. 나는 두 프로그램을 서로 섞어 버리고 말았다. 꽤 못 생겼지 만 QProcess를 사용할 필요가 없기 때문에 일을 끝내는 것처럼 보인다. – Keilan

0

Windows의 프로세스 표준 입력/출력에 절대 의존하지 않습니다. Qt를 사용하지 않아도 여러 번 나를 때리는 성능에 약간의 제한이있는 것 같습니다.

로컬 호스트의 네트워크 연결을 사용하면 완벽하게 작동합니다. 이것이 가장 보편적이고 이식 가능한 프로세스 간 통신 수단입니다. Qt가 실행되는 모든 것을 지원하며, 성능은 각 플랫폼에서 동일한 야구장이 될 것으로 예상됩니다.