LINUX.ORG.RU

QTimer (+QThread) и несколько вызовов слота по timeout


0

1

Есть класс, который сидит в QThread (т.е. moveToThread). Внутри него надо выполнять периодически длинные операции. Если раньше был QThread::run и внутри него можно было sleep, то как быть с классом который просто «мувнулся в тред»?

Первое решение я нагуглил - это просто таймер.

Однако, если в run можно было сильно задержать выполнение операции, то с таймером мне менее понятно:

1) Если для задачи периодического исполнения чего-то в «длинном» слоте (которые может даже несколько секунд отрабатывать) - QTimer годится, то что будет если вызовется сразу несколько timeout? Станут в очередь и она будет бесконечно расти, или вызовы слота будут пропускаться?

2) Какие еще есть способы периодического исполнения чего-то объектом, который сидит в QThread? Чтобы безопасно...

Честно гуглил, доки смотрел - пока не понял...

Очередь будет расти.

Для QTimer сделать setSingleShoot(true) и перезапускать таймер по завершению операции.

trex6 ★★★★★
()
Последнее исправление: trex6 (всего исправлений: 1)
Ответ на: комментарий от trex6

Спасибо! Это важный момент, а то я уже даже тестировать собирался - как же оно поведет себя на самом деле.

Сингл-шот - то что надо, забыл что можно применить таким образом.

I-Love-Microsoft ★★★★★
() автор топика
Ответ на: комментарий от trex6

nanoolinux

Хотел бы еще раз поблагодарить, действительно, сделал чтобы был синглшот в том месте что надо было. Теперь другая дума на меня напала, уже для другого применения:

Вот меня всё время мучает вопрос: вот я сделал класс, в нём таймер, класс живет в своём QThread (moveToThread), надо ли мне заботиться о накоплении очереди сигналов от таймера?

Проблема в том что у меня таймер на 15 мс (точность вызова не критична). В некоторые моменты у меня происходит запись в QextSerialPort и он может заставить слот выполняться и 15 и даже 20 мс иногда, хотя обычно отрабатывает менее чем за 1 мс, т.е. иногда может тормознуть выполнение.

В принципе, у этого процесса потом есть еще до 50-100 мс чтобы сделать остальную работу, которая меньше 1 мс длится.

Опасно ли это? Можно ли на такое полагаться? Я волнуюсь, не надо ли делать как-то иначе в моем случае, не надо ли тут так же сделать синглшот?

I-Love-Microsoft ★★★★★
() автор топика
Ответ на: комментарий от I-Love-Microsoft

В языках, которые хоть как-то предназначены для работы с рт есть таймеры встроеные. Например в аде есть. Или в эрланге receive таймаут имеет. Так что делай выводы.

nanoolinux ★★★★
()
Последнее исправление: nanoolinux (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.