Задержка запуска QTimer? - PullRequest
       8

Задержка запуска QTimer?

0 голосов
/ 31 октября 2011

У меня возникли проблемы с тем, чтобы обернуть голову вокруг Qtimer этим утром.

Вот основная идея:

У меня есть QTimer, который запускается нажатием кнопки.Как только он активен, каждые 5 минут он вызывает функцию (давайте назовем ее start ()).

Start () вызывает отдельную функцию (назовите ее work ()), используя QtConcurrent.Таким образом, он быстро возвращается, хотя обработка все еще происходит.

Вот моя проблема: я хочу вызывать work () несколько раз, один за другим.Моя проблема в том, что в настоящее время она будет вызывать функцию work () несколько раз, прежде чем завершит обработку, которая, поскольку она взаимодействует с аппаратным обеспечением, не работает.

Как мне поступить правильно?

РЕДАКТИРОВАТЬ:

Вот основной поток программы:

  • Пользователь нажимает startTimer ().
  • StartTime () вызывает timer->start ()
  • когда таймер издает сигнал, он вызывает Start ()
  • Start () делает легкий пользовательский интерфейс, затем делает future = QtConcurrent :: run (... work() ...) // работа занимает много времени watcher-> setFuture (* future)
  • как-то (это моя проблема), когда работа () завершена, я хочу вызвать ее снова (4раз, если быть точным)

Ответы [ 2 ]

2 голосов
/ 31 октября 2011

Если я правильно понимаю ваш вопрос, вы должны избегать одновременного запуска функции work() в нескольких потоках.

Используйте QMutexLocker в верхней части функции work() и добавьте соответствующий QMutex к определению вашего класса.

Таким образом, выполнение функции work() будет заблокировано до завершения предыдущего выполнения.

0 голосов
/ 31 октября 2011

Если ваша функция work() имеет аномалию, по какой-то причине это заняло 20 минут, захотите ли вы затем выполнить 4 следующих обратных вызова work() как можно скорее ... или по-прежнему хотите, чтобы они были разнесены5 минут, несмотря на задержку?

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

http://doc.qt.io/qt-4.8/qtimer.html#singleShot-prop

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...