Название: 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 для случая, когда много таймеров, а у меня - один. Спасибо за помощь! :) |