Caractéristiques du langage mql5, subtilités et techniques - page 187

 

Est-ce que quelqu'un a trouvé une solution pour un minuteur multiple afin que je ne doive pas réinventer la roue moi-même ?
Je ne pense pas que la mise en œuvre soit compliquée par l'utilisation de pointeurs vers la fonction. Il est peu probable qu'elle n'ait pas déjà été mise en œuvre avant moi.
En d'autres termes, la tâche initiale consiste à créer une minuterie avec une périodicité quelconque et à lui attribuer la fonction de traitement des événements de la minuterie. Et il peut y avoir un nombre quelconque de minuteries.

Comme ça :

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

Personne n'a trouvé de solution à plusieurs temps

Je suis sûr de l'avoir vu au KB il y a longtemps.
 
fxsaber:
Je suis sûr de l'avoir vu au Buy More il y a longtemps.

Je n'arrive pas à le trouver. Étrange.
OK, je vais l'implémenter moi-même. Il ne devrait pas y avoir d'embûches. Je l'afficherai sur le Buy More.

 
Nikolai Semko:

En d'autres termes, la tâche initiale consiste à créer une minuterie avec une périodicité quelconque et à lui affecter la fonction de traitement des événements de la minuterie. Et il peut y avoir un nombre quelconque de minuteries.

une variante plus simple ne fera pas l'affaire ?

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 : Et donc, vous pouvez utiliser le code de fxsaber comme un modèle

voici comment faire en sorte que tous les objets soient automatiquement supprimés https://www.mql5.com/ru/forum/325418/page4#comment_16116740

 
Nikolai Semko:

Je n'arrive pas à le trouver. Bizarre.
OK, je vais l'implémenter moi-même. Il ne devrait pas y avoir d'embûches. Je vais le mettre dans le Buy More.

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

une version plus simple ne fonctionnerait pas ?

UPD : sinon, vous pouvez utiliser le code de fxsaber comme modèle.

voici comment faire en sorte que tous les objets soient automatiquement supprimés https://www.mql5.com/ru/forum/325418/page4#comment_16116740

Bien sûr, vous pourriez le faire de cette façon. Mais moins lisible et plus difficile à gérer.

 

Il était une fois (à peu près) ce que je faisais.

C'est peu pratique à utiliser avec les classes.

class CWithTimer {

public:

    void CallMeByTimer();

};

Un timer externe (à la classe) avec des pointeurs vers la fonction est impuissant.

 
Maxim Kuznetsov:

Il était une fois (à peu près) le cas.

C'est peu pratique à utiliser avec les classes.

class CWithTimer {

public:

    void CallMeByTimer();

};

Un timer externe (à la classe) avec des pointeurs vers la fonction est impuissant.

Si vous voulez dire la fonction comme une méthode de classe, alors oui, je suis d'accord. Je m'en suis rendu compte hier et je suis perplexe quant à la manière de procéder.
Je voudrais utiliser cette classe à l'intérieur d'une autre classe, sinon l'utilisation est très limitée.
Au moins un singleton doit encore être implémenté et un timer déjà en cours d'exécution en dehors de la classe doit être contrôlé.
 
Nikolai Semko:
Si vous voulez dire fonction comme méthode de classe, alors oui, je suis d'accord. Je l'ai découvert moi-même hier et je me demande comment en sortir.
Je voudrais appliquer cette classe à l'intérieur d'une autre classe, sinon l'application est très limitée.
Au minimum, nous devons implémenter un singleton et contrôler le timer déjà en cours d'exécution en dehors de la classe.
Il devrait y avoir un pointeur vers la classe avec le timer dans l'objet.
 
Vladimir Simakov:
L'objet doit contenir un pointeur vers une classe avec un timer.
La question est de savoir comment exécuter une méthode non statique de la classe à partir du pointeur, même si l'objet d'une autre classe (dans ce cas CTimer) est une propriété (variable) de cette classe. C'est possible. J'ai bien peur que non.
Raison: