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

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

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

класс Timer - C++

20.09.2012, 18:26. Просмотров 3771. Ответов 19
Метки нет (Все метки)

создать класс timer который через установленный интервал времени вызывает заданную функцию.
Вот такая вот задача, только никак даже сообразить не могу, как это возможно реализовать?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.09.2012, 18:26
Здравствуйте! Я подобрал для вас темы с ответами на вопрос класс Timer (C++):

Не удаётся связать два файла timer.h и timer.cpp - C++
Добрый вечер, у меня есть класс и библиотеки которые нужно использовать в нескольких программах, по этому я хочу сделать отдельный файл...

Есть класс A и класс B, класс B вложен в класс A и вложен в него, как классу B получить доступ к переменным класса A просто по имени? - C++
На самом деле ничё фантастического я не прошу, ведь: template <class T> class matrix { friend class diagonal; ...

Класс таблиц баз данных и класс записей в таблице(реляционная таблица). Предусмотреть класс связей между таблицами - C++
Здравствуйте! Никак не могу продумать структуру этой программы. Проходим наследование, но я все равно не знаю, как его здесь применить. Как...

Отдельно класс данных, класс формул и главный класс - C++
Здравствуйте! У меня есть три вопроса. Первый вопрос. Скажите пожалуйста! Правильный ли это подход к созданию приложений :...

Timer в консольном приложении - C++
Доброе время суток! Подскажите пожалуйста, как в консольном приложении создать таймер, который бы срабатывал каждые n минут или в...

Timer почему не работает? - C++
Добрый день. Есть следующий код. void Timer(CallBackType callback){ int t1 = time(NULL); int t2 = time(NULL); ...

19
veverix
39 / 39 / 2
Регистрация: 14.09.2012
Сообщений: 85
20.09.2012, 19:00 #2
есть ограничения на функции?

Добавлено через 22 минуты
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
#include <iostream>
#include <Windows.h>
using namespace std;
 
typedef void(*f)(int &, int &);
 
class timer
{
    int time;
    f func;
public:
    timer(int _time, f _func, int &a, int &b)
    {
        time = _time;
        func = _func;
        Sleep(time);
        func(a, b);
    }
};
 
void swap(int a, int b)
{
    int temp;
    temp = a;
    a = b;
    b = temp;
}
    
 
void main()
{ 
    int a=2, b=3, time;
    cout<<"Enter time in ms"<<endl;
    cin>>time;
    cout<<"Beg: "<<a<<' '<<b<<endl;
    timer(time, swap, a, b);
    cout<<"End: "<<a<<' '<<b<<endl;
    system("pause");
}
Вот пример. Но по идее для каждой функции нужно писать свой тип адреса, да и значения имзо должны передаваться как-то по другому.
1
BTR
8 / 8 / 1
Регистрация: 01.11.2010
Сообщений: 157
20.09.2012, 20:20  [ТС] #3
нет ограничений, надо разобраться в вашем коде, очень интересно, спасибо

Цитата Сообщение от veverix Посмотреть сообщение
есть ограничения на функции?
C++
1
#include <iostream>...}
Вот пример. Но по идее для каждой функции нужно писать свой тип адреса, да и значения имзо должны передаваться как-то по другому.
Прикол в том, что неизвестно сколько параметров у функции будет, поэтому я сам запутался
0
Toshkarik
1143 / 860 / 51
Регистрация: 03.08.2011
Сообщений: 2,390
Завершенные тесты: 1
20.09.2012, 20:23 #4
veverix, time это имя функции стандартной библиотеки. Не нужно выбирать данный идентификатор для переменных. Даже форум подсветил имя синим цветом.
0
BTR
8 / 8 / 1
Регистрация: 01.11.2010
Сообщений: 157
20.09.2012, 20:41  [ТС] #5
так и как сделать так, что бы можно было задавать функцию, так что бы класс не знал, сколько у нее параметров и что она возвращает? Или это невозможно?
0
go
Эксперт С++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
20.09.2012, 20:58 #6
BTR, вот простой пример
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
#include <ctime>
#include <iostream>
 
void fun();
 
template<class T>
class timerr 
{
public:
   timerr(const std::size_t t, T fun)
   {
       std::time_t rawtime;
 
       std::time(&rawtime);
       msleep(t * 1000); 
       std::cout << std::ctime(&rawtime) << std::endl;
       fun();
   }
  void msleep(unsigned long milisec)  
  {  
 
      struct timespec req={0};  
 
      time_t sec=(int)(milisec/1000);  
 
      milisec=milisec-(sec*1000);  
 
      req.tv_sec=sec;  
 
      req.tv_nsec=milisec*1000000L;  
 
      while(nanosleep(&req,&req) == -1);  
   }   
};
 
void fun()
{
   std::time_t rawtime;
 
   std::time(&rawtime);
   std::cout << std::ctime(&rawtime) << std::endl;
} 
 
int main()
{
   timerr<void (*)()> t(3, fun);
}
Код
Execution output:
Thu Sep 20 19:56:59 2012

Thu Sep 20 19:57:02 2012
http://liveworkspace.org/code/1e30d075cf9d4e0c72bfb6a97b9c42e8
2
veverix
39 / 39 / 2
Регистрация: 14.09.2012
Сообщений: 85
20.09.2012, 21:04 #7
Цитата Сообщение от Toshkarik Посмотреть сообщение
veverix, time это имя функции стандартной библиотеки. Не нужно выбирать данный идентификатор для переменных. Даже форум подсветил имя синим цветом.
Так я ж ctime не подключал. Ну ладно, если риск конфликта то переименую)

Добавлено через 2 минуты
Цитата Сообщение от BTR Посмотреть сообщение
так и как сделать так, что бы можно было задавать функцию, так что бы класс не знал, сколько у нее параметров и что она возвращает? Или это невозможно?
По идее нельзя. Если без параметров или с определенным количеством через шаблоны еще можно попробывать задать, то не зная количество аргументов ей просто не задашь адрес (если речь идет о классе, для каждого из объектов которого можно создать свою функцию)
0
BTR
8 / 8 / 1
Регистрация: 01.11.2010
Сообщений: 157
20.09.2012, 21:20  [ТС] #8
Цитата Сообщение от go Посмотреть сообщение
BTR, вот простой пример
C++
1
#include <ctime>...}
Код
Execution output:
Thu Sep 20 19:56:59 2012

Thu Sep 20 19:57:02 2012
http://liveworkspace.org/code/1e30d075cf9d4e0c72bfb6a97b9c42e8
на VS 2010 не компилируется

Добавлено через 4 минуты
Цитата Сообщение от BTR Посмотреть сообщение
на VS 2010 не компилируется
Переделал код и скомпилировал, идею понял, спасибо, но теперь непонятно, если я создал функцию с другими параметрами, то как указать эти параметры при вызове?

Добавлено через 6 минут
Например такую функцию
C++
1
2
3
4
void res(int i)
{
    cout << i << endl;
}
вызываю так:
C++
1
timerr<void (*)(int)> t(2, res);
но в конструкторе прописано, что вызывается функция без агрументов, как мне этой функции передать агрумент?
0
go
Эксперт С++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
20.09.2012, 21:53 #9
Цитата Сообщение от BTR Посмотреть сообщение
на VS 2010 не компилируется
Конечно, писал же я под Линукс.

Цитата Сообщение от BTR Посмотреть сообщение
но в конструкторе прописано, что вызывается функция без агрументов, как мне этой функции передать агрумент?
Либо с попощью функции с переменным числом параметров, либо с объединить все параметры в структуру. Я бы выбрал второй.
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
#include <ctime>
#include <iostream>
 
struct T_
{
private:
   int a;
public: 
   T_(const int a_) : a(a_) { }
   int get() { return a; } 
};    
 
void fun(T_);
 
template<class T, class str>
class timerr 
{
public:
   timerr(const std::size_t t, T fun, str st)
   {
       std::time_t rawtime;
 
       std::time(&rawtime);
       msleep(t * 1000); 
       std::cout << std::ctime(&rawtime) << std::endl;
       fun(st);
   }
  void msleep(unsigned long milisec)  
  {  
 
      struct timespec req={0};  
 
      time_t sec=(int)(milisec/1000);  
 
      milisec=milisec-(sec*1000);  
 
      req.tv_sec=sec;  
 
      req.tv_nsec=milisec*1000000L;  
 
      while(nanosleep(&req,&req) == -1);  
   }   
};
 
void fun(T_ st)
{
   std::time_t rawtime;
 
   std::time(&rawtime);
   std::cout << std::ctime(&rawtime) << st.get() << std::endl;
} 
 
int main()
{
 
    
   const timerr<void (*)(T_), T_> t(3, fun, T_(5));
}
Код
Execution output:
Thu Sep 20 20:51:06 2012

Thu Sep 20 20:51:09 2012
5
http://liveworkspace.org/code/00cff4324f42b0396c9bb69f801c65f9
1
BTR
8 / 8 / 1
Регистрация: 01.11.2010
Сообщений: 157
20.09.2012, 22:43  [ТС] #10
а как тогда ты вызовешь такую функцию?
C++
1
int result(int, int, int *);
Добавлено через 11 минут
а покажи пожалуйста пример, который использует функцию с переменным числом параметров, заранее благодарен
0
go
Эксперт С++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
20.09.2012, 22:43 #11
Объявляешь структуру
C++
1
2
3
4
5
6
7
struct T__
{
    int a, b;
    int *c;
public:
    T__(int a_, int b_, int *c_) : a(a_), b(b_), c(c_) { }
};
Вызов
C++
1
const timerr<void (*)(T__), T__> t(3, fun, T__(5, 6, NULL));
0
BTR
8 / 8 / 1
Регистрация: 01.11.2010
Сообщений: 157
20.09.2012, 23:24  [ТС] #12
main.cpp
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
#include <iostream>
#include "Numb.h"
#include "Timer.h"
 
using namespace std;
using namespace Numb;
using MTimer::Timer;
 
 
struct forFunc
{
    
    forFunc(const numb a) : __a(a) {}
    numb get() {return __a;}
    
    numb __a;
};
 
void somefunc1()
{
    cout << "Test somefunc1" << endl;
}
 
void somefunc2(forFunc ff)
{
    cout << ff.get() << endl;
}
 
int main()
{
    setlocale(LC_ALL, "Russian");
 
    Timer<void (*)(forFunc), forFunc> obj(2, somefunc2, forFunc(5.15));
 
 
 
   system("pause >> void");
}
Timer.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#ifndef TIMER_H
#define TIMER_H
 
#include <Windows.h>
 
/* 
 
    Интерфейс класса Timer
    Timer - класс вызывающий заданную функцию в определенном интервале времени
 
*/
 
namespace MTimer {
 
template<class T, class args>
class Timer
{
public:
    Timer(const int, T, args);
};
}
 
#endif
Timer.cpp
C++
1
2
3
4
5
6
7
8
#include "Timer.h"
 
template<class T, class args>
MTimer::Timer<T, args>::Timer(const int sec, T func, args arg)
{
    Sleep(sec * 1000);
    func(arg);
}
при компиляции ошибка:
1>main.obj : error LNK2019: ссылка на неразрешенный внешний символ "public: __thiscall MTimer::Timer<void (__cdecl*)(struct forFunc),struct forFunc>::Timer<void (__cdecl*)(struct forFunc),struct forFunc>(int,void (__cdecl*)(struct forFunc),struct forFunc)" (??0?$Timer@P6AXUforFunc@@@ZU1@@MTimer@@QAE@HP6AXUforFunc@@@Z0@Z) в функции _main

1>C:\Users\Andrey\documents\visual studio 2010\Projects\cxx\Debug\cxx.exe : fatal error LNK1120: 1 неразрешенных внешних элементов

Добавлено через 17 минут
Все, вот так заработало
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
#include <iostream>
#include <Windows.h>
#include "Numb.h"
 
using namespace std;
using namespace Numb;
 
template<class T, class args>
class Timer
{
public:
   Timer(const int, T, args);
};
 
template<class T, class args>
Timer<T, args>::Timer(const int sec, T func, args arg)
{
   Sleep(sec * 1000);
   func(arg);
}
 
struct forFunc
{
   
   forFunc(const numb a) : __a(a) {}
   numb get() {return __a;}
   
   numb __a;
};
 
void somefunc1()
{
   cout << "Test somefunc1" << endl;
}
 
void somefunc2(forFunc ff)
{
   cout << ff.get() << endl;
}
 
int main()
{
   setlocale(LC_ALL, "Russian");
 
   Timer<void (*)(forFunc), forFunc> obj(2, somefunc2, forFunc(5.15));
 
 
 
   system("pause >> void");
}
Добавлено через 28 секунд

но как создать такой же вариант с функцией с переменным числом параметров?
Просто в данном варианте не получается вызвать функцию без параметров

если не сделать так

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
class Timer
{
public:
 
   template<class T, class args>
   Timer(const int, T, args);
 
   template<class T>
   Timer(const int, T);
};
 
template<class T, class args>
Timer::Timer(const int sec, T func, args arg)
{
   Sleep(sec * 1000);
   func(arg);
}
 
template<class T>
Timer::Timer(const int sec, T func)
{
   Sleep(sec * 1000);
   func();
}
0
go
Эксперт С++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
20.09.2012, 23:34 #13
Цитата Сообщение от BTR Посмотреть сообщение
Просто в данном варианте не получается вызвать функцию без параметров
Это почему? Новую структуру создайте.

Добавлено через 1 минуту
или вы хотите, что-то вроде?
C
1
void fun(void);
0
BTR
8 / 8 / 1
Регистрация: 01.11.2010
Сообщений: 157
20.09.2012, 23:36  [ТС] #14
Цитата Сообщение от go Посмотреть сообщение
Это почему? Новую структуру создайте.

Добавлено через 1 минуту
или вы хотите, что-то вроде?
C
1
void fun(void);
с этим разобрался, просто интересно, как сделать тоже самое, что и со структурой, только с переменных количеством агрументов. Подскажите как?
0
go
Эксперт С++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
20.09.2012, 23:37 #15
Цитата Сообщение от BTR Посмотреть сообщение
с этим разобрался, просто интересно, как сделать тоже самое, что и со структурой, только с переменных количеством агрументов. Подскажите как?
Структура. В ней полей столько же, сколько и параметров хотите передать.
0
20.09.2012, 23:37
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.09.2012, 23:37
Привет! Вот еще темы с ответами:

Timer начало змейки - C++
Есть таймер и есть label1 таймер включен в таймере прописано Label1-&gt;Left= Left +1; и в результате Label1 перемещаетья...

Как сделать паузу 3 секунды у компонента Timer? - C++
подскажите пожалуйста как сделать паузу в работе у компонента Timer в 3 секунды.

Реализовать класс родительский класс "Пара чисел" и класс-наследник "Комплексное число" - C++
Ткма работы создать класс pair (пара чисел); определить метод перемножения полей и операцию сложения пар (a,b)+(c,d) =(a+b,c+d)...

Класс, производный класс, паблик-класс - C++
Задание: Создать класс колесо, которое имеет радиус. Определить конструкторы и метод доступа. Создать класс машин, содержащий класс колесо....


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

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

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