MT4 kilitleniyor, tekrar start() işlevini çağırmıyor

 

Merhaba,

Burada çirkin bir sorunla karşı karşıyayım:

birkaç yinelemeden sonra göstergemin start() işlevi return() çağrısından sonra tekrar geri gelmiyor, yani MT4 bir döngüde kalıyor, tekrar start()'ı çağırmadan CPU'yu tüketiyor.

Merak ediyorum, bir şekilde işlev çağrısı yığınını yok ettim mi?

Nedeni bulmak için esas olarak ne aramamı önerirsiniz?

Zaten bütün hafta hata ayıklıyordum. 72 sayfa kod var.

Herhangi bir DLL çağrısı kullanmıyorum, sadece MQL düzlemi.

teşekkürler.

 
Baştan dönmüyorsun. Kodunuzu düzeltmeniz gerekiyor. dbgView alın ve her işlevin başlangıcında ve dönüşünde Günlük çağrıları ekleyin ve sonsuz döngünüzü takip edin.
 

Hata ayıklama bilgilerini zaten günlüğe kaydediyorum.

Belirsiz bir döngü göremiyorum.

Günlük dosyasında gördüğüm son şey, start() öğesinin son satırında return() öğesini çağırdığım zamandır.

Oradan start() bir daha asla tetiklenmez.

Başka bir şey olmalı.

 
Günlüğe kaydetme nerede/nasıl? GUI iş parçacığını astığınız için Yazdır/Uyarı KULLANAMAZSINIZ, çıktı yazılmaz.
 

Biliyorum, FileWrite(), FileFlush ile kendi PrintDebug() işlevimi kullanıyorum.

 

Hata ayıklama bilgilerini yazdırma yöntemimin yeterli olduğunu düşünüyor musunuz?

 
mt4forum :

Hata ayıklama bilgilerini zaten günlüğe kaydediyorum.

Belirsiz bir döngü göremiyorum.

Günlük dosyasında gördüğüm son şey, start() öğesinin son satırında return() öğesini çağırdığım zamandır.

Oradan start() bir daha asla tetiklenmez.

Başka bir şey olmalı.


Günlüğe start() öğesinin ilk satırı olarak bir şey yazdırıyor musunuz?
 

Evet, ilk satırı ve son satırı kaydediyorum.

Günlüğe kaydetme yöntemimin hiçbir günlük bilgisini kaçırmadığından emin olabilir miyim?

 
mt4forum :

Evet, ilk satırı ve son satırı kaydediyorum.

Günlüğe kaydetme yöntemimin hiçbir günlük bilgisini kaçırmadığından emin olabilir miyim?

Emin değilseniz, yalnızca standart bir Print() kullanın ve yalnızca uzman sekmesini değil günlük dosyasını kontrol edin . . . senin giriş yapma şeklini görmedik.

iCustom() çağrıları aracılığıyla herhangi bir Gösterge kullanıyor musunuz? Bunu yaparsanız, belki de CPU döngülerini alıyorlardır. . .
 

İşte günlük işlevim:

 void PrintDebug( int F, string DebugStr1, string DS2 = "" , string DS3 = "" , string DS4 = "" , string DS5 = "" , string DS6 = "" , string DS7 = "" , 
   string DS8 = "" , string DS9 = "" , string DS10 = "" , string DS11 = "" , string DS12 = "" , string DS13 = "" , string DS14 = "" , string DS15 = "" , 
   string DS16 = "" , string DS17 = "" , string DS18 = "" , string DS19 = "" , string DS20 = "" )
{
   FileWrite (F, CommonIdentStr() + Blank + DebugStr1 + DS2 + DS3 + DS4 + DS5 + DS6 + DS7 + DS8 + DS9 + DS10 
               + DS11 + DS12 +DS13 + DS14 + DS15 + DS16 + DS17 + DS18 + DS19 + DS20);
   FileFlush (F);
}

Ve işte benim başlatma fonksiyonum:

 int start()
  {     
   int TFInd;
   int k;  
   
   if (CheckDebug(DebugStart, 2 ))
      {
         DebugStr = "DebugStart: " + "begin: " + " InitialGapFound: " + BoolToString(InitialGapFound);
         PrintDebug(DebugFile, DebugStr);
      }
   
   if (InitialGapFound)        
      {                                             
         if ( TimeLocal () >= LastInitialGapCloseCheck + HistoryDownloadCheckInterval)                                   // zzz
            {
               LastInitialGapCloseCheck = TimeLocal ();
               
               if (InitialHistoryGapClosed())
                  {
                     if (CheckDebug(DebugStart, 2 ))
                        {
                           DebugStr =   "DebugStart: " + " InitialHistoryGapClosed " ;
                           PrintDebug(DebugFile, DebugStr);
                        }
                  
                     ReInit = true ;
                     InitialGapFound = false ;

                     MyInit();
                  }        
            }

         if (CheckDebug(DebugStart, 2 ))
            {
               DebugStr = "DebugStart: " + " last return in InitialGapFound" ;
               PrintDebug(DebugFile, DebugStr);
            } 
            
         return (OK);
      
      }   // if InitialGapFound

   if (CheckDebug(DebugStart, 2 ))
      {
         DebugStr = "DebugStart (): last return: " ;
         
         PrintDebug(DebugFile, DebugStr);
      } 
 
              
   return ( 0 );
  }

