БлогNot. C++: ещё один таймер с периодом

C++: ещё один таймер с периодом

Небольшой класс решает задачу "сопровождения" некоторого вычислительного процесса периодически выводимым в консоль сообщением.

Ниже в листинге показан класс, который может через заданный в секундах интервал времени выводить в консоль что-то, показывающее, что процесс идёт.

У нас он выводит текущее количество тиков в секунду, которое вычислил, но можно и просто какую-нибудь точечку печатать (показано комментарием в функции Tick).

В этом же листинге - пример применения класса TimeRanger.

Проверено в Visual Studio 2015.

//Visual Studio 2015
#include <iostream>
#include <ctime>
using namespace std;

class TimeRanger { 
protected:
 time_t timePoint;
 time_t timePeriod;
 size_t tickCount;
public:
 TimeRanger(time_t period);
 void Tick();
};

TimeRanger::TimeRanger (time_t period) : timePoint(time(NULL)), timePeriod(period), tickCount(0) { }

void TimeRanger::Tick() {
 tickCount++;
 time_t now = time(NULL);
 if ((now - timePoint) >= timePeriod) {
  //выведет инфу о текущем TPS (тиках в секунду)
  size_t tps = 0.0;
  if (tickCount > 0) tps = tickCount / (now - timePoint);
  cout << "TPS: " << tps << " ";
  //cout << "."; //или можно вот так вместо строчки выше
  tickCount = 0;
  timePoint = now;
 }
}

void somethingCode() { //Демо, здесь может быть Ваш код
 volatile size_t anchor = 0; //Чтобы не оптимизировал переменную - volatile
 for (size_t x = 0; x < 0xffff; ++x) { //Просто гоняем цикл
  anchor = x;
 }
}

int main() {
 time_t start = time(NULL);

 TimeRanger myWatch (3); //Создаем таймер с интервалом в 3 секунды
 for (time_t latest = start; (latest - start) <= 15; latest = time(NULL)) {
  //Пока не пройдёт 15 секунд
  somethingCode(); //Делаем что-то
  myWatch.Tick(); //И с заданным периодом выводим тикалку
 }
 cout << "OK, press Enter";
 cin.get();
 return 0;
}

12.05.2018, 14:29 [2251 просмотр]


теги: c++ алгоритм время

К этой статье пока нет комментариев, Ваш будет первым