1) Должен быть метод, реализующий _один_ шаг работы таймера. Возвращать должен текущее состояние выхода (0 если счетчик не равен нулю, 1 если равен), при достижении счетчиком значения 0 он должен перезапускаться.
2) Соответственно, должны быть методы для установки интервала (максимального значения счетчика), его сброса, остановки и запуска, все это в одном классе.
Код программы есть, но он очень ненравиться моему преподу...нужно что было попроще и поменьше и чтоб были коментарии к строчкам. Надеюсь на помощь.
Код: Выделить всё
#include <windows.h>
#include <iostream>
using namespace std;
class timer //класс таймера
{
LARGE_INTEGER start; //начальное время
double freq; //частота таймера
double tick_len; //длина тика
double current_time; //текущее время
double last_time; //предыдущее время
void init(); //инициализация
double get_freq(); //частота таймера
public:
double need_time; //необходимое время
void stop_timer(); //остановка таймера
int step_timer(); //шаг работы
void start_timer(int); //старт таймера
void update_timer(int); //обновление
double read_timer(); //вернуть время (от начального времени)
};
//инициализация
void timer::init()
{
freq = get_freq();
tick_len = 1.0 / freq;
}
//частота таймера
double timer::get_freq()
{
LARGE_INTEGER fr;
if (!QueryPerformanceFrequency(&fr))
return 0;
return (double)fr.QuadPart;
}
//вернуть время (от начального времени)
double timer::read_timer()
{
DWORD_PTR oldMask = SetThreadAffinityMask(GetCurrentThread(), 0); //использовать только первое ядро процессора
LARGE_INTEGER current_time; //засечь текущее время
QueryPerformanceCounter(¤t_time); //восстановить маску использования ядер процессора
SetThreadAffinityMask(GetCurrentThread(), oldMask); //вернуть текущее время
return (current_time.QuadPart - start.QuadPart) * tick_len;
}
//старт таймера
void timer::start_timer(int nt)
{
init();
DWORD_PTR oldMask = SetThreadAffinityMask(GetCurrentThread(), 0); //вот этого куска кода и тот который выше недолжно быть
QueryPerformanceCounter(&start);
SetThreadAffinityMask(GetCurrentThread(), oldMask);
last_time = current_time = read_timer();
need_time = nt;
cout << "start_timer()\n";
}
//обновить таймер
void timer::update_timer(int nt)
{
last_time = current_time;
current_time = read_timer();
start_timer(nt);
cout << "update_timer()\n";
}
//остановить таймер
void timer::stop_timer()
{
current_time = 0;
need_time = 0;
last_time = 0;
cout << "stop_timer()\n";
}
//метод, реализующий один шаг работы таймера
int timer::step_timer()
{
if(need_time - read_timer() >= 0)
return 0;
else
return 1;
}
int main()
{
timer mytimer;
mytimer.start_timer(10); //старт таймера с указанным временем
while(!mytimer.step_timer())
{
cout << mytimer.need_time-(int)mytimer.read_timer() << "\n";
system("cls");
};
mytimer.update_timer(4); //обновление времени и рестарт таймера с новым временем
while(!mytimer.step_timer())
{
cout << mytimer.need_time-(int)mytimer.read_timer() << "\n";
system("cls");
};
mytimer.update_timer(5);
mytimer.stop_timer(); //остановка таймера
system("PAUSE");
return 0;
}