crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> 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  


Цитата(flankerr @ 21.9.2009, 21:55) *
должно пройти время сопоставимое со временем выполнения функции
и как ты это время измеряешь?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
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  


Цитата(flankerr @ 22.9.2009, 17:09) *
Функция должна вызываться ну скажем 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  


Цитата(flankerr @ 24.9.2009, 16:29) *
Что если функция отработала медленее чем планировалось(а такое очень может быть). Функция не успела отработать до конца а уже пришёл ещё один вызов
ну я потому и написал:
Цитата(Litkevich Yuriy @ 22.9.2009, 18:56) *
Если есть гарантия, что всегда остаётся пустой промежуток времени (т.е. после выхода из функции и её повторным вызовом.)
выходит, что у тебя такой гарантии нет

Но тогда можно предпопложить, что твоя программа может основательно нагружать систему. (т.к. всё время есть чем занять процессор)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 19.4.2024, 21:09