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