이벤트의 흐름. 유휴 이벤트를 제어하고 만드는 방법은 무엇입니까? (+ 결정) - 페이지 6

 
sergeev :

새로운 질문을 했습니까?

중재자가 범람을 시작하는 것은 좋지 않습니다. 내가 설명한다. 사용자(진행자 포함)가 주제에 새 메시지를 추가하는 것을 일반적으로 "답장"이라고 합니다. 비꼬는 말일지라도 말이다.

그러므로 다시 한 번 해명을 하자면 서커스라고 생각되시면 삭제하셔도 무방합니다. 또는 해당 지점에 새 메시지를 보내보십시오. 부정확한 정보는 사용자를 오도할 수 있습니다.

추가하겠습니다. 사용자 이벤트 가 이전 규칙에 따라 대기열을 채운다는 사실이 공식적으로 밝혀지면(찾는 데 도움이 된다면) 먼저 감사의 인사를 전하겠습니다.

 
Yedelkin :

추가하겠습니다. 사용자 이벤트 가 이전 규칙에 따라 대기열을 채운다는 사실이 공식적으로 밝혀지면(찾는 데 도움이 된다면) 먼저 감사의 인사를 전하겠습니다.

대략적으로 말하면 이벤트 작업은 변경되지 않았습니다. 설명서에 딱 들어맞지 않았습니다.
 
Rosh :
대략적으로 말하면 이벤트 작업은 변경되지 않았습니다. 설명서에 딱 들어맞지 않았습니다.
고맙습니다. 불쌍해. 이것은 핸드북의 이전 규칙이 올바르지 않다는 것을 의미합니다. 지루해서 죄송합니다.
 
sergeev :

...

마치 존재하지 않았던 것처럼 문제가 더 이상 발생하지 않는 것 같습니다. 모든 것이 브레이크 없이 작동합니다. Alex , 시간이 있으면 잠시 자리를 좀 봐주시겠어요? 즉, 추가 기능이 있는 경우와 없는 경우에 상관없이 작동합니다.
 

생성된 유휴 메시지를 각 애플리케이션에서 적극적으로 사용합니다. 모든 것이 작동합니다.

 
sergeev :

생성된 유휴 메시지를 각 애플리케이션에서 적극적으로 사용합니다. 모든 것이 작동합니다.

아마도 이전과 같이 12자가 아닌 3자를 테스트하고 있다는 사실 때문에 내 문제가 더 이상 나타나지 않을 수 있습니다. 중독을 찾으면 글을 쓰겠습니다. 고맙습니다.
 

sergeev:  

버그가 잡혔습니다.

이것은 이 차트에 있는 EA의 EventChartCustom 이벤트가 자신에게 전송되기 때문에 발생합니다. 이 이벤트 디스패치가 메인 창의 차트 업데이트(ChartRedraw)를 유발하는 것으로 밝혀졌습니다.

//---

나는 당신의 솔루션을 테스트하기 위해 그런 Expert Advisor를 만들었고 동시에 OBJ_EDIT 개체를 편집하는 동안 텍스트가 매우 자주 깜박이는 문제를 해결하려고했습니다.

//---

 //+------------------------------------------------------------------+
//|                                                 OnChartEvent.mq5 |
//+------------------------------------------------------------------+
#property copyright "Copyright 2010, MetaQuotes Software Corp."
#property link       "http://www.mql5.com"
#property version   "1.00"
//---
long chart_id= 0 ;
string OnOff_event_idle= "On/Off event_idle++" ;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
   chart_id= ChartID ();
//---
   if (! GlobalVariableCheck (OnOff_event_idle)) { GlobalVariableSet (OnOff_event_idle, 1 ); }
//---
   Create_Edit(chart_id, 0 , "Edit_Area" , "HELLO" , CORNER_LEFT_UPPER , "Arial" , 7 , clrWhite , 38 , 18 , 95 , 4 , 1 , clrBlack );
   Create_Button(chart_id, 0 , "Start_event_idle" , "START event_idle++" , ANCHOR_RIGHT_UPPER , CORNER_LEFT_UPPER , "Arial" , 8 , clrWhite , clrFireBrick ,clrNONE, 130 , 26 , 4 , 28 , 1 );
