Mql5 dilinin özellikleri, incelikleri ve çalışma yöntemleri - sayfa 187

 

Tekerleği yeniden icat etmemek için hiç kimse çoklu zamanlayıcı için bir çözüm bulamadı mı?
Uygulama, işlev işaretçilerinin kullanımıyla bana zor görünmüyor. Bunun benden önce uygulanmamış olması muhtemel değildir.
Onlar. ilk görev, herhangi bir frekansta bir zamanlayıcı oluşturmak ve zamanlayıcı olayını işlemek için bunu kendi işlevinizle ilişkilendirmektir. Ayrıca, herhangi bir sayıda zamanlayıcı olabilir.

aşağı yukarı şöyle:

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

Çoklu zamanlayıcı için kimse çözümle karşılaşmadı

Uzun zaman önce KB'de gördüğüme eminim.
 
fxsaber :
Uzun zaman önce KB'de gördüğüme eminim.

Bir şey bulamıyorum. Garip.
tamam, kendim yapacağım. Herhangi bir tuzak yok gibi görünüyor. KB olarak yayınlayacağım

 
Nikolai Semko :

Onlar. ilk görev, herhangi bir frekansta bir zamanlayıcı oluşturmak ve zamanlayıcı olayını işlemek için bunu kendi işlevinizle ilişkilendirmektir. Ayrıca, herhangi bir sayıda zamanlayıcı olabilir.

daha kolay bir seçenek olmaz mıydı?

 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: ve böylece fxsaber kodunu şablon olarak alabilirsiniz

Tüm nesnelerin otomatik olarak silinmesi için tamamladım https://www.mql5.com/en/forum/325418/page4#comment_16116740

 
Nikolai Semko :

Bir şey bulamıyorum. Garip.
tamam, kendim yapacağım. Herhangi bir tuzak yok gibi görünüyor. KB olarak yayınlayacağım

yapılmış
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 :

daha kolay bir seçenek olmaz mıydı?

UPD: ve böylece fxsaber kodunu şablon olarak alabilirsiniz

Tüm nesnelerin otomatik olarak silinmesi için tamamladım https://www.mql5.com/ru/forum/325418/page4#comment_16116740

elbette mümkündür. Ancak daha az okunabilir ve yönetilmesi daha zor.

 
Nikolai Semko :

yapılmış
https://www.mql5.com/ru/code/31306

bir zamanlar (yaklaşık olarak) öyle yaptı.

Sınıflarla kullanım sakıncalıdır.

class CWithTimer {

public:

    void CallMeByTimer();

};

ve işlev işaretçilerine sahip harici (sınıfa göre) zamanlayıcı güçsüzdür.

 
Maxim Kuznetsov :

bir zamanlar (yaklaşık olarak) öyle yaptı.

Sınıflarla kullanım sakıncalıdır.

class CWithTimer {

public:

    void CallMeByTimer();

};

ve işlev işaretçilerine sahip harici (sınıfa göre) zamanlayıcı güçsüzdür.

Sınıf yöntemi olarak bir işlevi kastediyorsanız, evet, katılıyorum. Dün kendim çözdüm ve nasıl dışarı çıkacağım konusunda kafa patlatıyorum.
Bu sınıfı başka bir sınıf içinde kullanmak istiyorum, aksi takdirde uygulama çok sınırlıdır.
En azından, yine de bir singleton uygulamanız ve zaten sınıfın dışında çalışan zamanlayıcıyı kontrol etmeniz gerekir.
 
Nikolai Semko :
Sınıf yöntemi olarak bir işlevi kastediyorsanız, evet, katılıyorum. Dün kendim çözdüm ve nasıl çıkacağım konusunda kafamı dağıtıyorum.
Bu sınıfı başka bir sınıf içinde kullanmak istiyorum, aksi takdirde uygulama çok sınırlıdır.
En azından, yine de bir singleton uygulamanız ve zaten sınıfın dışında çalışan zamanlayıcıyı kontrol etmeniz gerekir.
Nesne, zamanlayıcılı bir sınıfa yönelik bir işaretçi içermelidir.
 
Vladimir Simakov :
Nesne, zamanlayıcılı bir sınıfa yönelik bir işaretçi içermelidir.
Soru, başka bir sınıfın nesnesi (bu durumda, CTimer) bu sınıfın bir özelliği (değişkeni) olsa bile, bir işaretçi kullanarak statik olmayan bir sınıf yönteminin nasıl çalıştırılacağıdır. Ve mümkün mü? Korkarım öyle değil.