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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 29, средняя оценка - 4.79
BTR
8 / 8 / 1
Регистрация: 01.11.2010
Сообщений: 157
#1

Таймер (выполнение кода через заданный промежуток времени) - C++

18.03.2012, 02:23. Просмотров 3969. Ответов 8
Метки нет (Все метки)

Всем привет, подскажите, как создать внутренний таймер, то есть через что бы через некоторое количество секунд, программа опять выполняла определенный код...
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.03.2012, 02:23     Таймер (выполнение кода через заданный промежуток времени)
Посмотрите здесь:

Найти промежуток времени, в течение которого в музее одновременно находилось максимальное число посетителей C++
C++ Вычислить промежуток времени
C++ Таймер времени
Таймер - получить промежуток времени C++
Выполнение действий через заданный промежуток времени C++
C++ Бесконечный цикл с повторением через промежуток времени
C++ Промежуток времени, включающий полночь
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Dmitry_gdv
64 / 64 / 5
Регистрация: 18.03.2010
Сообщений: 351
18.03.2012, 02:34     Таймер (выполнение кода через заданный промежуток времени) #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
#pragma once
#include <iostream>
#include <Windows.h>
#include <process.h>
#include <stdio.h>
 
struct Time {
    int sec;
    int min;
    int hours;
};
 
class Timer {
private:
    bool worked;
    Time time;
public:
    Timer( );
    Timer( Time time );
    Timer( const Timer& timer );
 
    void SetTimer( Time time );
    void SetSec( int sec );
    void SetMin( int min );
    void SetHours( int hours );
    const Time GetTimer( ) const;
    const int GetSec( ) const;
    const int GetMin( ) const;
    const int GetHours( ) const;
    const bool GetWorked( ) const;
    void Reset( );
    void StartTimer( );
    void StopTimer( );
    void Print( ) const;
 
    ~Timer( );
 
    friend void TimeCount( void *param );
};
Добавлено через 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
116
117
118
119
#include "Timer.h"
 
Timer::Timer( ) {
    time.sec = 0;
    time.min = 0;
    time.hours = 0;
    worked = false;
}
Timer::Timer( Time time ) {
    this->time.sec = time.sec;
    this->time.min = time.min;
    this->time.hours = time.hours;
    worked = false;
}
Timer::Timer( const Timer& timer ) {
    this->time.sec = timer.time.sec;
    this->time.min = timer.time.min;
    this->time.hours = timer.time.hours;
    worked = false;
}
 
void Timer::SetTimer( Time time ) {
    this->time.sec = time.sec;
    this->time.min = time.min;
    this->time.hours = time.hours;
}
void Timer::SetSec( int sec ) {
    this->time.sec = sec;
}
void Timer::SetMin( int min ) {
    this->time.min = min;
}
void Timer::SetHours( int hours ) {
    this->time.hours = hours;
}
const Time Timer::GetTimer( ) const {
    return time;
}
const int Timer::GetSec( ) const {
    return time.sec;
}
const int Timer::GetMin( ) const {
    return time.min;
}
const int Timer::GetHours( ) const {
    return time.hours;
}
const bool Timer::GetWorked( ) const {
    return worked;
}
void Timer::Reset( ) {
    time.sec = 0;
    time.min = 0;
    time.hours = 0;
}
void Timer::Print( ) const {
    std::cout << time.hours << ":" << time.min << ":" << time.sec << std::endl;
}
void Timer::StartTimer( ) {
    worked = true;
    _beginthread( TimeCount, 0, ( void* ) this );
}
void Timer::StopTimer( ) {
    worked = false;
}
 
Timer::~Timer( ) {
    time.sec = 0;
    time.min = 0;
    time.hours = 0;
    worked = false;
}
 
void TimeCount( void *param ) {
    Timer *timer = ( Timer* ) param;
    DWORD startSec = 0, endSec = 0;
    while( true ) {
        // START COUNTING
        startSec = GetTickCount( );
        while( true ) {
            if( !timer->worked )  {
                _endthread( );
                break;
            }
            // END COUNTING
            endSec = GetTickCount( );
            if( ( endSec - startSec ) >= 923 ) {
                if( timer->time.sec > 0 ) {
                    timer->time.sec --;
                    break;
                }
                else {
                    // IF ( 0 == timer->time.sec )
                    if( ( 0 == timer->time.min ) && ( 0 == timer->time.hours ) ) {
                        timer->worked = false;
                        // if oll data == 0 - end thread
                        _endthread( );
                        break;
                    }
                    // ELSE IF ( 0 != timer->time.min == timer->time.hours )
                    timer->time.sec = 59;
                    if( timer->time.min > 0 ) {
                        timer->time.min --;
                        break;
                    }
                    else {
                        // IF ( 0 == timer->time.min )
                        timer->time.min = 59;
                        if( timer->time.hours > 0 ) {
                            timer->time.hours --;
                            break;
                        }
                        // HOURS HAVE NOT LIMIT
                    }
                }
            }
        }
    }
}
R136a1
142 / 111 / 15
Регистрация: 14.04.2011
Сообщений: 261
18.03.2012, 02:36     Таймер (выполнение кода через заданный промежуток времени) #3
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <ctime>
 
