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

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

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

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

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

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

Выполнение действий через заданный промежуток времени - C++
Нужен самый простой пример програмки на си++ (работаю в вижуал студио), которая будет каждый равный промежуток времени выполнять какоето...

Определить сколько амёб будет через заданный промежуток времени, если известна скорость деления амёбы - C++
Нужно решить задачу: Одноклеточная амёба каждые 3 часа делится на 2 клетки. Определите сколько амёб будет через 3, 6, 9, 12 ... 24 часа. ...

Таймер - получить промежуток времени - C++
есть форма с таймером и 2 кнопками :"старт"и "стоп" ну и тест. при нажатиии на старт запускается таймер и пользователь начинает отвечать...

Перелистывание картинок через определённый промежуток времени - C++
К примеру, мне нужно что-бы при запуске конвертировании программы, 5 картинок менялись собой местами беспрерывно.Можно это сделать в C++...

Бесконечный цикл с повторением через промежуток времени - C++
как создать бесконечный цикл с повторением через промежуток времени? вот цикл, который надо повторять: #include<iostream> ...

Сделать таймер, чтобы через указанное количество времени срабатывало прерывание и выполнялась заданная функция - C++
Доброго времени суток. У меня такой вопрос, нужно сделать как бы диспетчер задач но вопрос не в этом, подскажите как сделать таймер чтобы...

8
Dmitry_gdv
64 / 64 / 5
Регистрация: 18.03.2010
Сообщений: 353
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
                    }
                }
            }
        }
    }
}
3
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) {}
}
2
LVV
57 / 57 / 4
Регистрация: 15.02.2010
Сообщений: 258
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;
}
1
fasked
Эксперт С++
4945 / 2525 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
18.03.2012, 10:25 #5
Цитата Сообщение от R136a1 Посмотреть сообщение
while (clock() < wait) {}
Интересно сколько раз выполнится этот цикл, как его преобразует оптимизация и какова будет нагрузка на процессор
2
Dmitry_gdv
64 / 64 / 5
Регистрация: 18.03.2010
Сообщений: 353
18.03.2012, 11:28 #6
Цитата Сообщение от fasked Посмотреть сообщение
Интересно сколько раз выполнится этот цикл, как его преобразует оптимизация и какова будет нагрузка на процессор
Насколько знаю - использование функции Sleep(int) подгружает проц по полной - но самое плохое это то, что программа настолько сильно будет виснуть, что конечный пользователь будет мягко говоря не очень обрадован ...
1
Black Fregat
1392 / 1023 / 228
Регистрация: 31.05.2009
Сообщений: 4,275
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 Посмотреть сообщение
но самое плохое это то, что программа настолько сильно будет виснуть, что конечный пользователь будет мягко говоря не очень обрадован ...
Вы имеете в виду остановку цикла обработки сообщений? Это конечно, надо знать, что можно останавливать, а что нельзя
1
fasked
Эксперт С++
4945 / 2525 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
18.03.2012, 21:51 #8
Цитата Сообщение от Dmitry_gdv Посмотреть сообщение
но самое плохое это то, что программа настолько сильно будет виснуть, что конечный пользователь будет мягко говоря не очень обрадован ...
Будет ожидать только один поток, к слову говоря.
0
Dmitry_gdv
64 / 64 / 5
Регистрация: 18.03.2010
Сообщений: 353
19.03.2012, 11:13 #9
Хотел предупредить автора темы, что использование функции Sleep() в одном потоке с основными вычислениями грозит сильными тормозами ( Да - проц действительно не виснет, так как в принципе ему виснуть то не от чего, просто не так выразился ).
0
19.03.2012, 11:13
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.03.2012, 11:13
Привет! Вот еще темы с ответами:

Вычислить промежуток времени - C++
линейные алгоритмы Заданы моменты начала и конца некоторого периода времени в часах, минутах и секундах. Найти продолжительность этого...

Определить промежуток времени - C++
Добрый вечер, уважаемые форумчане. Никак не могу сдвинуться с места со свое задачей: &quot;Известные данные о статьях.Каждая статья...

Промежуток времени, включающий полночь - C++
Вечер добрый, Задача такая : Start = 19:52:35; h:m:s Stop = 22:15:15; while(1) { now = rtc.now(); if(now&lt;Stop &amp;&amp; now...

Найти промежуток времени, в течение которого в музее одновременно находилось максимальное число посетителей - C++
помогите пожалуйста исправить ошибки в коде: #include &lt;iostream&gt; using namespace std; void main() { int N,i,C,...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

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