Синхронизировать вывод между основной программой и QProcess?

Я создаю программу, которая выполняет некоторые пользовательские тесты и должна записывать данные о том, что они делают, с очень небольшими интервалами (каждые 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();
}

Некоторые из этих вещей могут быть ненужными. Я добавил в режим "MergedChannels" и бит "DirectConnection" в попытке решить проблему.

В результате я получаю, что выходные данные программы 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("%s\n",output,n);
std::fflush(0);

Дайте мне знать, если потребуется дополнительная информация.

Спасибо, Кейлан

2 ответа

Решение

К сожалению, реализация QProcess в Windows жестко запрограммирована для проверки каждые 100 миллисекунд на наличие stdout/stderr из внешнего процесса. Просматривая код Qt, вы можете обойти это, часто вызывая waitForReadyRead (с небольшим значением времени ожидания).

Я бы никогда не зависел от стандартного ввода / вывода процесса в Windows. Кажется, что есть некоторые ограничения производительности, которые поражают меня несколько раз, даже без участия Qt.

Вы будете прекрасно работать, используя сетевое соединение на локальном хосте. Это самый универсальный и портативный межпроцессный способ связи. Все, на чем работает Qt, поддерживает это, и ожидается, что производительность будет одинаковой для каждой платформы.

Другие вопросы по тегам