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 просмотр]