Russian Qt Forum

Qt => Многопоточное программирование, процессы => Тема начата: Белый пони от Май 21, 2013, 16:32



Название: usleep vs timeout() vs QTimerEvent
Отправлено: Белый пони от Май 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


Название: Re: usleep vs timeout() vs QTimerEvent
Отправлено: thechicho от Май 21, 2013, 16:41
QTimer *timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(update()));
timer->start(100);


Название: Re: usleep vs timeout() vs QTimerEvent
Отправлено: Белый пони от Май 21, 2013, 18:58
QTimer *timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(update()));
timer->start(100);
Так и делал. По сравнению с первым способом подтормаживает :(


Название: Re: usleep vs timeout() vs QTimerEvent
Отправлено: thechicho от Май 21, 2013, 19:10
ну я хз, что у тебя за функция. если тормозит гуи и тебя это не устраивает выносишь в дополнительный поток
http://qt-project.org/doc/qt-4.8/threads.html

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

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

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


Название: Re: usleep vs timeout() vs QTimerEvent
Отправлено: Белый пони от Май 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 для случая, когда много таймеров, а у меня - один.

Спасибо за помощь!  :)