PavelK
@PavelK

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

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

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

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

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

Войти через центр авторизации
Похожие вопросы
TRUSTSOFT Краснодар
от 80 000 ₽
GETMOBIT Москва
До 170 000 ₽
SDT Москва
от 150 000 ₽
25 нояб. 2020, в 22:43
800 руб./в час
25 нояб. 2020, в 22:38
1200 руб./за проект
25 нояб. 2020, в 22:29
500 руб./в час