void timer(int);
 
int main ()
{
        timer(5);
 
        return 0;
}
 
void timer(int sec)
{
        clock_t wait;
        wait = clock() + sec * CLOCKS_PER_SEC;
        while (clock() < wait) {}
}
LVV
57 / 57 / 4
Регистрация: 15.02.2010
Сообщений: 245
18.03.2012, 09:30     Таймер (выполнение кода через заданный промежуток времени) #4
C++
1
2
3
4
5
6
7
8
#include <iostream>
using namespace std;
int main ()
{
//системная пауза в 5 секунд    
    system("pause 5");
return 0;
}
Добавлено через 21 минуту
Пардон. Глупость написал на счет pause...
Вот так нужно:
C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
#include <Windows.h>
using namespace std;
int main ()
{
    //системная задержка в 5000 милисекунд    
    Sleep(5000);
     
    return 0;
}
fasked
Эксперт C++
4932 / 2512 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
18.03.2012, 10:25     Таймер (выполнение кода через заданный промежуток времени) #5
Цитата Сообщение от R136a1 Посмотреть сообщение
while (clock() < wait) {}
Интересно сколько раз выполнится этот цикл, как его преобразует оптимизация и какова будет нагрузка на процессор
Dmitry_gdv
64 / 64 / 5
Регистрация: 18.03.2010
Сообщений: 351
18.03.2012, 11:28     Таймер (выполнение кода через заданный промежуток времени) #6
Цитата Сообщение от fasked Посмотреть сообщение
Интересно сколько раз выполнится этот цикл, как его преобразует оптимизация и какова будет нагрузка на процессор
Насколько знаю - использование функции Sleep(int) подгружает проц по полной - но самое плохое это то, что программа настолько сильно будет виснуть, что конечный пользователь будет мягко говоря не очень обрадован ...
Black Fregat
1355 / 985 / 215
Регистрация: 31.05.2009
Сообщений: 4,123
18.03.2012, 20:27     Таймер (выполнение кода через заданный промежуток времени) #7
Цитата Сообщение от Dmitry_gdv Посмотреть сообщение
Насколько знаю - использование функции Sleep(int) подгружает проц по полной
Тут Вы неправы. Я не поленился проверить, тем более, что много писать не надо.
C
1
2
3
4
5
6
#include <windows.h>
 
int main() {
    Sleep(25000);
    return 0;
}
Результат, как и ожидалось - все 25 секунд загрузка процессора - 0%

Цитата Сообщение от Dmitry_gdv Посмотреть сообщение
но самое плохое это то, что программа настолько сильно будет виснуть, что конечный пользователь будет мягко говоря не очень обрадован ...
Вы имеете в виду остановку цикла обработки сообщений? Это конечно, надо знать, что можно останавливать, а что нельзя
fasked
Эксперт C++
4932 / 2512 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
18.03.2012, 21:51     Таймер (выполнение кода через заданный промежуток времени) #8
Цитата Сообщение от Dmitry_gdv Посмотреть сообщение
но самое плохое это то, что программа настолько сильно будет виснуть, что конечный пользователь будет мягко говоря не очень обрадован ...
Будет ожидать только один поток, к слову говоря.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.03.2012, 11:13     Таймер (выполнение кода через заданный промежуток времени)
Еще ссылки по теме:

C++ Перелистывание картинок через определённый промежуток времени
C++ Сделать таймер, чтобы через указанное количество времени срабатывало прерывание и выполнялась заданная функция
C++ Определить промежуток времени
C++ Таймер с обратным отсчетом времени
C++ Определить сколько амёб будет через заданный промежуток времени, если известна скорость деления амёбы

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Dmitry_gdv
64 / 64 / 5
Регистрация: 18.03.2010
Сообщений: 351
19.03.2012, 11:13     Таймер (выполнение кода через заданный промежуток времени) #9
Хотел предупредить автора темы, что использование функции Sleep() в одном потоке с основными вычислениями грозит сильными тормозами ( Да - проц действительно не виснет, так как в принципе ему виснуть то не от чего, просто не так выразился ).
Yandex
Объявления
19.03.2012, 11:13     Таймер (выполнение кода через заданный промежуток времени)
Ответ Создать тему
Опции темы

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