//---
   Comment ( "id: " , 0 , "\n" ,
           "event_idle++: " ,event_idle
           );
//---
   return ( 0 );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
   Comment ( "" );
   ObjectsDeleteAll (chart_id,- 1 ,- 1 );
  }
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
bool bidle= false ;
ushort VM_IDLE= 500 ;
ulong event_idle= 0 ; // счётчик событий
//---
void OnChartEvent ( const int      id,
                   const long    &lparam,
                   const double &dparam,
                   const string &sparam)
  {
   if ( GlobalVariableGet (OnOff_event_idle)== 1 )
     {
       if (id== CHARTEVENT_CUSTOM +VM_IDLE)
        {
         // Если последнее посланное больше, чем пришедшее, то сразу выходим
         if (event_idle>( ulong )lparam || bidle)
           {
            bidle=event_idle>( ulong )lparam;
             //---
             if (bidle) { return ; }
             //---
            event_idle= 0 ;
           }
         //---
         event_idle++; // увеличили счётчик событий
         //---
         Comment ( "id: " ,id, "\n" ,
                 "event_idle++: " ,event_idle
                 );
         //---
         EventChartCustom (chart_id,VM_IDLE,( long )event_idle, 0 , "" ); return ; // отправили событие с указанием последнего счетчика
        }
       //---
       EventChartCustom (chart_id,VM_IDLE,( long )event_idle, 0 , "" ); // отправили событие с указанием последнего счетчика
     }
//+------------------------------------------------------------------+
//| СОБЫТИЕ_CHARTEVENT_CLICK                                         |
//+------------------------------------------------------------------+
   if (id== CHARTEVENT_CLICK )
     {
       Print ( "Reset. Event_idle: " ,event_idle);
       //---
      event_idle= 0 ;
       //---
       Comment ( "id: " ,id, "\n" ,
               "event_idle++: " ,event_idle
              );
     }
//+------------------------------------------------------------------+
//| СОБЫТИЕ_CHARTEVENT_OBJECT_CLICK                                  |
//+------------------------------------------------------------------+
   if (id== CHARTEVENT_OBJECT_CLICK )
     {
       if (sparam== "Edit_Area" )
        {
         if (( int ) GlobalVariableGet (OnOff_event_idle)== 0 ) { GlobalVariableSet (OnOff_event_idle, 1 ); }
         if (( int ) GlobalVariableGet (OnOff_event_idle)== 1 ) { GlobalVariableSet (OnOff_event_idle, 0 ); }
        }
       //---
       if (sparam== "Start_event_idle" )
        {
         if (( int ) GlobalVariableGet (OnOff_event_idle)== 0 ) { GlobalVariableSet (OnOff_event_idle, 1 ); ChartRedraw (); return ; }
         if (( int ) GlobalVariableGet (OnOff_event_idle)== 1 ) { GlobalVariableSet (OnOff_event_idle, 0 ); ChartRedraw (); return ; }
        }
     }
//+------------------------------------------------------------------+
//| CHARTEVENT_OBJECTS_ENDEDIT                                       |
//+------------------------------------------------------------------+
   if (id== CHARTEVENT_OBJECT_ENDEDIT )
     {
       if ( ObjectGetInteger (chart_id, "Start_event_idle" , OBJPROP_STATE )) { GlobalVariableSet (OnOff_event_idle, 1 ); }
     }
  }
