Таймер на C++

В этом посте я решил опубликовать класс для подсчета времени, написанный на C++. Он был взят где-то на просторах интернета пару лет назад. Я таскал его с собой из лабораторной в лабораторную. Везде, где нужно было замерить временной интервал той или иной операции, я использовал его. Естественно, я выкладываю не «первозданный» вариант, а немного дополненный мной для своих нужд. Надеюсь, он будет полезен кому-нибудь еще кроме меня.

Мне кажется, что для использования в лабораторных под Windows, этот таймер подходит очень хорошо. Единственное, мне кажется, что игра с приоритетами выполнения тут ни к чему. Но удалять я её не стал, ибо не мешает :) Помимо всего прочего, класс считает время с точностью до миллисекунд. Большее, опять таки, лишено смысла, ибо тогда получается огромная погрешность.

Возможно, чуть позже выложу доработанный, более «красивый» вариант. Хотя, два года меня вполне устраивал и этот.

Вот он.

Файл TimeCounter.h:

#ifndef __TIMECOUNTER222__H__
#define __TIMECOUNTER222__H__

#include <iostream>

//////////////////////////////////////////
/// Допустимые значения приоритета потока:
/// THREAD_PRIORITY_HIGHEST
/// THREAD_PRIORITY_ABOVE_NORMAL
/// THREAD_PRIORITY_NORMAL
/// THREAD_PRIORITY_BELOW_NORMAL
/// THREAD_PRIORITY_LOWEST
//////////////////////////////////////////

class TimeCounter
{
friend std::ostream& operator<<(std::ostream& out, TimeCounter& cntr);
public:
   TimeCounter() {started=false; stopped=false; tWord = 0;}
   void Start();
   void Start(int nPriority);
   void Stop();

   double timeElapsed() const;
   bool getStarted() const {return started;}
   bool getStopped() const {return stopped;}
   int getNewPriority() const {return new_priority;}
   ~TimeCounter();

   void Assign(TimeCounter &cntr);
   void Add(TimeCounter &cntr);
   void Clear();

protected:
   int new_priority;
   int old_priority;
   bool started;
   bool stopped;
   double tBefore, tAfter, i64PerfFrequency;
   double tWord;

};

#endif

Файл TimeCounter.cpp:

#include "TimeCounter.h"
#include <windows.h>

//старт счетчика
void TimeCounter::Start()
{
   started=true;
   stopped=false;
   new_priority=0;

   LARGE_INTEGER pf;
    QueryPerformanceFrequency(&pf);
   i64PerfFrequency = pf.QuadPart;
    Sleep(0);
    QueryPerformanceCounter(&pf);
   tBefore = pf.QuadPart;

   tWord = 0;
}

void TimeCounter::Start(int nPriority)
{
   started=true;
   stopped=false;
   new_priority=nPriority;
   old_priority=GetThreadPriority(GetCurrentThread());
   SetThreadPriority(GetCurrentThread(),new_priority);

   LARGE_INTEGER pf;
    QueryPerformanceFrequency(&pf);
   i64PerfFrequency = pf.QuadPart;
    Sleep(0);
   QueryPerformanceCounter(&pf);
   tBefore = pf.QuadPart;
}

//остановка таймера
void TimeCounter::Stop()
{
   LARGE_INTEGER tAfter1;
   QueryPerformanceCounter(&tAfter1);
   tAfter = tAfter1.QuadPart;

   tWord = tAfter - tBefore;
   tWord /= i64PerfFrequency;
   if (new_priority)
      SetThreadPriority(GetCurrentThread(),old_priority);
   started=false;
   stopped=true;
}

double TimeCounter::timeElapsed() const
{
   LARGE_INTEGER tempAfter;
   double tempWord;

   if (started)
   {
      QueryPerformanceCounter(&tempAfter);
      tempWord = tempAfter.QuadPart - tBefore;
      tempWord /= i64PerfFrequency;

      return tempWord;
   }
   if (stopped)
      return tWord;

   return 0.;
}

TimeCounter::~TimeCounter()
{
   if (new_priority)
      SetThreadPriority(GetCurrentThread(),old_priority);
}

//вывод в поток
std::ostream& operator<<(std::ostream& out, TimeCounter& cntr)
{
   double fsec = cntr.timeElapsed();
   int hour = int(fsec/3600.);
   double fmin = fsec-3600.*double(hour);
   int min = int(fmin/60.);
   double sec = fmin-60.*double(min);
   out<new_priority = cntr.new_priority;
 this->old_priority = cntr.old_priority;
 this->started = cntr.started;
 this->stopped = cntr.stopped;
 this->tBefore = cntr.tBefore;
 this->tAfter = cntr.tAfter;
 this->i64PerfFrequency = cntr.i64PerfFrequency;
 this->tWord = cntr.tWord;
}
//сложение значений двух таймеров
void TimeCounter::Add(TimeCounter& cntr)
{
 this->tWord += cntr.tWord;
}
//обнуление таймера
void TimeCounter::Clear()
{
 this->tWord = 0;
}

Использовать его очень просто:

TimeCounter t;
t.Start();
t.Stop();
cout<<t;

Полезная статья? Их будет больше, если вы поддержите меня!

https://money.yandex.ru/embed/small.xml?account=410011399843532&quickpay=small&yamoney-payment-type=on&button-text=06&button-size=l&button-color=orange&targets=%D0%9F%D0%BE%D0%B4%D0%B4%D0%B5%D1%80%D0%B6%D0%B8%D0%B2%D0%B0%D1%8E+%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82+lexpenz.com&default-sum=50&successURL=