Benim yaklaşımım. Çekirdek - Motor. - sayfa 123

 
Реter Konow :

...

not. Bununla birlikte, işlemcinin yeniden çizimi yüklemesi mümkündür. Yani, bir dizi pikselin içinde çizim yapmak. Başka bir deyişle, yüksek (16 ms) bir zamanlayıcı frekansında meydana gelen, değerlerle dizinin sabit başlatılması .

Hayır, yeniden çizim işlemciyi hiçbir şekilde yüklemez, çünkü grafik sürücüsüne bir komut göndermek birkaç nano veya maksimum mikrosaniye meselesidir. Video belleğinde piksel piksel çizim, video kartının işlemcileri tarafından gerçekleştirilir ve genellikle içinde yüzlerce vardır ve işlemci ile aynı anda paralel olarak çalışırlar. Yani, işlemci grafik sürücüsüne bir komut verir: CopyPut modunda Xc, Yc ve R yarıçaplı ekran koordinatlarında merkezi olan bir daire görüntüleyin. İşlemci için bu sadece parametre geçişli bir işlev çağrısıdır. Bunun ötesine geçmez. Bu tür aramaları daha sık yapmaz, örneğin saniyede 2 kez, aksi takdirde kullanıcı ekranda hiçbir şey yapmaz, çok sık çekilemez. Açık işlemlerin listesi için - kendiniz düşünün, bir saat, bir gün veya daha fazla sürebilir.

Ve piksel piksel renklendirme algoritması (örneğin Google "Bresenham'ın Algoritması") video kartı tarafından gerçekleştirilir, işlemci bunun üzerinde oyalanmaz. Aynı zamanda çok hızlı bir performans sergiliyor. Ve.. her meydan okuma için bir kez. 16 ms'lik bir frekansla yeniden başlatma gerekmez; ekran görüntüsü, işlemci komutu tarafından yeni bir değişiklik yapılana kadar video belleğinde sabit tutulur. Ayrıca, ekranın görünen tepkisini hızlandırmak için video belleği yine iki kopya halinde tutulur, görünmezde değişiklikler yapılır ve ardından video sayfası hemen değiştirilir.

Bununla birlikte, sizin tarafınızdan açıklanan piksellerin "sabit dizi başlatmasını " görüntüleme yaklaşımınızda, ondan kurtulmanız gerekiyorsa, mesele bu değil.

 
Реter Konow :

Görüntülemek için tıklayın.

Resimde, Açılış Saati sütunundaki verilerde bir sorun var.

 
Vladimir :

Hayır, yeniden çizim işlemciyi hiçbir şekilde yüklemez, çünkü grafik sürücüsüne bir komut göndermek birkaç nano veya maksimum mikrosaniye meselesidir. Video belleğindeki çizimin kendisi, piksel piksel, video kartının işlemcileri tarafından gerçekleştirilir ve genellikle içinde yüzlerce vardır ve işlemciyle aynı anda paralel olarak çalışırlar. Yani, işlemci grafik sürücüsüne bir komut verir: CopyPut modunda Xc, Yc ve R yarıçaplı ekran koordinatlarında merkezi olan bir daire görüntüleyin. İşlemci için bu sadece parametre geçişli bir işlev çağrısıdır. Bunun ötesine geçmez. Bu tür aramaları daha sık yapmaz, örneğin saniyede 2 kez, aksi takdirde kullanıcı ekranda hiçbir şey yapmaz, çok sık çekilemez. Açık işlemlerin listesi için - kendinizi hayal edin, bir saat, bir gün veya daha fazla sürebilir.

Ve piksel piksel renklendirme algoritması (örneğin Google "Bresenham'ın Algoritması") video kartı tarafından gerçekleştirilir, işlemci bunun üzerinde oyalanmaz. Aynı zamanda çok hızlı bir performans sergiliyor. Ve.. her meydan okuma için bir kez. 16 ms'lik bir frekansla yeniden başlatma gerekmez; ekran görüntüsü, işlemci komutu tarafından yeni bir değişiklik yapılana kadar video belleğinde sabit tutulur. Ayrıca, ekranın görünen tepkisini hızlandırmak için video belleği yine iki kopya halinde tutulur, görünmezde değişiklikler yapılır ve ardından video sayfası hemen değiştirilir.