//+------------------------------------------------------------------+
//| СОЗДАНИЕ_ОБЪЕКТА_BUTTON                                          |
//+------------------------------------------------------------------+
void Create_Button( long    chrt_id,   // id графика
                   int     nmb_win,   // номер окна
                   string lable_nm,   // имя объекта
                   string rename,     // отображаемое имя
                   long    anchor,     // точка привязки
                   long    corner,     // угол привязки
                   string font_bsc,   // шрифт
                   int     font_size, // размер шрифта
                   color   font_clr,   // цвет шрифта
                   color   bg_color,   // цвет фона
                   color   brd_color, // цвет рамки
                   int     xsize,     // ширина
                   int     ysize,     // высота
                   int     x_dist,     // координата по шкале X
                   int     y_dist,     // координата по шкале Y
                   long    zorder)     // приоритет
  {
   if ( ObjectCreate (chrt_id,lable_nm, OBJ_BUTTON ,nmb_win, 0 , 0 )) // создание объекта
     {
       ObjectSetString (chrt_id,lable_nm, OBJPROP_TEXT ,rename);             // установка имени
       ObjectSetString (chrt_id,lable_nm, OBJPROP_FONT ,font_bsc);           // установка шрифта
       ObjectSetInteger (chrt_id,lable_nm, OBJPROP_COLOR ,font_clr);         // установка цвета шрифта
       ObjectSetInteger (chrt_id,lable_nm, OBJPROP_BGCOLOR ,bg_color);       // установка цвета фона
       ObjectSetInteger (chrt_id,lable_nm, OBJPROP_BORDER_COLOR ,brd_color); // установка цвета фона
       ObjectSetInteger (chrt_id,lable_nm, OBJPROP_ANCHOR ,anchor);           // установка точки привязки
       ObjectSetInteger (chrt_id,lable_nm, OBJPROP_CORNER ,corner);           // установка угола привязки
       ObjectSetInteger (chrt_id,lable_nm, OBJPROP_FONTSIZE ,font_size);     // установка размера шрифта
       ObjectSetInteger (chrt_id,lable_nm, OBJPROP_XSIZE ,xsize);             // установка ширины X
       ObjectSetInteger (chrt_id,lable_nm, OBJPROP_YSIZE ,ysize);             // установка высоты Y
       ObjectSetInteger (chrt_id,lable_nm, OBJPROP_XDISTANCE ,x_dist);       // установка координаты X
       ObjectSetInteger (chrt_id,lable_nm, OBJPROP_YDISTANCE ,y_dist);       // установка координаты Y
       ObjectSetInteger (chrt_id,lable_nm, OBJPROP_SELECTABLE , false );       // нельзя выделить объект, если FALSE
       ObjectSetInteger (chart_id,lable_nm, OBJPROP_ZORDER ,zorder);         // Приоритет выше/ниже
       ObjectSetString (chrt_id,lable_nm, OBJPROP_TOOLTIP , "\n" );             // нет всплывающей подсказки, если "\n"
     }
  }
//+------------------------------------------------------------------+
//| СОЗДАНИЕ_ОБЪЕКТА_EDIT                                            |
//+------------------------------------------------------------------+
void Create_Edit( long    chrt_id,   // id графика
                 int     nmb_win,   // номер окна (подокна)
                 string lable_nm,   // имя объекта
                 string text,       // отображаемый текст
                 long    corner,     // угол привязки
                 string font_bsc,   // шрифт
                 int     font_size, // размер шрифта
                 color   font_clr,   // цвет шрифта
                 int     xsize,     // ширина
                 int     ysize,     // высота
                 int     x_dist,     // координата по шкале X
                 int     y_dist,     // координата по шкале Y
                 long    zorder,     // приоритет
                 color   clr)       // цвет фона
  {
   if ( ObjectCreate (chrt_id,lable_nm, OBJ_EDIT ,nmb_win, 0 , 0 )) // создание объекта
     {
       ObjectSetString (chrt_id,lable_nm, OBJPROP_TEXT ,text);             // установка имени
       ObjectSetInteger (chrt_id,lable_nm, OBJPROP_CORNER ,corner);       // установка угла привязки
       ObjectSetString (chrt_id,lable_nm, OBJPROP_FONT ,font_bsc);         // установка шрифта
       ObjectSetInteger (chrt_id,lable_nm, OBJPROP_FONTSIZE ,font_size);   // установка размера шрифта
       ObjectSetInteger (chart_id,lable_nm, OBJPROP_COLOR ,font_clr);     // цвет шрифта
       ObjectSetInteger (chart_id,lable_nm, OBJPROP_BGCOLOR ,clr);         // цвет фона
       ObjectSetInteger (chart_id,lable_nm, OBJPROP_XSIZE ,xsize);         // ширина
       ObjectSetInteger (chart_id,lable_nm, OBJPROP_YSIZE ,ysize);         // высота
       ObjectSetInteger (chrt_id,lable_nm, OBJPROP_XDISTANCE ,x_dist);     // установка координаты X
       ObjectSetInteger (chrt_id,lable_nm, OBJPROP_YDISTANCE ,y_dist);     // установка координаты Y
       ObjectSetInteger (chrt_id,lable_nm, OBJPROP_SELECTABLE , false );     // нельзя выделить объект, если FALSE
       ObjectSetInteger (chart_id,lable_nm, OBJPROP_ZORDER ,zorder);       // Приоритет выше/ниже
       ObjectSetString (chrt_id,lable_nm, OBJPROP_TOOLTIP , "\n" );         // нет всплывающей подсказки, если "\n"
     }
  }
//+------------------------------------------------------------------+

//---

Expert Advisor를 실행하면 왼쪽 상단의 차트에 다음이 표시됩니다.

//---

" START event_idle++ " 버튼을 클릭하면 ( Alex ) 솔루션에 액세스할 수 있습니다. event_idle++ 카운터가 차트에서 바로 값을 증가시키는 방법을 봅니다.

버튼을 누르고 있는 한 코드가 작동합니다. 사실, 그는 자원을 매우 강력하게 먹습니다. CPU 사용량(듀얼 코어에서 테스트) 범위는 ~90% ~ ~100% 입니다. 실행 전이나 버튼을 놓는 순간 프로세서 로드는 ~ 5% ~ ~ 10% 입니다. 차트를 클릭(마우스 왼쪽 버튼 클릭)하면 카운터가 0으로 재설정됩니다.

입력 필드에 텍스트를 입력해도 깜박임이 발생하지 않습니다. 코드를 입력할 때 전역 변수 " On/Off event_idle++ "를 사용하여 비활성화되기 때문입니다. 이것은 물론 목발이지만 임시 솔루션으로 일부 간단한 솔루션에 매우 적합합니다.

CPU 사용량만이 문제가 아닙니다. 카운터가 실행 중일 때 거래 터미널의 창은 빠르게 열리지만 창 크기 조정은 눈에 띄게 느려집니다. 항상 그런 것은 아니지만 그런 순간이 있습니다.


파일:
 
tol64 :

CPU 사용량만이 문제가 아닙니다. 카운터가 실행 중일 때 거래 터미널의 창은 빠르게 열리지만 창 크기 조정은 눈에 띄게 느려집니다. 항상 그런 것은 아니지만 그런 순간이 있습니다.

프로세서 로딩 문제는 다음과 같이 해결할 수 있습니다. 이벤트 카운터가 1초에 한 번 업데이트되도록 지정합니다. 다음 코드를 추가합니다.

OnInit ()에서:

 EventSetTimer ( 1 );

//---

프로그램 본문에서:

 //+------------------------------------------------------------------+
//| ТАЙМЕР                                                           |
//+------------------------------------------------------------------+
long countSecond= 0 ;
//---
void OnTimer ()
  {
   if ( GlobalVariableGet (OnOff_event_idle)== 1 )
     {
      countSecond++;
     }
  }

//---

Alex 의 코드(빨간색으로 표시):

   if ( GlobalVariableGet (OnOff_event_idle)== 1 )
     {
       if (id== CHARTEVENT_CUSTOM +VM_IDLE && countSecond> 0 )
        {
         // Если последнее посланное больше, чем пришедшее, то сразу выходим
         if (event_idle>( ulong )lparam || bidle)
           {
            bidle=event_idle>( ulong )lparam;
             //---
             if (bidle) { return ; }
             //---
            event_idle= 0 ;
           }
         //---
         event_idle++; // увеличили счётчик событий
         //---
         Comment ( "id: " ,id, "\n" ,
                 "event_idle++: " ,event_idle
                 );
         //---
         // Отправили событие с указанием последнего счетчика
         EventChartCustom (chart_id,VM_IDLE,( long )event_idle, 0 , "" ); countSecond= 0 ; return ;
        }
      //---
       // Отправили событие с указанием последнего счетчика
       EventChartCustom (chart_id,VM_IDLE,( long )event_idle, 0 , "" ); countSecond= 0 ;
     }

//---

CHARTEVENT_CLICK 이벤트 처리 블록(빨간색으로 표시):

 //+------------------------------------------------------------------+
//| СОБЫТИЕ_CHARTEVENT_CLICK                                         |
//+------------------------------------------------------------------+
   if (id== CHARTEVENT_CLICK )
     {
       Print ( "Reset. Event_idle: " ,event_idle);
       //---
      event_idle= 0 ;
       countSecond= 0 ;
       //---
       Comment ( "id: " ,id, "\n" ,
               "event_idle++: " ,event_idle
              );
     }

//---

CHARTEVENT_OBJECT_CLICK 이벤트 처리 블록을 다음과 같이 편집합니다. + 버튼의 상태는 여전히 제어되어야 합니다. 때로는 "어느 정도 잘못된" 버튼을 클릭해도 이전과 같았지만 나머지 코드는 계속 눌러져 있기 때문입니다. 문제가 해결되고 혼란이 시작됩니다.

 //+------------------------------------------------------------------+
//| СОБЫТИЕ_CHARTEVENT_OBJECT_CLICK                                  |
//+------------------------------------------------------------------+
   if (id== CHARTEVENT_OBJECT_CLICK )
     {
       if (sparam== "Edit_Area" )
        {
         if (( int ) GlobalVariableGet (OnOff_event_idle)== 0 ) { GlobalVariableSet (OnOff_event_idle, 1 ); }
         if (( int ) GlobalVariableGet (OnOff_event_idle)== 1 ) { GlobalVariableSet (OnOff_event_idle, 0 ); }
        }
       //---
       if (sparam== "Start_event_idle" )
        {
         if (( int ) GlobalVariableGet (OnOff_event_idle)== 0 )
           {
            countSecond= 0 ;
             GlobalVariableSet (OnOff_event_idle, 1 );
             ObjectSetInteger (chart_id, "Start_event_idle" , OBJPROP_STATE , true );
             //---
             ChartRedraw (); return ;
           }
         //---
         if (( int ) GlobalVariableGet (OnOff_event_idle)== 1 )
           {
            countSecond= 0 ;
             GlobalVariableSet (OnOff_event_idle, 0 );
             ObjectSetInteger (chart_id, "Start_event_idle" , OBJPROP_STATE , false );
             //---
             ChartRedraw (); return ;
           }
        }
     }

//---

이제 모든 것이 더 흥미 롭습니다. :)

//---

추신 : 초가 많으면 GetTickCount ()로 요술을 시도할 수 있습니다.

 

내가 무슨 말을 할 수

1. 퍼센트 코멘트 를 로드합니다. 제거하면 조용해집니다.

2. 유휴 주기 자체는 백분율에 눈에 띄는 영향을 미치지 않습니다.

3. 편집시 깜박임 문제는 0차트 1장의 문제가 아닙니다. 이것은 차트 개체에 이벤트를 보내는 문제입니다. 이로 인해 기본 0-차트가 다시 그려지고 깜박임이 발생합니다.

 
sergeev :

내가 무슨 말을 할 수

1. 댓글 퍼센트를 로드합니다. 제거하면 조용해집니다.

2. 유휴 주기 자체는 백분율에 눈에 띄는 영향을 미치지 않습니다.

3. 편집시 깜박임 문제는 0차트 1장의 문제가 아닙니다. 이것은 차트 개체에 이벤트를 보내는 문제입니다. 이로 인해 기본 0-차트가 다시 그려지고 깜박임이 발생합니다.

설명해주셔서 감사합니다. 나는 이것을 정리할 것이다.