Задать вопрос
PavelK
@PavelK

Можно ли как-либо указать Qt, что для конкретного объекта временно не нужно вызывать слот (типо пауза)?

Приветствую!
Допустим, есть два отдельных потока. Поток A генерирует сигнал с некоторыми параметрами, на который подписан поток B, тип Qt::QueuedConnection.
Допустим, по какой-то причине, поток B начинает слишком долго обрабатывать и тогда в очереди (внутри Qt) скапливаются необработанные сигналы.

Вопрос: как дать понять Qt, что слоты конкретного объекта сейчас вызывать не стоит и проигнорить? Типа blockSignal, но только слоты. Да, можно каждый раз connect/disconnect делать, но это попахивает скорее костылём.
  • Вопрос задан
  • 252 просмотра
Подписаться 1 Простой Комментировать
Помогут разобраться в теме Все курсы
  • Нетология
    Разработчик на C++
    12 месяцев
    Далее
  • Яндекс Практикум
    Разработчик C++
    9 месяцев
    Далее
  • Skillbox
    Профессия Разработчик С++
 с нуля + ИИ
    7 месяцев
    Далее
Решения вопроса 1
IGHOR
@IGHOR Куратор тега Qt
Qt/C++ DEV/CTO
Стоит помнить что очередь накапливается в каждом потоке отдельно, отправитель их туда кладет.
Так что накапливаются не сигналы а именно очередь вызова слотов.
Следственно блокировать вы можете только новые сигналы.
И вопрос, зачем их блокировать в один поток, если долетит к другому?
В случае если задача в оптимизации памяти, то можно отправлять шаред пойнтер с константным классом в оба слота.

Как вариант, подключать сигналы через Qt::DirectConnection вместо Qt::QueuedConnection
А в слоте вызывать другой, локальный сигнал, который подключен с Qt::QueuedConnection сам в свой класс.
Использовать например std::atomic<qint64> в мемберах отправителя, и перед запуском потоков передать им константный указатель на него. При каждой новой отправке отправитель добавляет 1 к этому числу (надо не забыть обнулять его при достижении какого-то предела, 1 млрд например). А на стороне слотов в обработке Qt::QueuedConnection слота сохранять его значение в копию числа в мемберах потока, так же атомную. Таким образом в слоте Qt::DirectConnection можно будет узнать о количестве очереди конкретного потока и при нужных вам условиях проигнорировать его пересылку дальше.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
Uniscan Research Новосибирск
от 140 000 до 200 000 ₽
АО НПП «АМЭ» Санкт-Петербург
До 250 000 ₽
Базис-Центр Коломна
от 70 000 до 500 000 ₽