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

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

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

класс Timer - C++

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

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

Как сделать паузу 3 секунды у компонента Timer? C++
Иерархия геометрических объектов: клас точка->класс квадрат->класс прямоугольник C++
C++ Timer начало змейки
Timer в консольном приложении C++
C++ Timer почему не работает?
Класс, производный класс, паблик-класс C++
C++ Создать класс “Автомагазин”, состоящей из класса ”Марки машин”. Класс “Автомагазин ”:название магазина, адрес, телефон. Класс “ Марки машин ”: марка
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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
1139 / 856 / 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);
с этим разобрался, просто интересно, как сделать тоже самое, что и со структурой, только с переменных количеством агрументов. Подскажите как?
go
Эксперт C++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
20.09.2012, 23:37     класс Timer #15
Цитата Сообщение от BTR Посмотреть сообщение
с этим разобрался, просто интересно, как сделать тоже самое, что и со структурой, только с переменных количеством агрументов. Подскажите как?
Структура. В ней полей столько же, сколько и параметров хотите передать.
BTR
8 / 8 / 1
Регистрация: 01.11.2010
Сообщений: 157
21.09.2012, 00:09  [ТС]     класс Timer #16
Цитата Сообщение от go Посмотреть сообщение
Структура. В ней полей столько же, сколько и параметров хотите передать.
и что получается, для каждой своей функции придется писать структуру?

Добавлено через 44 секунды
или написать общую структуру для всех функций? А если программа большая, то тогда уже будет неудобно использовать класс...

Добавлено через 14 минут
например как я вызову функцию pow?
C++
1
double pow(double, double);
или
C++
1
double pow(double, int);
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
21.09.2012, 00:40     класс Timer #17
Тут такое дело, что функцию вы вызываете асинхронно. То есть то, что вы там передаёте в аргументах, уже может быть неактуальным и вообще не существовать на момент фактического вызова.

Поэтому чаще всего стараются передавать в такие асинхронные штуки обещание выполнения функции (thunk) — функцию без аргументов, которая вызывает ваш pow с теми сохранёнными значениями, которые были переданы конструктору обещания. Тогда это обещание можно спокойно выполнить, когда придёт время, так как у него будут личные копии аргументов, которые никуда не пропадут.

Можно писать это руками, но есть уже готовый сахарок: boost::bind / лямбды C++11.

Функций с переменным числом параметров вроде
C++
1
2
3
4
5
6
template<class T, class args>
Timer::Timer(const int sec, T func, args arg)
{
   Sleep(sec * 1000);
   func(arg);
}
нормально сделать можно только через шаблоны C++11:
C++
1
2
3
4
5
6
template<class T, class... Args>
Timer::Timer(const int sec, T func, Args... args)
{
   Sleep(sec * 1000);
   func(args...);
}
Хотя... это ж синхронный таймер.
Kastaneda
21.09.2012, 09:48
  #18

Не по теме:

Вчера еще наткнулся на эту тему, я то думал надо сделать что-нибудь типа QTimer::singleShot, даже на тему подписался, а тут ...

KeyGen
383 / 290 / 6
Регистрация: 07.08.2011
Сообщений: 789
Записей в блоге: 1
21.09.2012, 10:09     класс Timer #19
Зацени, уже написан: Timer
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.09.2012, 10:22     класс Timer
Еще ссылки по теме:

Реализовать класс Goods используя для представления цены класс Money C++
C++ Ошибка в выводе данных, класс выводит правильно, а класс в классе - нет
C++ Не удаётся связать два файла timer.h и timer.cpp
Отдельно класс данных, класс формул и главный класс C++
C++ Абстрактный класс CGraphicsObject, его наследник - базовый класс CPoint, и класс - наследник от CPoint

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

Или воспользуйтесь поиском по форуму:
Kastaneda
Форумчанин
Эксперт С++
4470 / 2832 / 224
Регистрация: 12.12.2009
Сообщений: 7,202
Записей в блоге: 1
Завершенные тесты: 1
21.09.2012, 10:22     класс Timer #20
Там на С++ пример практически тоже, что здесь написали, только в "другой руке".
На Си больше на правду похоже.

Не по теме:

Нагуглить я б тоже смог, интересно было, что здесь напишут

Yandex
Объявления
21.09.2012, 10:22     класс Timer
Ответ Создать тему
Опции темы

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