Доброго дня, уважаемые форумчане! Столкнулся с интересным, но пока необъяснимым поведением программы на Qt. Минимальный псевдо-пример, создается объект и помещается в отдельный поток:
Worker *customWorker = new Worker(this); customWorker->moveToThread(&workerThread); QObject::connect(&workerThread, &QThread::started, customWorker, &Worker::threadStarted); workerThread.start();
В threadStarted() создаются внутренние объекты и т. д. В общем и целом данный механизм я использовал много раз, все работает. Помимо прочего в Worker есть процесс, который крутится непрерывно и проверяет, поступили ли новые данные:
void Worker::waitForInputData() { while (active == true) { checkInputData(); counter++; if (counter >= COUNTER_MAX) { counter = 0; QCoreApplication::processEvents(); } QThread::usleep(1000); } }
Запускается после старта потока:
QMetaObject::invokeMethod(this, "waitForInputData", Qt::QueuedConnection);
И снова - все эти механизмы отлажены и работают, но здесь есть один нюанс. По какой-то непонятной причине checkInputData() вызывается раз в 15-16 миллисекунд, иногда 30 мс, хотя в цикле стоит QThread::usleep(1000) всего на одну миллисекунду. Вот в этом-то вопрос и состоит...
Приветствую,
тоже потоки похожим образом на Qt использую, но такого эффекта не наблюдал никогда.
Доброго дня, уважаемые форумчане! Столкнулся с интересным, но пока необъяснимым поведением программы на Qt. Минимальный псевдо-пример, создается объект и помещается в отдельный поток:
Worker *customWorker = new Worker(this); customWorker->moveToThread(&workerThread); QObject::connect(&workerThread, &QThread::started, customWorker, &Worker::threadStarted); workerThread.start();
Это на Windows?
Да, на десятке.
Доброго времени 🖐️ Windows просто не операционная система реального времени, даже не близко. Поэтому вызов QThread::usleep(1000) дает на практике 15 мс, грубо и упрощенно говоря - такова разрешающая способность самой системы. Мы раньше для критичных задач, где требовалось под виндой работать, использовали Windows 8 Embedded, соответственно, там дела обстояли получше.
@aveal действительно, убрал QThread::usleep(1000) и эти 15 мс мистические пропали. Не такие уж и мистические как оказалось )