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

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

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

класс Timer - C++

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

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

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

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

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

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

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

Класс Стек Stack. не работает класс исключений - C++
Здравствуйте! Решил проверить код на пригодность, но почему то класс исключений выскакивает на ошибке. Я никак не могу понять такие вещи...

Оцените класс больших чисел класс big_int - C++
big_int - класс больших чисел. Цифра храниться в строке. Работать будет как int, но во много раз больше (120-тизначное число). "+" и "-"...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
veverix
39 / 39 / 2
Регистрация: 14.09.2012
Сообщений: 85
20.09.2012, 19:00     класс Timer #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");
}
Вот пример. Но по идее для каждой функции нужно писать свой тип адреса, да и значения имзо должны передаваться как-то по другому.
BTR
8 / 8 / 1
Регистрация: 01.11.2010
Сообщений: 157
20.09.2012, 20:20  [ТС]     класс Timer #3
нет ограничений, надо разобраться в вашем коде, очень интересно, спасибо

Цитата Сообщение от veverix Посмотреть сообщение
есть ограничения на функции?
C++
1
#include <iostream>...}
Вот пример. Но по идее для каждой функции нужно писать свой тип адреса, да и значения имзо должны передаваться как-то по другому.
Прикол в том, что неизвестно сколько параметров у функции будет, поэтому я сам запутался
Toshkarik
1140 / 857 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
20.09.2012, 20:23     класс Timer #4
veverix, time это имя функции стандартной библиотеки. Не нужно выбирать данный идентификатор для переменных. Даже форум подсветил имя синим цветом.
BTR
8 / 8 / 1
Регистрация: 01.11.2010
Сообщений: 157
20.09.2012, 20:41  [ТС]     класс Timer #5
так и как сделать так, что бы можно было задавать функцию, так что бы класс не знал, сколько у нее параметров и что она возвращает? Или это невозможно?
go
Эксперт C++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
20.09.2012, 20:58     класс Timer #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/1e30d0...bfb6a97b9c42e8
veverix
39 / 39 / 2
Регистрация: 14.09.2012
Сообщений: 85
20.09.2012, 21:04     класс Timer #7
Цитата Сообщение от Toshkarik Посмотреть сообщение
veverix, time это имя функции стандартной библиотеки. Не нужно выбирать данный идентификатор для переменных. Даже форум подсветил имя синим цветом.
Так я ж ctime не подключал. Ну ладно, если риск конфликта то переименую)

Добавлено через 2 минуты
Цитата Сообщение от BTR Посмотреть сообщение
так и как сделать так, что бы можно было задавать функцию, так что бы класс не знал, сколько у нее параметров и что она возвращает? Или это невозможно?
По идее нельзя. Если без параметров или с определенным количеством через шаблоны еще можно попробывать задать, то не зная количество аргументов ей просто не задашь адрес (если речь идет о классе, для каждого из объектов которого можно создать свою функцию)
BTR
8 / 8 / 1
Регистрация: 01.11.2010
Сообщений: 157
20.09.2012, 21:20  [ТС]     класс Timer #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/1e30d0...bfb6a97b9c42e8
на 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);
но в конструкторе прописано, что вызывается функция без агрументов, как мне этой функции передать агрумент?
go
Эксперт C++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
20.09.2012, 21:53     класс Timer #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/00cff4...9bb69f801c65f9
BTR
8 / 8 / 1
Регистрация: 01.11.2010
Сообщений: 157
20.09.2012, 22:43  [ТС]     класс Timer #10
а как тогда ты вызовешь такую функцию?
C++
1
int result(int, int, int *);
Добавлено через 11 минут
а покажи пожалуйста пример, который использует функцию с переменным числом параметров, заранее благодарен
go
Эксперт C++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
20.09.2012, 22:43     класс Timer #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));
BTR
8 / 8 / 1
Регистрация: 01.11.2010
Сообщений: 157
20.09.2012, 23:24  [ТС]     класс Timer #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();
}
go
Эксперт C++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
20.09.2012, 23:34     класс Timer #13
Цитата Сообщение от BTR Посмотреть сообщение
Просто в данном варианте не получается вызвать функцию без параметров
Это почему? Новую структуру создайте.

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

Добавлено через 1 минуту
или вы хотите, что-то вроде?
C
1
void fun(void);
с этим разобрался, просто интересно, как сделать тоже самое, что и со структурой, только с переменных количеством агрументов. Подскажите как?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.09.2012, 23:37     класс Timer
Еще ссылки по теме:

Класс создающий класс и любого его наследника - C++
Есть класс: #pragma once #include &lt;string&gt; #include &quot;Entity.h&quot; class ObjectList { private: //Global List struct List_ {...

Класс объявление с элементом типа класс Текст - C++
Необработанное исключение в &quot;0x770015de&quot; в &quot;FAQ.exe&quot;: 0xC0000005: Нарушение прав доступа при записи...

Класс А не принимает член-переменную с типом класс Б - C++
Разработка ведётся в Visual Studio 2010 с использованием MFC Есть некий класс AnswersStatistic, header которого приведён ниже: ...

Класс, полиморфизм (Написать класс, который хранит в себе некий номер ''nip'', проверит его на правильность и вывести результат) - C++
Задача. Написать класс, который хранит в себе некий номер ''nip'', проверит его на правильность и вывести результат. Вообщем-то ни...

Наследование. Класс Круг и класс эллипс - C++
Здравствуйте уважаемые программисты. Нужно исправить ошибки в программе. Честно я в этом ничего не понимаю. Вот код программы: #include...


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

Или воспользуйтесь поиском по форуму:
go
Эксперт C++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
20.09.2012, 23:37     класс Timer #15
Цитата Сообщение от BTR Посмотреть сообщение
с этим разобрался, просто интересно, как сделать тоже самое, что и со структурой, только с переменных количеством агрументов. Подскажите как?
Структура. В ней полей столько же, сколько и параметров хотите передать.
Yandex
Объявления
20.09.2012, 23:37     класс Timer
Ответ Создать тему
Опции темы

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