Bununla birlikte, sizin tarafınızdan açıklanan piksellerin "sabit dizi başlatmasını " görüntüleme yaklaşımınızda, ondan kurtulmanız gerekiyorsa, mesele bu değil.

İyi ki ödül vermişler...
Bir tür parça parça bilgi karmaşası...

Sonuçta aynı değil...

 
Vladimir :

Hayır, yeniden çizim işlemciyi hiçbir şekilde yüklemez, çünkü grafik sürücüsüne bir komut göndermek birkaç nano veya maksimum mikrosaniye meselesidir. Video belleğinde piksel piksel çizim, video kartının işlemcileri tarafından gerçekleştirilir ve genellikle içinde yüzlerce vardır ve işlemci ile aynı anda paralel olarak çalışırlar. Yani, işlemci grafik sürücüsüne bir komut verir: CopyPut modunda Xc, Yc ve R yarıçaplı ekran koordinatlarında merkezi olan bir daire görüntüleyin. İşlemci için bu sadece parametre geçişli bir işlev çağrısıdır. Bunun ötesine geçmez. Bu tür aramaları daha sık yapmaz, örneğin saniyede 2 kez, aksi takdirde kullanıcı ekranda hiçbir şey yapmaz, çok sık çekilemez. Açık işlemlerin listesi için - kendiniz düşünün, bir saat, bir gün veya daha fazla sürebilir.

Ve piksel piksel renklendirme algoritması (örneğin Google "Bresenham'ın Algoritması") video kartı tarafından gerçekleştirilir, işlemci bunun üzerinde oyalanmaz. Aynı zamanda çok hızlı bir performans sergiliyor. Ve.. her meydan okuma için bir kez. 16 ms'lik bir frekansla yeniden başlatma gerekmez; ekran görüntüsü, işlemci komutu tarafından yeni bir değişiklik yapılana kadar video belleğinde sabit tutulur. Ayrıca, ekranın görünen tepkisini hızlandırmak için video belleği yine iki kopya halinde tutulur, görünmezde değişiklikler yapılır ve ardından video sayfası hemen değiştirilir.

Bununla birlikte, sizin tarafınızdan açıklanan piksellerin "sabit dizi başlatmasını " görüntüleme yaklaşımınızda, ondan kurtulmanız gerekiyorsa, mesele bu değil.

Şimdi aşağıda açıklayacağım deneylerimin sonuçlarıyla tam olarak örtüşmese de, ilginç bir teoriniz var.

Testin gösterdiği gibi, işlemciyi en çok yükleyen piksel dizisinin başlatılmasıdır.

Aşağıdaki EA testine göz atın.

 

İtiraf etmeliyim ki test sonuçları beni biraz şaşırttı.

Ve böylece, 16 ms'lik bir frekansta sürekli işlev çağrılarından bahsediyoruz.

İşlemciyi çizerken en çok yükleyen piksel dizisinin başlatılması olduğu ortaya çıktı.

Ancak en garip şey, periyodik işlev çağrısının olduğu ortaya çıktı.

 ObjectSetInteger ( 0 , "MT object" , OBJPROP_SELECTED , 1 );

işlemciyi %10 - 15 oranında yükler.

Ayrıca, aramalar

   ObjectSetString ( 0 , "MT object" , OBJPROP_BMPFILE , "::MT object" );  

   ObjectSetString ( 0 , "MT object" , OBJPROP_TEXT , "QWERTY" );

aynı %10 - 15'te yük.

Aynı zamanda, üç fonksiyonun aynı anda çağrılması

 ObjectSetInteger ( 0 , "MT object" , OBJPROP_SELECTED , 1 );
   
ObjectSetString ( 0 , "MT object" , OBJPROP_BMPFILE , "::MT object" );  

ObjectSetString ( 0 , "MT object" , OBJPROP_TEXT , "QWERTY" );

