¿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;
intOnInit()
{
timers.NewTimer(500, Sum1); // создаем новый таймер с периодом обновления 500 милисекунд и функцией-обраточником Sum1()
timers.NewTimer(2000, Sum2); // создаем новый таймер с периодом обновления 2000 милисекунд и функцией-обраточником Sum2()return(INIT_SUCCEEDED);
}
...
voidOnTimer()
{
timers.OnTimer();
}
//+------------------------------------------------------------------+void Sum1() { // данная функция вызывает с периодичностью 500 милисекунд
x1++;
if (x1==10) timers.KillTimer(Sum1); // удаляем этот таймер
}
void Sum2() { // данная функция вызывает с периодичностью 2000 милисекунд
x2++;
if (x2==10) timers.KillTimer(Sum2); // удаляем этот таймер
}
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.
1. Включите в свою программу класс CTimer 2. Создайте один объект класса СTimer. Например timers. 3. Создайте функции-обработчики необходимых таймеров формата void AnyNameFunction() {....} например с такими именами: 4. Когда вам необходимо создать и запустить таймер, сделайте так из любого места: 5. Когда вам таймер больше не нужен...
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.
¿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í:
Nadie ha dado con una solución multitemporal
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.
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?
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
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
¿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.
hecho
https://www.mql5.com/ru/code/31306
É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.
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 lo descubrí ayer y estoy desconcertando sobre cómo salir de él.
El objeto debe tener un puntero a una clase con un temporizador.