Как управлять очередью в вызовaх в qt?

Один поток соединяется с главным потоком с помощью флага Qt::QueedConnection Тоесть он не вызвает ф-ию главного потока, а добавляет ее в очередь, чтобы потом брать из очереди и вызывать. Но у меня бывает так, что добавляется в очередь больше чем удается обработать. Как быть?

на ум приходит только моячить из главного потока, если обработка не закончилась то не вздумай пихать на обработку еще...


Ответы (1 шт):

Автор решения: Ivan Sodorenko

Делал отслеживание входящих/исходящих данных вот таким образом:

bool MainWorker::eventFilter(QObject *obj, QEvent *event)
{
    if (event->type() == QEvent::MetaCall)
    {
        QMetaCallEvent* metaEvent = static_cast<QMetaCallEvent*>(event);
        if (nullptr != dynamic_cast<const InputWorker*>(metaEvent->sender()))
        {
            ++m_queueCounter;
        }
        else if (nullptr != dynamic_cast<const OutputWorker*>(metaEvent->sender()))
        {
            if (--m_queueCounter == 0);
                emit imFreeForJob();
        }
    }
}

MainWorker принимает данные (через сигналы) от InputWorker-а, выполняет какую то тяжелую работу, после отдает результаты (опять через сигналы) в OutputWorker. Обнуление счетчика говорит, что очередь пуста и можно посылать следующую пачку запросов. Пачка запросов равнялась кол-ву потоков в системе, внутри MainWorker-а шло распараллеливание через QtConcurrent.

PS: для того чтобы использовать QEvent::MetaCall нужно подключать что то типа qevent_private.h, сейчас уже не помню точно.

→ Ссылка