Russian Qt Forum
Ноябрь 22, 2024, 22:35 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: usleep vs timeout() vs QTimerEvent  (Прочитано 4069 раз)
Белый пони
Гость
« : Май 21, 2013, 16:32 »

Здраствуйте!
Есть задача выполнять некоторую функцию с частотой 10 раз в секунду. Попробовал три способа (два с QThread, один - без):

1) делаю в run()  "вечный" цикл и добавляю "на глаз" задержку usleep()
2) в run() пишу exec(); , завожу QTimer и выполняю нужную функцию по сигналу timeout()
3) создаю обычный Qt-объект (не QThread) и выполняю функцию в событии QTimerEvent

И получается так, что первый способ, где я подбираю нужный аргумент для usleep() работает значительно быстрее двух других.

Это нормально, или я криво реализовал два других способа?


PS компьютер - P4 3 GHz, 512 MB RAM,  ОС - QNX 6.5.0
« Последнее редактирование: Май 21, 2013, 16:34 от Белый пони » Записан
thechicho
Гость
« Ответ #1 : Май 21, 2013, 16:41 »

QTimer *timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(update()));
timer->start(100);
Записан
Белый пони
Гость
« Ответ #2 : Май 21, 2013, 18:58 »

QTimer *timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(update()));
timer->start(100);
Так и делал. По сравнению с первым способом подтормаживает Грустный
Записан
thechicho
Гость
« Ответ #3 : Май 21, 2013, 19:10 »

ну я хз, что у тебя за функция. если тормозит гуи и тебя это не устраивает выносишь в дополнительный поток
http://qt-project.org/doc/qt-4.8/threads.html

//2) завожу QTimer и выполняю нужную функцию по сигналу timeout()

я с потоками работаю, как и ты пытаешься сделать, отнаследовавшись от QThread. я хз лучший это способ или нет, поэтому советовать не буду.

можешь попробовать с QtConcurrent
или void QObject::moveToThread ( QThread * targetThread )
Записан
Белый пони
Гость
« Ответ #4 : Май 22, 2013, 11:32 »

ну я хз, что у тебя за функция. если тормозит гуи и тебя это не устраивает выносишь в дополнительный поток
http://qt-project.org/doc/qt-4.8/threads.html

//2) завожу QTimer и выполняю нужную функцию по сигналу timeout()

я с потоками работаю, как и ты пытаешься сделать, отнаследовавшись от QThread. я хз лучший это способ или нет, поэтому советовать не буду.

можешь попробовать с QtConcurrent
или void QObject::moveToThread ( QThread * targetThread )

Помогло использование moveToThread. Как в примере http://qt-project.org/doc/qt-4.8/qthread.html .Сделал два варианта - с QTimerEvent и с QTimer, оба работают быстро. 
Остановился на QTimerEvent, т.к. в книге Бланшет и Саммерфилда рекомендуют QTimer для случая, когда много таймеров, а у меня - один.

Спасибо за помощь!  Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.047 секунд. Запросов: 20.