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 :
확실히 오래전에 KB에서 본 것 같아요.

찾을 수 없습니다. 기이한.
좋아, 내가 직접 할게. 함정은 없는 것 같습니다. KB에 올리겠습니다

 
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/en/forum/325418/page4#comment_16116740

 
Nikolai Semko :

찾을 수 없습니다. 기이한.
좋아, 내가 직접 할게. 함정은 없는 것 같습니다. KB에 올리겠습니다

만들어진
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

물론 가능합니다. 그러나 가독성이 떨어지고 관리하기가 더 어렵습니다.

 
Nikolai Semko :

만들어진
https://www.mql5.com/ru/code/31306

옛날 옛적에 (대략) 그랬습니다.

클래스와 함께 사용하면 불편합니다.

class CWithTimer {

public:

    void CallMeByTimer();

};

함수 포인터가 있는 외부(클래스와 관련하여) 타이머는 무력합니다.

 
Maxim Kuznetsov :

옛날 옛적에 (대략) 그랬습니다.

클래스와 함께 사용하면 불편합니다.

class CWithTimer {

public:

    void CallMeByTimer();

};

함수 포인터가 있는 외부(클래스와 관련하여) 타이머는 무력합니다.

클래스 메소드 로서의 기능을 의미한다면 예, 동의합니다. 어제 나는 그것을 스스로 알아 냈고 어떻게 빠져나갈지 머리를 맞대고 있습니다.
다른 클래스 내에서 이 클래스를 사용하고 싶습니다. 그렇지 않으면 응용 프로그램이 매우 제한됩니다.
최소한 싱글톤을 구현하고 클래스 외부에서 이미 실행 중인 타이머를 제어해야 합니다.
 
Nikolai Semko :
클래스 메소드 로서의 기능을 의미한다면 예, 동의합니다. 어제 나는 그것을 스스로 알아 냈고 어떻게 빠져나갈지 머리를 맞대고 있습니다.
다른 클래스 내에서 이 클래스를 사용하고 싶습니다. 그렇지 않으면 응용 프로그램이 매우 제한됩니다.
최소한 싱글톤을 구현하고 클래스 외부에서 이미 실행 중인 타이머를 제어해야 합니다.
객체는 타이머가 있는 클래스에 대한 포인터를 포함해야 합니다.
 
Vladimir Simakov :
객체는 타이머가 있는 클래스에 대한 포인터를 포함해야 합니다.
문제는 다른 클래스(이 경우 CTimer)의 개체가 이 클래스의 속성(변수)인 경우에도 포인터를 사용하여 비정적 클래스 메서드 를 실행하는 방법입니다. 그리고 그것이 가능합니까? 나는 그렇지 않다.