PavelK
@PavelK

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

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

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

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

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

Войти через центр авторизации
Похожие вопросы