Как управлять очередью в вызовaх в qt?
Один поток соединяется с главным потоком с помощью флага Qt::QueedConnection Тоесть он не вызвает ф-ию главного потока, а добавляет ее в очередь, чтобы потом брать из очереди и вызывать. Но у меня бывает так, что добавляется в очередь больше чем удается обработать. Как быть?
на ум приходит только моячить из главного потока, если обработка не закончилась то не вздумай пихать на обработку еще...
Ответы (1 шт):
Делал отслеживание входящих/исходящих данных вот таким образом:
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, сейчас уже не помню точно.