Başlangıcı ve bitişi kaydediyorum.

CheckDebug() işlevinin herhangi bir etkisi yoktur, çünkü her zaman true değerini döndürür.

Oluşturulan günlük dosyası aşağıdadır.

Son girişin, start() işlevinde yürütülen son ifade olan "DebugStart: InitialGapFound'daki son dönüş" olduğunu görebilirsiniz.

Günlük dosyasındaki sonraki giriş , start() işlevinin ilk ifadesi olan "DebugStart: start: ..." olmalıdır.

Ancak start() bir daha asla tetiklenmez. Bunun yerine MT4 bir döngüde kalıyor.

Program mantığımda herhangi bir döngü göremiyorum. DLL kullanmıyorum, iCustom yok, ...

2013.11.15 12:33:14 Test azaltıldı 0: USDJPY M15 Hata Ayıklama Başlatma() başlıyor:
2013.11.15 12:33:14 Test azaltıldı 0: USDJPY M15 DebugMyInit başlıyor:
2013.11.15 12:33:14 Test azaltıldı 0: USDJPY M15 Hata Ayıklama Başlatma() dönüşü:
2013.11.15 12:33:14 Test azaltıldı 0: USDJPY M15 DebugStart: start: InitialGapFound: True
2013.11.15 12:33:14 Test azaltıldı 0: USDJPY M15 DebugStart: InitialGapFound'da son dönüş
2013.11.15 12:33:15 Test azaltıldı 395052: USDJPY M15 DebugStart: start: InitialGapFound: True
2013.11.15 12:33:15 Test azaltıldı 395052: USDJPY M15 DebugStart: InitialGapFound'da son dönüş
2013.11.15 12:33:16 Test azaltıldı 395052: USDJPY M15 DebugStart: start: InitialGapFound: True
2013.11.15 12:33:16 Test azaltıldı 395052: USDJPY M15 DebugStart: InitialHistoryGapClosed
2013.11.15 12:33:16 Test azaltıldı 395052: USDJPY M15 DebugMyInit başlıyor:
2013.11.15 12:33:16 Test azaltıldı 395052: USDJPY M15 DebugMyInit InitialMyInitCalls: 0 IndexCount: 1 nach CreateHistory()
2013.11.15 12:33:17 Test azaltıldı 395052: USDJPY M15 DebugMyInit InitialMyInitCalls: 0 IndexCount: 2 nach CreateHistory()
2013.11.15 12:33:18 Test azaltıldı 395052: USDJPY M15 DebugMyInit InitialMyInitCalls: 0 IndexCount: 3 nach CreateHistory()
2013.11.15 12:33:19 Test azaltıldı 395052: USDJPY M15 DebugMyInit InitialMyInitCalls: 0 IndexCount: 4 nach CreateHistory()
2013.11.15 12:33:20 Test azaltıldı 395052: USDJPY M15 DebugMyInit InitialMyInitCalls: 0 IndexCount: 5 nach CreateHistory()
2013.11.15 12:33:21 Test azaltıldı 395052: USDJPY M15 DebugMyInit InitialMyInitCalls: 0 IndexCount: 6 nach CreateHistory()
2013.11.15 12:33:22 Test azaltıldı 395052: USDJPY M15 DebugMyInit InitialMyInitCalls: 0 IndexCount: 7 nach CreateHistory()
2013.11.15 12:33:22 Test azaltıldı 395052: USDJPY M15 DebugMyInit InitialMyInitCalls: 0 IndexCount: 8
2013.11.15 12:33:22 Test azaltıldı 395052: USDJPY M15 DebugStart: InitialGapFound'da son dönüş

 
mt4forum :

İşte benim günlük fonksiyonum:

Ve işte başlatma fonksiyonum:

Başlangıcı ve bitişi kaydediyorum.

CheckDebug() işlevinin herhangi bir etkisi yoktur, çünkü her zaman true değerini döndürür.

Oluşturulan günlük dosyası aşağıdadır.

Son girişin, start() işlevinde yürütülen son ifade olan "DebugStart: InitialGapFound'daki son dönüş" olduğunu görebilirsiniz.

Günlük dosyasındaki sonraki giriş, start() işlevinin ilk ifadesi olan "DebugStart: start: ..." olmalıdır.

Ancak start() bir daha asla tetiklenmez. Bunun yerine MT4 bir döngüde kalıyor.


Ne tamamdır. . .

       return (OK);


Hata ayıklamanızın soruna neden olduğunu varsayalım, lütfen start() çalıştırmasındaki değişken bildirimlerinden sonra aşağıdakileri ekleyin ve yukarıdaki gibi günlüğü ve günlük alıntınızı göstererek geri bildirin. . .

 int start()
  {     
   int TFInd;
   int k;  
   
   Print ( "start():  started . . ." );   // <-----  add this line here
   
   if (CheckDebug(DebugStart, 2 ))