Katlanan yüke yol açmayın. Yük hala %10-15 kalıyor.

Bununla birlikte, bu çağrılara bir milyon hücrelik bir diziyi yeniden başlatmanın sabit bir döngüsünü eklersek

 for ( int a1 = 0 ; a1 < 1000000 ; a1++)Arr[a1] = MathRand ();

daha sonra işlemci üzerindeki yük %50'ye kadar büyür.

//------------------------------------------------ -------------------------------------------------- -------------------------------------------------- -

fonksiyonun kendisi

 ResourceCreate ( "::MT object" ,Arr, 1000000 , 1 , 0 , 0 , 0 , COLOR_FORMAT_XRGB_NOALPHA );

işlemciyi yüklemez.

Bir işlev

 ResourceReadImage ( "::MT object" ,Arr,w,h);

Arr[] dizisinin boyutuna bağlı olarak yüzde 0 ile 5 arasında yükler.

 

İşte bir test danışmanı. Görev yöneticisinde sırayla satırları yorumlamanız ve işlemci yükünü kontrol etmeniz gerekir.

Dosyalar:
Test_1.mq4  11 kb
 

İşte onun kodu:

 //+------------------------------------------------------------------+
//|                                                       Test_1.mq4 |
//|                                                      Peter Konow |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Peter Konow"
#property link        "https://www.mql5.com"
#property version    "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
uint Arr[ 1000000 ];
//+------------------------------------------------------------------+
int OnInit ()
  {
//--- create timer
   EventSetMillisecondTimer ( 16 ); 
   //----------------------------------------------------
   //Создаем МТ-объект.
   //----------------------------------------------------
   ObjectCreate ( 0 , "MT object" , OBJ_BITMAP_LABEL , 0 , 0 , 0 );
   //----------------------------------------------------
   //Соединяем с файлом.
   //----------------------------------------------------   
   ObjectSetString ( 0 , "MT object" , OBJPROP_BMPFILE , "::MT object" );
   //----------------------------------------------------
   //Создаем ресурс.
   //----------------------------------------------------
   ResourceCreate ( "::MT object" ,Arr, 1000000 , 1 , 0 , 0 , 0 , COLOR_FORMAT_XRGB_NOALPHA );   
   //----------------------------------------------------  
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
//--- destroy timer
   EventKillTimer ();
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer ()
  {
//---
   uint w = 0 ,h = 0 ;
   string name;
   //----------------------------------------------------
   //Читаем свойство bool.//Нагрузка процессора отсутствует.
   //----------------------------------------------------
   ObjectGetInteger ( 0 , "MT object" , OBJPROP_SELECTED );
   //----------------------------------------------------
   
   //----------------------------------------------------
   //Устанавливаем свойство bool.//Нагрузка процессора: 10% - 15%.
   //----------------------------------------------------
   ObjectSetInteger ( 0 , "MT object" , OBJPROP_SELECTED , 1 );
   //---------------------------------------------------- 
   
   //---------------------------------------------------- 
   //Перерисовываем изображение в массиве Arr[].
   //Нагрузка процессора зависит от размера массива. 
   //При 10000 ячеек, нагрузки нет, при 1000000 ячеек, - ~35%.
   //---------------------------------------------------- 
   for ( int a1 = 0 ; a1 < 1000000 ; a1++)Arr[a1] = MathRand ();
   //---------------------------------------------------- 
   
   //---------------------------------------------------- 
   //Пересоздаем ресурс.//Нагрузка процессора отсутствует
   //при любом размере массива.
   //----------------------------------------------------
   ResourceCreate ( "::MT object" ,Arr, 1000000 , 1 , 0 , 0 , 0 , COLOR_FORMAT_XRGB_NOALPHA );   
   //---------------------------------------------------- 
   
   //----------------------------------------------------
   //Читаем ресурс.
   //Нагрузка процессора зависит от размера массива. 
   //При 10000 ячеек, нагрузки нет, при 1000000 ячеек, 
   //Нагрузка "плавает" от 1 до 6%.   
   //----------------------------------------------------
   ResourceReadImage ( "::MT object" ,Arr,w,h);     
   //----------------------------------------------------
   
   //----------------------------------------------------
   //Пересоединяем с файлом.//Нагрузка процессора: 10% - 15%
   //----------------------------------------------------   
   ObjectSetString ( 0 , "MT object" , OBJPROP_BMPFILE , "::MT object" );  
   //----------------------------------------------------
   
   //----------------------------------------------------
   //Устанавливаем описание объекта.//Нагрузка процессора: 10% - 15%
   //---------------------------------------------------- 
   ObjectSetString ( 0 , "MT object" , OBJPROP_TEXT , "QWERTY" );   
   //----------------------------------------------------
   
   //----------------------------------------------------
   //Читаем описание объекта.//Нагрузка процессора отсутствует.
   //---------------------------------------------------- 
   name = ObjectGetString ( 0 , "MT object" , OBJPROP_TEXT );         
  }
//+------------------------------------------------------------------+
 
Andrey Barinov :

Resimde, Açılış Saati sütunundaki verilerde bir sorun var.

Evet. TimeToStr(OrderOpenPrice(),TIME_MINUTES|TIME_SECONDS); kullandım

Neden bilmiyorum.

 
Реter Konow :

İtiraf etmeliyim ki test sonuçları beni biraz şaşırttı.

Ve böylece, 16 ms'lik bir frekansta sürekli işlev çağrılarından bahsediyoruz.

İşlemciyi çizerken en çok yükleyen piksel dizisinin başlatılması olduğu ortaya çıktı.

Ancak en garip şey, periyodik işlev çağrısının olduğu ortaya çıktı.

işlemciyi %10 - 15 oranında yükler.

Ayrıca, aramalar

aynı %10 - 15'te yük.

Aynı zamanda, üç fonksiyonun aynı anda çağrılması

Katlanan yüke yol açmayın. Yük hala %10-15 kalıyor.

Bununla birlikte, bu çağrılara bir milyon hücrelik bir diziyi yeniden başlatmanın sabit bir döngüsünü eklersek

daha sonra işlemci üzerindeki yük %50'ye kadar büyür.

//------------------------------------------------ -------------------------------------------------- -------------------------------------------------- -

fonksiyonun kendisi

işlemciyi yüklemez.

Bir işlev

Arr[] dizisinin boyutuna bağlı olarak yüzde 0 ile 5 arasında yükler.

Peter Konow'un fotoğrafı.

İtiraf etmeliyim ki test sonuçları beni biraz şaşırttı.

Ve böylece, 16 ms'lik bir frekansta sürekli işlev çağrılarından bahsediyoruz.

İşlemciyi çizerken en çok yükleyen piksel dizisinin başlatılması olduğu ortaya çıktı.

Ancak en garip şey, periyodik işlev çağrısının olduğu ortaya çıktı.

işlemciyi %10 - 15 oranında yükler.

Ayrıca, aramalar

aynı %10 - 15'te yük.

Aynı zamanda, üç fonksiyonun aynı anda çağrılması

Katlanan yüke yol açmayın. Yük hala %10-15 kalıyor.

Bununla birlikte, bu çağrılara bir milyon hücrelik bir diziyi yeniden başlatmanın sabit bir döngüsünü eklersek

daha sonra işlemci üzerindeki yük %50'ye kadar büyür.

//------------------------------------------------ -------------------------------------------------- -------------------------------------------------- -

fonksiyonun kendisi

işlemciyi yüklemez.

Bir işlev

Arr[] dizisinin boyutuna bağlı olarak yüzde 0 ile 5 arasında yükler.


Peter, o kadar ısrarlı bir duygu ki, yüzlerce sayfa size cevap veren hiçbir şeyi dinlemiyorsunuz.
Konuyu tekrar okuyun - "neden öyle" sorusunun cevapları var

 
Реter Konow :

Evet. TimeToStr(OrderOpenPrice(),TIME_MINUTES|TIME_SECONDS); kullandım

Neden bilmiyorum.

Çünkü OrderOpenPrice yerine OrderOpenTime () koymanız gerekiyor