Características del lenguaje mql5, sutilezas y técnicas - página 187

 

¿Alguien ha dado con una solución de temporizador múltiple para no tener que reinventar la rueda yo mismo?
No veo que la implementación sea complicada por usar punteros a una función. Es poco probable que no se haya aplicado ya antes que yo.
Es decir, la tarea original es crear un temporizador con cualquier periodicidad y asignarle una función para manejar el evento del temporizador. Y puede haber cualquier número de temporizadores.

Así:

#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:

Nadie ha dado con una solución multitemporal

Estoy seguro de haberlo visto en la KB hace mucho tiempo.
 
fxsaber:
Estoy seguro de haberlo visto en el Buy More hace mucho tiempo.

No lo encuentro. Extraño.
OK, lo implementaré yo mismo. No debería haber ningún escollo. Lo publicaré en el Buy More.

 
Nikolai Semko:

Es decir, la tarea inicial es crear un temporizador con cualquier periodicidad y asignarle su función de manejo de eventos del temporizador. Y puede haber cualquier número de temporizadores.

¿una variante más sencilla no sirve?

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: Y así, puedes usar el código de fxsaber como plantilla

aquí se explica cómo hacer que todos los objetos se eliminen automáticamente https://www.mql5.com/ru/forum/325418/page4#comment_16116740

 
Nikolai Semko:

No lo encuentro. Extraño.
OK, lo implementaré yo mismo. No debería haber ningún escollo. Lo pondré en el Buy More.

hecho
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:

¿una versión más sencilla no funcionaría?

UPD: si no, puedes usar el código de fxsaber como plantilla

aquí se explica cómo hacer que todos los objetos se eliminen automáticamente https://www.mql5.com/ru/forum/325418/page4#comment_16116740

Por supuesto, puedes hacerlo así. Pero menos legible y más difícil de manejar.

 

Érase una vez (más o menos) esto.

Es un inconveniente para usar con las clases.

class CWithTimer {

public:

    void CallMeByTimer();

};

Y el temporizador externo (a la clase) con punteros a la función es impotente.

 
Maxim Kuznetsov:

hace tiempo (aproximadamente) lo hizo.

Es un inconveniente para usar con las clases.

class CWithTimer {

public:

    void CallMeByTimer();

};

Y el temporizador externo (a la clase) con punteros a la función es impotente.

Si te refieres a la función como método de la clase, entonces sí, estoy de acuerdo. Yo mismo me di cuenta ayer y estoy desconcertado sobre cómo resolverlo.
Me gustaría utilizar esta clase dentro de otra clase, de lo contrario el uso es muy limitado.
Al menos debe implementarse un singleton y controlar un temporizador que ya esté funcionando fuera de la clase.
 
Nikolai Semko:
Si te refieres a la función como método de la clase, entonces sí, estoy de acuerdo. Yo mismo lo descubrí ayer y estoy desconcertando sobre cómo salir de él.
Me gustaría aplicar esta clase dentro de otra clase, de lo contrario la aplicación es muy limitada.
Como mínimo, necesitamos implementar un singleton y controlar el temporizador que ya se está ejecutando fuera de la clase.
Debe haber un puntero a la clase con el temporizador en el objeto.
 
Vladimir Simakov:
El objeto debe tener un puntero a una clase con un temporizador.
La cuestión es cómo ejecutar un método no estático de la clase desde el puntero, aunque el objeto de otra clase (en este caso CTimer) sea una propiedad (variable) de esta clase. ¿Es posible? Me temo que no.