crossplatform.ru

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

 
Ответить в данную темуНачать новую тему
> timerEvent() vs. QTimer + сигналы и слоты
registr
  опции профиля:
сообщение 9.10.2011, 17:43
Сообщение #1


Участник
**

Группа: Участник
Сообщений: 115
Регистрация: 16.11.2009
Пользователь №: 1234

Спасибо сказали: 8 раз(а)




Репутация:   1  


Доброго времени суток. Хочу поделиться с сообществом своими исследованиями о скорости выполнения timerEvent() и QTimer + сигналы и слоты. Итак понятно, что событие таймера должно выполняться быстрее, чем сигналы и слоты, так как при сигналах и слотах затрачивается время на отлавливание сигнала. Но кто может сказать, какова их численная характеристика? Вот это и должна продемонстировать моя программа.

Суть программы. В ней два QLineEdit, в которые будет выводится время в миллисекундах, затраченное на выполнение некоторых процедур. В первую линию будет выводится время, затраченное на работу QTimer + сигналы и слоты, во вторую линию -- время на события таймера. Нажимая кнопку Start, мы запускаем сравнение и ждем результаты. Дополнительными параметрами в программе являются count - счетчик - он будет просто считать до определенного значения и, когда оно наступит, запишет время исполнения, остановит таймер и выдаст результат; другой параметр есть milliseconds - период таймера в миллисекндах.

Сравнение производил по двум характеристикам (OS Windows XP, Intel Core2 6300 1.86GHz)
1) Выдерживают ли установленный период timerEvent() и QTimer
2) Насколько быстрее timerEvent(), чем QTimer

Получены следующие результаты:
+) Период таймера = 10 миллисекундам. timerEvent() ровно выдерживает установленный интервал, QTimer иногда чуть-чуть опаздывает.
+) Период таймера = 5 миллисекундам. timerEvent() ровно выдерживает установленный интервал, QTimer всегда чуть опаздывает.
+) Период таймера = 2 миллисекундам. timerEvent() чуть запаздывает и немного не выдерживает установленный интервал. QTimer заметно опаздывает.
+) Период таймера = 1 миллисекунда. timerEvent() чуть (!) чаще опережает и немного не выдерживает установленный интервал. QTimer заметно опаздывает от 25% до 40%.

Точные числа не привел специально. Предлагаю вам самим проверить :)

progtime.h
#ifndef PROGTIME_H
#define PROGTIME_H

#include <QtGui>

class MyWidget : public QWidget
{
   Q_OBJECT

   private:
      QLineEdit* line1;
      QLineEdit* line2;
      QPushButton* pushbutton;

      QVBoxLayout* vlayout;

      QTime* time;

      QTimer* timer;

      void createLayouts();

   private slots:
      void startCheck();
      void timerSlot();

   protected:
      void timerEvent(QTimerEvent* event);
    
   public:
      MyWidget(QWidget* parent = 0);
};
#endif


progtime.cpp
#include <QtGui>
#include <math.h>
#include "progtime.h"

int count=0;
int maxcount=100;
int milliseconds=2;
int id_timer;

MyWidget::MyWidget(QWidget* parent) : QWidget(parent)
{
   createLayouts();
}

void MyWidget::createLayouts()
{
   line1 = new QLineEdit(this);
   line2 = new QLineEdit(this);

   line1->setText("time interval 1");
   line2->setText("time interval 2");

   pushbutton = new QPushButton("Start", this);
   connect(pushbutton, SIGNAL(clicked()), this, SLOT(startCheck()));

   vlayout = new QVBoxLayout(this);
   vlayout->addWidget(line1);
   vlayout->addWidget(line2);
   vlayout->addWidget(pushbutton);

   time = new QTime;

   timer = new QTimer(this);
   connect(timer, SIGNAL(timeout()), this, SLOT(timerSlot()));
}

void MyWidget::startCheck()
{
   line1->setText("time interval 1");
   line2->setText("time interval 2");

   time->start();
   timer->start(milliseconds);
}

void MyWidget::timerSlot()
{
   count++;

   if (count==maxcount)
   {
      QString str=QString::number(time->elapsed());
      line1->setText(str);
      timer->stop();
      count=0;

      time->start();
      id_timer=startTimer(milliseconds);
   }
}

void MyWidget::timerEvent(QTimerEvent *event)
{
   count++;

   if (count==maxcount)
   {
      QString str=QString::number(time->elapsed());
      line2->setText(str);
      killTimer(id_timer);
      count=0;
   }
}


main.cpp
#include <QApplication>
#include "progtime.h"

int main(int argc, char** argv)
{
   QApplication app(argc, argv);

   MyWidget win;
   win.resize(200, 100);
   win.show();

   return app.exec();
}


PS Цитировать Qt Assistant для меня не нужно :)

Сообщение отредактировал registr - 10.10.2011, 14:11
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Abesh
  опции профиля:
сообщение 11.10.2011, 11:06
Сообщение #2


Студент
*

Группа: Новичок
Сообщений: 13
Регистрация: 4.6.2010
Пользователь №: 1780

Спасибо сказали: 2 раз(а)




Репутация:   0  


Не стоит ожидать, что таймер будет корректно работать на интервале 1-2 миллисекунды. Ни Linux ни Windows не являются ОС реального времени, в большей степени это касается виндов. Там задержки в 1-2 миллисекунды - норма.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
wiz29
  опции профиля:
сообщение 11.10.2011, 11:57
Сообщение #3


Старейший участник
****

Группа: Участник
Сообщений: 600
Регистрация: 7.7.2010
Из: Санкт-Петербург
Пользователь №: 1866

Спасибо сказали: 94 раз(а)




Репутация:   12  


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

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


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




RSS Текстовая версия Сейчас: 28.3.2024, 14:47