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

класс Timer - C++

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

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

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

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

Класс: Разработать абстрактный класс класс Point для задания координаты...
Всем привет, помогите пожалуйста решить задачу, я уже всю голову сломал, не...

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

Timer почему не работает?
Добрый день. Есть следующий код. void Timer(CallBackType callback){ ...

19
veverix
39 / 39 / 5
Регистрация: 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
1148 / 865 / 90
Регистрация: 03.08.2011
Сообщений: 2,404
Завершенные тесты: 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
Эксперт С++
3636 / 1368 / 243
Регистрация: 16.04.2009
Сообщений: 4,527
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 / 5
Регистрация: 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
Эксперт С++
3636 / 1368 / 243
Регистрация: 16.04.2009
Сообщений: 4,527
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
Эксперт С++
3636 / 1368 / 243
Регистрация: 16.04.2009
Сообщений: 4,527
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
Эксперт С++
3636 / 1368 / 243
Регистрация: 16.04.2009
Сообщений: 4,527
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
Эксперт С++
3636 / 1368 / 243
Регистрация: 16.04.2009
Сообщений: 4,527
20.09.2012, 23:37 #15
Цитата Сообщение от BTR Посмотреть сообщение
с этим разобрался, просто интересно, как сделать тоже самое, что и со структурой, только с переменных количеством агрументов. Подскажите как?
Структура. В ней полей столько же, сколько и параметров хотите передать.
0
BTR
8 / 8 / 1
Регистрация: 01.11.2010
Сообщений: 157
21.09.2012, 00:09  [ТС] #16
Цитата Сообщение от go Посмотреть сообщение
Структура. В ней полей столько же, сколько и параметров хотите передать.
и что получается, для каждой своей функции придется писать структуру?

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

Добавлено через 14 минут
например как я вызову функцию pow?
C++
1
double pow(double, double);
или
C++
1
double pow(double, int);
0
OhMyGodSoLong
~ Эврика! ~
1245 / 994 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
21.09.2012, 00:40 #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...);
}
Хотя... это ж синхронный таймер.
1
Kastaneda
21.09.2012, 09:48
  #18

Не по теме:

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

1
KeyGen
384 / 291 / 21
Регистрация: 07.08.2011
Сообщений: 790
Записей в блоге: 1
21.09.2012, 10:09 #19
Зацени, уже написан: Timer
1
Kastaneda
Jesus loves me
Эксперт С++
4759 / 2962 / 340
Регистрация: 12.12.2009
Сообщений: 7,520
Записей в блоге: 2
Завершенные тесты: 1
21.09.2012, 10:22 #20
Там на С++ пример практически тоже, что здесь написали, только в "другой руке".
На Си больше на правду похоже.

Не по теме:

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

1
21.09.2012, 10:22
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.09.2012, 10:22
Привет! Вот еще темы с решениями:

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

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

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

Реализовать класс родительский класс "Пара чисел" и класс-наследник "Комплексное число"
Ткма работы создать класс pair (пара чисел); определить метод перемножения...


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

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

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