Синхронизировать вывод между основной программой и 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, поддерживает это, и ожидается, что производительность будет одинаковой для каждой платформы.