Top.Mail.Ru
Уведомления
Очистить все

[Решено] Странная работа QThread и QThread::usleep.

(@tobeornottobe)
New member

Доброго дня, уважаемые форумчане! Столкнулся с интересным, но пока необъяснимым поведением программы на 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) всего на одну миллисекунду. Вот в этом-то вопрос и состоит...

 

Цитата
Создатель темы Размещено : 24.03.2023 17:26
Метки темы
TQFP
 TQFP
(@tqfp)
Level 5

Приветствую, 

тоже потоки похожим образом на Qt использую, но такого эффекта не наблюдал никогда.

ОтветитьЦитата
Размещено : 24.03.2023 17:58
TQFP
 TQFP
(@tqfp)
Level 5
От: @tobeornottobe

Доброго дня, уважаемые форумчане! Столкнулся с интересным, но пока необъяснимым поведением программы на Qt. Минимальный псевдо-пример, создается объект и помещается в отдельный поток:

Worker *customWorker = new Worker(this);

customWorker->moveToThread(&workerThread);
QObject::connect(&workerThread, &QThread::started, customWorker, &Worker::threadStarted);
workerThread.start();

 

Это на Windows?

ОтветитьЦитата
Размещено : 24.03.2023 19:13
(@tobeornottobe)
New member

Да, на десятке.

ОтветитьЦитата
Создатель темы Размещено : 24.03.2023 19:48
Aveal
(@aveal)
Top level Admin

Доброго времени 🖐️ Windows просто не операционная система реального времени, даже не близко. Поэтому вызов QThread::usleep() дает на практике 15 мс, грубо и упрощенно говоря - такова разрешающая способность самой системы. Мы раньше для критичных задач, где требовалось под виндой работать, использовали Windows 8 Embedded, соответственно, там дела обстояли получше.

ОтветитьЦитата
Размещено : 24.03.2023 22:27
(@tobeornottobe)
New member

@aveal действительно, убрал QThread::usleep(1000) и эти 15 мс мистические пропали. Не такие уж и мистические как оказалось )

ОтветитьЦитата
Создатель темы Размещено : 25.03.2023 10:06
Поделиться: