Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 5.00
Katy13
Сообщений: n/a
22.03.2011, 17:50     Интервальный таймер #1
Добрый вечер. Мне очень нужна помощь в решении задачи на С++.
1) Должен быть метод, реализующий _один_ шаг работы таймера. Возвращать должен текущее состояние выхода (0 если счетчик не равен нулю, 1 если равен), при достижении счетчиком значения 0 он должен перезапускаться.
2) Соответственно, должны быть методы для установки интервала (максимального значения счетчика), его сброса, остановки и запуска, все это в одном классе.

Код программы есть, но он очень ненравиться моему преподу...нужно что было попроще и поменьше и чтоб были коментарии к строчкам. Надеюсь на помощь.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
#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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.03.2011, 17:50     Интервальный таймер
Посмотрите здесь:

Интервальный тип C++
C++ Таймер
C++ таймер c++
C++ unordered_multimap - интервальный конструктор
таймер C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
slice
32 / 75 / 4
Регистрация: 04.11.2010
Сообщений: 249
22.03.2011, 18:58     Интервальный таймер #2
Цитата Сообщение от Katy13 Посмотреть сообщение
Код программы есть, но он очень ненравиться моему преподу...нужно что было попроще и поменьше
более вероятно, что ты попросту не смогла объяснить ему, как этот код работает.
Katy13
Сообщений: n/a
22.03.2011, 19:27     Интервальный таймер #3
Если бы он спрашивал меня..Он мне сказал что нельзя использовать библиотеку windows, и что он у меня её принимать не будит так как мы так не пишим. Я уже запарилась ему сдавать, из за него на второй год осталась.
slice
32 / 75 / 4
Регистрация: 04.11.2010
Сообщений: 249
22.03.2011, 19:31     Интервальный таймер #4
используй функцию clock из time.h
Yandex
Объявления
22.03.2011, 19:31     Интервальный таймер
Ответ Создать тему
Опции темы

Текущее время: 13:15. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru