Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.68/50: Рейтинг темы: голосов - 50, средняя оценка - 4.68
8 / 8 / 1
Регистрация: 01.11.2010
Сообщений: 157
1

класс Timer

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

Author24 — интернет-сервис помощи студентам
создать класс timer который через установленный интервал времени вызывает заданную функцию.
Вот такая вот задача, только никак даже сообразить не могу, как это возможно реализовать?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.09.2012, 18:26
Ответы с готовыми решениями:

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

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

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

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

19
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
8 / 8 / 1
Регистрация: 01.11.2010
Сообщений: 157
20.09.2012, 20:20  [ТС] 3
нет ограничений, надо разобраться в вашем коде, очень интересно, спасибо

Цитата Сообщение от veverix Посмотреть сообщение
есть ограничения на функции?
C++
1
#include <iostream>...}
Вот пример. Но по идее для каждой функции нужно писать свой тип адреса, да и значения имзо должны передаваться как-то по другому.
Прикол в том, что неизвестно сколько параметров у функции будет, поэтому я сам запутался
0
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
20.09.2012, 20:23 4
veverix, time это имя функции стандартной библиотеки. Не нужно выбирать данный идентификатор для переменных. Даже форум подсветил имя синим цветом.
0
8 / 8 / 1
Регистрация: 01.11.2010
Сообщений: 157
20.09.2012, 20:41  [ТС] 5
так и как сделать так, что бы можно было задавать функцию, так что бы класс не знал, сколько у нее параметров и что она возвращает? Или это невозможно?
0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
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/... a97b9c42e8
2
39 / 39 / 5
Регистрация: 14.09.2012
Сообщений: 85
20.09.2012, 21:04 7
Цитата Сообщение от Toshkarik Посмотреть сообщение
veverix, time это имя функции стандартной библиотеки. Не нужно выбирать данный идентификатор для переменных. Даже форум подсветил имя синим цветом.
Так я ж ctime не подключал. Ну ладно, если риск конфликта то переименую)

Добавлено через 2 минуты
Цитата Сообщение от BTR Посмотреть сообщение
так и как сделать так, что бы можно было задавать функцию, так что бы класс не знал, сколько у нее параметров и что она возвращает? Или это невозможно?
По идее нельзя. Если без параметров или с определенным количеством через шаблоны еще можно попробывать задать, то не зная количество аргументов ей просто не задашь адрес (если речь идет о классе, для каждого из объектов которого можно создать свою функцию)
0
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/... a97b9c42e8
на 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
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
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/... 9f801c65f9
1
8 / 8 / 1
Регистрация: 01.11.2010
Сообщений: 157
20.09.2012, 22:43  [ТС] 10
а как тогда ты вызовешь такую функцию?
C++
1
int result(int, int, int *);
Добавлено через 11 минут
а покажи пожалуйста пример, который использует функцию с переменным числом параметров, заранее благодарен
0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
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
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
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
20.09.2012, 23:34 13
Цитата Сообщение от BTR Посмотреть сообщение
Просто в данном варианте не получается вызвать функцию без параметров
Это почему? Новую структуру создайте.

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

Добавлено через 1 минуту
или вы хотите, что-то вроде?
C
1
void fun(void);
с этим разобрался, просто интересно, как сделать тоже самое, что и со структурой, только с переменных количеством агрументов. Подскажите как?
0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
20.09.2012, 23:37 15
Цитата Сообщение от BTR Посмотреть сообщение
с этим разобрался, просто интересно, как сделать тоже самое, что и со структурой, только с переменных количеством агрументов. Подскажите как?
Структура. В ней полей столько же, сколько и параметров хотите передать.
0
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
~ Эврика! ~
1256 / 1005 / 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
387 / 294 / 21
Регистрация: 07.08.2011
Сообщений: 790
Записей в блоге: 1
21.09.2012, 10:09 19
Зацени, уже написан: Timer
1
5231 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,116
Записей в блоге: 2
21.09.2012, 10:22 20
Там на С++ пример практически тоже, что здесь написали, только в "другой руке".
На Си больше на правду похоже.

Не по теме:

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

1
21.09.2012, 10:22
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.09.2012, 10:22
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru