Caratteristiche del linguaggio mql5, sottigliezze e tecniche - pagina 187

 

Qualcuno si è imbattuto in una soluzione multi-timer in modo da non dover reinventare la ruota da solo?
Non mi sembra che l'implementazione sia complicata dall'uso di puntatori alla funzione. È improbabile che non sia già stato attuato prima di me.
Cioè, il compito originale è quello di creare un timer con qualsiasi periodicità e assegnargli la funzione di gestione degli eventi del timer. E ci può essere un numero qualsiasi di timer.

Come questo:

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

Nessuno ha trovato una soluzione multi-timer

Sono sicuro di averlo visto al KB molto tempo fa.
 
fxsaber:
Sono sicuro di averlo visto al Buy More molto tempo fa.

Non riesco a trovarlo. Strano.
OK, lo implementerò io stesso. Non dovrebbe esserci nessuna insidia. Lo posterò al Buy More.

 
Nikolai Semko:

Cioè il compito iniziale è quello di creare un timer con qualsiasi periodicità e mappare la sua funzione di gestione degli eventi del timer su di esso. E ci può essere un numero qualsiasi di timer.

la variante più semplice non va bene?

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: E così, potete usare il codice di fxsaber come modello

ecco come fare in modo che tutti gli oggetti vengano automaticamente cancellati https://www.mql5.com/ru/forum/325418/page4#comment_16116740

 
Nikolai Semko:

Non riesco a trovarlo. Strano.
OK, lo implementerò io stesso. Non dovrebbe esserci nessuna insidia. Lo metterò nel Buy More.

fatto
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 versione più semplice non funzionerebbe?

UPD: altrimenti, puoi usare il codice di fxsaber come modello

ecco come fare in modo che tutti gli oggetti vengano automaticamente cancellati https://www.mql5.com/ru/forum/325418/page4#comment_16116740

Certo, si potrebbe fare così. Ma meno leggibile e più difficile da gestire.

 

C'era una volta (più o meno) questo.

È scomodo da usare con le classi.

class CWithTimer {

public:

    void CallMeByTimer();

};

E il timer esterno (alla classe) con puntatori alla funzione è impotente.

 
Maxim Kuznetsov:

una volta (all'incirca) lo faceva.

È scomodo da usare con le classi.

class CWithTimer {

public:

    void CallMeByTimer();

};

E il timer esterno (alla classe) con puntatori alla funzione è impotente.

Se intendi la funzione come metodo di classe, allora sì, sono d'accordo. Me ne sono reso conto ieri e sono perplesso su come risolverlo.
Vorrei usare questa classe all'interno di un'altra classe, altrimenti l'uso è molto limitato.
Almeno un singleton deve essere ancora implementato e il timer già in esecuzione al di fuori della classe deve essere controllato.
 
Nikolai Semko:
Se intendi la funzione come metodo di classe, allora sì, sono d'accordo. L'ho capito da solo ieri e sono perplesso su come uscirne.
Vorrei applicare questa classe all'interno di un'altra classe, altrimenti l'applicazione è molto limitata.
Come minimo, dobbiamo implementare un singleton e controllare il timer già in esecuzione al di fuori della classe.
Nell'oggetto dovrebbe esserci un puntatore alla classe con il timer.
 
Vladimir Simakov:
L'oggetto deve contenere un puntatore a una classe con un timer.
La domanda è come eseguire un metodo non statico della classe dal puntatore, anche se l'oggetto di un'altra classe (in questo caso CTimer) è una proprietà (variabile) di quella classe. È possibile. Temo di no.
Motivazione: