Интервальный таймер

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
Katy13
Сообщения: 1
Зарегистрирован: 22 мар 2011, 18:04

Добрый вечер. Мне очень нужна помощь в решении задачи на С++.
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(&current_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;      
}
Ответить