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:
昔、バイモアで見たことがあるような気がします。

見つからないんです。不思議ですね。
OK、自分で実装してみます。落とし穴はないはずです。バイモアのところに貼っておきますね。

 
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:

見つからないんです。変だな。
よし、自分で実装してみよう。落とし穴はないはずです。Buy Moreに入れる。

された
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)がこのクラスのプロパティ(変数)であっても、そのポインタからそのクラスの非静的メソッドを 実行するにはどうすればよいかということです。可能なのでしょうか。残念ながら、そうではありません。
理由: