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:

没有人遇到过一个多定时器的解决方案

我确信我很久以前在KB看到过它。
 
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

当然,你可以这样做。但可读性较差,而且更难管理。

 

从前(大概)是这样的。

它不方便与班级一起使用。

class CWithTimer {

public:

    void CallMeByTimer();

};

而外部(对类)的计时器与指向该函数的指针是无力的。

 
Maxim Kuznetsov:

曾几何时(大概)是这样做的。

它不方便与班级一起使用。

class CWithTimer {

public:

    void CallMeByTimer();

};

而外部(对类)的计时器与指向该函数的指针是无力的。

如果你是指作为类方法 的功能,那么是的,我同意。我昨天自己也意识到了这一点,并对如何解决这个问题感到困惑。
我想在另一个类里面使用这个类,否则用途就很有限。
至少还必须实现一个单子,并且必须控制已经在类外运行的定时器。
 
Nikolai Semko:
如果你是指作为类方法 的功能,那么是的,我同意。昨天自己想明白了,正在琢磨如何摆脱它。
我想把这个类应用在另一个类里面,否则应用就非常有限。
至少,我们需要实现一个单子,并控制已经在类外运行的定时器。
对象中应该有一个指向带有定时器的类的指针。
 
Vladimir Simakov:
该对象必须有一个指向具有定时器的类的指针。
问题是如何从指针上运行类的静态方法,即使另一个类的对象(在这里是CTimer)是这个类的一个属性(变量)。是否有可能。我恐怕不会。