Особенности языка mql5, тонкости и приёмы работы - страница 187

 

Никто не встречал решение по мульти таймеру, чтобы самому не изобретать велосипед?
Реализация мне видится не сложной через применение указателей на функцию. Вряд ли до меня это бы не было уже реализовано.
Т.е. исходная задача - создавать таймер с любой периодичностью и сопоставлять ему свою функцию обработки события таймера. Причем таймеров может быть любое количество.

примерно так:

#include <Timer.mqh> 

CTimer timers;
int x1=0;
int x2=0;

int OnInit()
  {
   timers.NewTimer(500, Sum1);  // создаем новый таймер с периодом обновления 500  милисекунд и функцией-обраточником Sum1()
   timers.NewTimer(2000, Sum2); // создаем новый таймер с периодом обновления 2000 милисекунд и функцией-обраточником Sum2()
   return(INIT_SUCCEEDED);
  }

...

void OnTimer()
  {
    timers.OnTimer();   
  }

//+------------------------------------------------------------------+

void Sum1() { // данная функция вызывает с периодичностью 500 милисекунд
x1++;
if (x1==10) timers.KillTimer(Sum1); // удаляем этот таймер 
}

void Sum2() { // данная функция вызывает с периодичностью 2000 милисекунд
x2++;
if (x2==10) timers.KillTimer(Sum2); // удаляем этот таймер
}
 
Nikolai Semko:

Никто не встречал решение по мульти таймеру

Уверен, что видел в КБ давно.
 
fxsaber:
Уверен, что видел в КБ давно.

что-то не могу найти. Странно.
ладно, сам реализую. Вроде никаких подводных камней не должно быть. Выложу в КБ

 
Nikolai Semko:

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

проще вариант не пойдет?

input int            OnTimerMs               = 100;
int OnInit()
{
   EventSetMillisecondTimer(OnTimerMs);
   return(INIT_SUCCEEDED);
}
void  OnTimer()
{
   static uint tickcount_500ms = 0;
   static uint tickcount_1s = 0;
   static uint tickcount_1M = 0;
   uint gettickcount = GetTickCount();
   bool event_500ms  =  gettickcount - tickcount_500ms >= 500;
   bool event_1s     =  gettickcount - tickcount_1s >= 1000;
   bool event_1M     =  gettickcount - tickcount_1M >= 60000;
   

// счетчики 500мс, 1с и 1М
   if(event_500ms)
   {
      tickcount_500ms = gettickcount;
.....
   }

   if(event_1s)
   {
      tickcount_1s = gettickcount;
.....
   }

   if(event_1M)
   {
      tickcount_1M = gettickcount;
......
   }

}

UPD: а так, можно за шаблон взять код  fxsaber 

вот доделывал, чтобы автоматом все обьекты удалялись https://www.mql5.com/ru/forum/325418/page4#comment_16116740

 
Nikolai Semko:

что-то не могу найти. Странно.
ладно, сам реализую. Вроде никаких подводных камней не должно быть. Выложу в КБ

сделал
https://www.mql5.com/ru/code/31306

Multi Timer
Multi Timer
  • www.mql5.com
1. Включите в свою программу класс CTimer 2. Создайте один объект класса СTimer. Например timers. 3. Создайте функции-обработчики необходимых таймеров формата void AnyNameFunction() {....} например с такими именами: 4. Когда вам необходимо создать и запустить таймер, сделайте так из любого места: 5. Когда вам таймер больше не нужен...
 
Igor Makanu:

проще вариант не пойдет?

UPD: а так, можно за шаблон взять код  fxsaber 

вот доделывал, чтобы автоматом все обьекты удалялись https://www.mql5.com/ru/forum/325418/page4#comment_16116740

можно конечно и так. Но менее читабельно и труднее управляемо. 

 
Nikolai Semko:

сделал
https://www.mql5.com/ru/code/31306

когда-то давно (примерно)так делал. 

Использовать с классами неудобно.

class CWithTimer {

public:

    void CallMeByTimer();

};

и внешний (по отношению к классу) таймер с указателями на функцию бессилен.

 
Maxim Kuznetsov:

когда-то давно (примерно)так делал. 

Использовать с классами неудобно.

class CWithTimer {

public:

    void CallMeByTimer();

};

и внешний (по отношению к классу) таймер с указателями на функцию бессилен.

Если Вы имеете в виду функцию, как метод класса, то да, согласен. Вчера сам это понял и ломаю голову, как выкрутится. 
Хотелось бы этот класс применять внутри другого класса, иначе применение весьма ограниченно. 
Как минимум нужно ещё реализовать синглетон и контролировать уже запущенный вне класса таймер.
 
Nikolai Semko:
Если Вы имеете в виду функцию, как метод класса, то да, согласен. Вчера сам это понял и ломаю голову, как выкрутится. 
Хотелось бы этот класс применять внутри другого класса, иначе применение весьма ограниченно. 
Как минимум нужно ещё реализовать синглетон и контролировать уже запущенный вне класса таймер.
В объекте должен быть указатель на класс с таймером.
 
Vladimir Simakov:
В объекте должен быть указатель на класс с таймером.
Вопрос в том, как по указателю запустить нестатический метод класса, даже если объект другого класса (в данном случае CTimer) является свойством(переменной) этого класса. И возможно ли это. Боюсь что нет.
Причина обращения: