Olayların akışı. Boşta bir olay nasıl kontrol edilir ve yapılır? (+ karar verildi) - sayfa 6

 
sergeev :

yeni soru mu sordun

Bir moderatörün sel basması iyi değil. Açıklarım. Bir kullanıcı tarafından (bir moderatör dahil) konuya yeni bir mesaj eklenmesine genellikle "yanıt" denir. Sarkastik bir yorum olsa bile.

Bu nedenle, bir kez daha, açıklama ile: Eğer bir sirk olarak görüyorsanız, silmekten çekinmeyin. Veya konuya yeni bir mesaj göndermeyi deneyin. Yanlış bilgiler kullanıcıları yanıltabilir.

Ekleyeceğim. Kullanıcı olaylarının önceki kurallara göre sırayı doldurduğu resmi olarak ortaya çıkarsa (eğer yardımcı olursanız) size ilk teşekkür eden ben olacağım.

 
Yedelkin :

Ekleyeceğim. Kullanıcı olaylarının önceki kurallara göre sırayı doldurduğu resmi olarak ortaya çıkarsa (eğer yardımcı olursanız) size ilk teşekkür eden ben olacağım.

Kabaca söylemek gerekirse, olaylarla çalışma hiçbir zaman değişmedi. Kılavuzda tam olarak doğru değildi.
 
Rosh :
Kabaca söylemek gerekirse, olaylarla çalışma hiç değişmedi. Sadece kılavuzda tam olarak doğru değildi.
Teşekkür ederim. Çok yazık. Bu, El Kitabındaki eski kuralların doğru olmadığı anlamına gelir. Can sıkıntısı için özür dilerim.
 
sergeev :

...

Görünüşe göre sorun artık ortaya çıkmamış, sanki hiç var olmamış gibi. Her şey frensiz çalışır. Alex , lütfen, boş bir dakikan varsa evine bir bakar mısın? Yani, eklentinizle ve eklentiniz olmadan şimdi nasıl çalışacak.
 

Oluşturulan boş mesajı her uygulamamda aktif olarak kullanıyorum. Her şey çalışıyor.

 
sergeev :

Uygulamalarımın her birinde oluşturulan boşta mesajını aktif olarak kullanıyorum. Her şey çalışıyor.

Belki de artık eskisi gibi 12 değil 3 karakteri test ettiğim için sorunum kendini göstermiyor. Bağımlılık bulursam yazarım. Teşekkür ederim.
 

sergeev:  

Böcek yakalandı.

Bunun nedeni, bu grafikteki EA'dan EventChartCustom olayının kendisine gönderilmesidir. Bu olay gönderiminin ana pencerenin grafik güncellemesine (ChartRedraw) neden olduğu ortaya çıktı.

//---

Çözümünüzü test etmek için böyle bir Uzman Danışman yaptım ve aynı zamanda OBJ_EDIT nesnesini düzenlerken metnin ultra sık titremesiyle sorunu çözmeye çalıştım.

//---

 //+------------------------------------------------------------------+
//|                                                 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'ı başlattıktan sonra, sol üst köşedeki grafikte aşağıdakileri göreceğiz:

//---

" START event_idle++ " düğmesine tıklayarak ( Alex ) çözümünüze erişim sağlıyoruz. event_idle++ sayacının değerini nasıl artırdığını grafikte görüyoruz.

Düğmeye basıldığı sürece kodunuz çalışacaktır. Doğru, kaynakları çok yiyor. CPU kullanımı (çift çekirdekte test edilmiştir) ~%90 ile ~%100 arasında değişmektedir. Başlatmadan önce veya düğme bırakıldığı anda, işlemci yükü ~ %5 ila ~ %10 arasındadır . Grafikte tıklamak (farenin sol tuşuna tıklamak) sayacı sıfırlar.

Giriş alanına metin girmek titremeye neden olmaz, çünkü kodunuzu girerken " On/Off event_idle++ " global değişkeni kullanılarak devre dışı bırakılır. Bu elbette bir koltuk değneği, ancak geçici bir çözüm olarak bazı basit çözümler için oldukça uygundur.

CPU kullanımı tek sorun değil. Sayaç çalışırken, ticaret terminalindeki pencereler hızla açılır, ancak pencerenin yeniden boyutlandırılması oldukça belirgin şekilde yavaşlar. Her zaman değil, ama böyle anlar var.


Dosyalar:
 
tol64 :

Tek sorun CPU kullanımı değil. Sayaç çalışırken, ticaret terminalindeki pencereler hızla açılır, ancak pencerenin yeniden boyutlandırılması oldukça belirgin şekilde yavaşlar. Her zaman değil, ama böyle anlar var.

İşlemci yükleme sorunu aşağıdaki gibi çözülebilir. Olay sayacının saniyede bir güncellendiğini belirtiyoruz. Bu kodu ekliyoruz:

OnInit'te ():

 EventSetTimer ( 1 );

//---

Programın gövdesinde:

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

//---

Alex'in kodunda (kırmızı ile işaretlenmiştir):

   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 olay işleme bloğunda (kırmızı ile işaretlenmiştir):

 //+------------------------------------------------------------------+
//| СОБЫТИЕ_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 olay işleme bloğunu aşağıdaki gibi düzenliyoruz + Düğmelerin durumunun hala kontrol edilmesi gerekiyor, çünkü bazen üzerine tıklamak bile "bir şekilde yanlış" olsa bile daha önce böyle olsaydı basılı kalır, ancak kodun geri kalanı blokta işe yarayacak ve kafa karışıklığı başlayacak:

 //+------------------------------------------------------------------+
//| СОБЫТИЕ_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 ;
           }
        }
     }

//---

Şimdi her şey daha ilginç. :)

//---

Not : Çok fazla saniye varsa, GetTickCount () ile birleştirmeyi deneyebilirsiniz.

 

ne söyleyebilirim

1. yükleme yüzdesi Yorum . Kaldırın ve sessiz olacak.

2. Kendi başına, boşta kalma çevriminin yüzde üzerinde gözle görülür bir etkisi yoktur.

3. Düzenlemenin titremesiyle ilgili sorun, bir 0-grafik sorunu değildir. Bu, bir grafik nesnesine bir olay gönderme sorunudur. Bu, ana 0 grafiğinin yeniden çizilmesine ve titremeye neden olur.

 
sergeev :

ne söyleyebilirim

1. Yorum yüzdesini yükler. Kaldırın ve sessiz olacak.

2. Kendi başına, boşta kalma çevriminin yüzde üzerinde gözle görülür bir etkisi yoktur.

3. Düzenlemenin titremesiyle ilgili sorun, bir 0-grafik sorunu değildir. Bu, bir grafik nesnesine bir olay gönderme sorunudur. Bu, ana 0 grafiğinin yeniden çizilmesine ve titremeye neden olur.

Açıklama için teşekkürler. Bunu halledeceğim.