QTimer::singleShot, QTimer::singleShot VS start()\stop() |
Здравствуйте, гость ( Вход | Регистрация )
QTimer::singleShot, QTimer::singleShot VS start()\stop() |
flankerr |
21.9.2009, 17:55
Сообщение
#1
|
Активный участник Группа: Участник Сообщений: 356 Регистрация: 9.1.2008 Пользователь №: 65 Спасибо сказали: 2 раз(а) Репутация: 0 |
Скажем есть необходимость вызова функции по таймеру.
Между завершением работы функции и следующим вызовом должно пройти время сопоставимое со временем выполнения функции. Поэтому простой таймер со start() не подходят. Сейчас я делаю в начале функции stop() а в конце функции - start() Решил попроьбывать вместо обычного таймера start\stop в конце функции ставить QTimer::singleShot Но это срабатывает только один раз. Т.е запускаю функцию запускаетса singleShot ещё раз отрабатывается функция снова делается вызов singleShot но вот он уже впустую - вызов не проходит. В чём грабли ? И есть ли особый смысл в данном случае переходить на QTimer::singleShot ?? |
|
|
ViGOur |
21.9.2009, 19:15
Сообщение
#2
|
Мастер Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: 40 |
Вот описание свойства QTimer::singleShot:
Цитата A single-shot timer fires only once, non-single-shot timers fire every interval milliseconds. Я бы честно говоря использовал для этих целей QMutex. В твой функции его лочил бы, а в таймере смотрел, когда QMutex разлочится. В принципе в данном случае таймер использовать не обязательно, можно и QThread. |
|
|
Litkevich Yuriy |
21.9.2009, 21:31
Сообщение
#3
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
|
|
|
kwisp |
22.9.2009, 7:26
Сообщение
#4
|
астарожна ынтжинэр Группа: Участник Сообщений: 1404 Регистрация: 26.11.2008 Из: ТаганрогРодинаЧехова Пользователь №: 435 Спасибо сказали: 113 раз(а) Репутация: 23 |
как часто вызывается функция?
еще вопрос, время работы сильно меняется, или примерно одинаковое каждый раз? |
|
|
flankerr |
22.9.2009, 13:09
Сообщение
#5
|
Активный участник Группа: Участник Сообщений: 356 Регистрация: 9.1.2008 Пользователь №: 65 Спасибо сказали: 2 раз(а) Репутация: 0 |
ViGOur, вот что значит не внимателно прочитал описание сингшота у меня как раз бывают случае когда итервал слишком маленький.
QMutex для этих целей плохой вариант. Таймер плюс мютекскак то слишком... да и посмыслу получается не что другое. Litkevich Yuriy, Время измеряю ftime(). kwisp, Образно говоря. Функция должна вызываться ну скажем 10 раз в секунду. Сама функция можно выполняться от 0 до 100мс. Таким образом интервал между вызовами функций может быть от 0 до 100мс. (Из максимального интервала отнимает время выполнения и получаем интервал следжующего вызова) Ладно, так понял что сингшот слишком уж сингл |
|
|
Litkevich Yuriy |
22.9.2009, 14:56
Сообщение
#6
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
Функция должна вызываться ну скажем 10 раз в секунду. Сама функция можно выполняться от 0 до 100мс. дак, может всё таки не интервал между вызовами задавать. А именно вызывать её периодически и всё. Если есть гарантия, что всегда остаётся пустой промежуток времени (т.е. после выхода из функции и её повторным вызовом.)
|
|
|
flankerr |
24.9.2009, 12:29
Сообщение
#7
|
Активный участник Группа: Участник Сообщений: 356 Регистрация: 9.1.2008 Пользователь №: 65 Спасибо сказали: 2 раз(а) Репутация: 0 |
Litkevich Yuriy, В общем случае да. НО забыл упоминуть важный момент.
Что если функция отработала медленее чем планировалось(а такое очень может быть). Функция не успела отработать до конца а уже пришёл ещё один вызов. А если и следующий вызов отработал медленно, то вызовы будут накапливаться что в итоге подвесит систему. Классический пример это вызов отрисовки по таймеру через repaint(). |
|
|
Litkevich Yuriy |
24.9.2009, 12:39
Сообщение
#8
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
Что если функция отработала медленее чем планировалось(а такое очень может быть). Функция не успела отработать до конца а уже пришёл ещё один вызов ну я потому и написал:Если есть гарантия, что всегда остаётся пустой промежуток времени (т.е. после выхода из функции и её повторным вызовом.) выходит, что у тебя такой гарантии нетНо тогда можно предпопложить, что твоя программа может основательно нагружать систему. (т.к. всё время есть чем занять процессор) |
|
|
Текстовая версия | Сейчас: 28.12.2024, 10:06 |