MT4가 멈추고 start()를 다시 호출하지 않습니다.

 

안녕,

나는 여기에서 추악한 문제에 직면하고 있습니다.

몇 번의 반복 후에 내 표시기의 start() 함수 는 return() 호출 후 다시 돌아오지 않습니다. 즉, MT4는 start()를 다시 호출하지 않고 루프에서 멈추고 CPU를 소모합니다.

어떻게 든 함수 호출 스택을 파괴했는지 궁금합니다.

내가 주로 원인을 찾아야 한다고 제안하는 것은 무엇입니까?

이미 일주일 내내 디버깅을 했습니다. 72페이지의 코드입니다.

DLL 호출을 사용하지 않고 MQL 평면만 사용합니다.

감사합니다.

 
당신은 처음부터 돌아오지 않습니다. 코드를 수정해야 합니다. dbgView를 얻고 모든 함수의 시작 및 반환에 Log 호출을 추가하고 무한 루프를 추적하십시오.
 

이미 디버그 정보를 기록하고 있습니다.

무한 루프를 볼 수 없습니다.

로그 파일에서 마지막으로 본 것은 start()의 마지막 줄에서 return()을 호출할 때입니다.

거기에서 start()는 다시 트리거되지 않습니다.

다른 것이어야 합니다.

 
로깅 위치/방법? GUI 스레드를 중단하고 있기 때문에 Print/Alert를 사용할 수 없으며 출력이 기록되지 않습니다.
 

나는 FileWrite(), FileFlush와 함께 내 자신의 PrintDebug() 함수 를 사용하고 있다는 것을 알고 있습니다.

 

디버그 정보를 인쇄하는 방법으로 충분하다고 생각하십니까?

 
mt4forum :

이미 디버그 정보를 기록하고 있습니다.

무한 루프를 볼 수 없습니다.

로그 파일에서 마지막으로 본 것은 start()의 마지막 줄에서 return()을 호출할 때입니다.

거기에서 start()는 다시 트리거되지 않습니다.

다른 것이어야 합니다.


start() 의 첫 번째 줄로 로그에 무언가를 인쇄합니까?
 

예, 첫 번째 줄과 마지막 줄을 기록하고 있습니다.

내 로깅 방식이 로그 정보를 놓치지 않는다는 것을 확신할 수 있습니까?

 
mt4forum :

예, 첫 번째 줄과 마지막 줄을 기록하고 있습니다.

내 로깅 방식이 로그 정보를 놓치지 않는다는 것을 확신할 수 있습니까?

확실하지 않은 경우 표준 Print()를 사용하고 전문가 탭뿐만 아니라 로그 파일확인 하십시오. . . 우리는 당신의 기록 방식을 보지 못했습니다.

iCustom() 호출을 통해 표시기를 사용합니까? 당신이 할 경우 아마도 그들은 CPU 사이클을 취하고 있습니다. . .
 

내 로그 기능은 다음과 같습니다.

 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);
}

그리고 여기 내 시작 기능이 있습니다.

 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 );
  }

시작과 끝을 기록하고 있습니다.

CheckDebug() 함수는 항상 true를 반환하므로 영향을 미치지 않습니다.

다음은 생성된 로그 파일입니다.

마지막 항목은 "DebugStart: last return in InitialGapFound"이며, 이는 start() 함수에서 실행된 마지막 명령문입니다.

로그 파일의 다음 항목 은 start() 함수의 첫 번째 명령문인 "DebugStart: begin: ..."이어야 합니다.

그러나 start()는 다시 트리거되지 않습니다. 대신 MT4는 루프에 멈춥니다.

내 프로그램 논리에서 루프를 볼 수 없습니다. 나는 DLL을 사용하지 않고 iCustom을 사용하지 않습니다.

2013.11.15 12:33:14 테스트 축소 0: USDJPY M15 디버그 초기화() 시작:
2013.11.15 12:33:14 테스트 축소 0: USDJPY M15 DebugMyInit 시작:
2013.11.15 12:33:14 테스트 축소 0: USDJPY M15 디버그 초기화() 반환:
2013.11.15 12:33:14 테스트 축소 0: USDJPY M15 DebugStart: 시작: InitialGapFound: True
2013.11.15 12:33:14 테스트 축소 0: USDJPY M15 DebugStart: InitialGapFound의 마지막 반환
2013.11.15 12:33:15 테스트 축소 395052: USDJPY M15 DebugStart: 시작: InitialGapFound: True
2013.11.15 12:33:15 테스트 축소 395052: USDJPY M15 DebugStart: InitialGapFound의 마지막 반환
2013.11.15 12:33:16 테스트 축소 395052: USDJPY M15 DebugStart: 시작: InitialGapFound: True
2013.11.15 12:33:16 테스트 축소 395052: USDJPY M15 DebugStart: InitialHistoryGapClosed
2013.11.15 12:33:16 테스트 축소 395052: USDJPY M15 DebugMyInit 시작:
2013.11.15 12:33:16 테스트 축소 395052: USDJPY M15 DebugMyInit InitialMyInitCalls: 0 IndexCount: 1 nach CreateHistory()
2013.11.15 12:33:17 테스트 축소 395052: USDJPY M15 DebugMyInit InitialMyInitCalls: 0 IndexCount: 2 nach CreateHistory()
2013.11.15 12:33:18 테스트 축소 395052: USDJPY M15 DebugMyInit InitialMyInitCalls: 0 IndexCount: 3 nach CreateHistory()
2013.11.15 12:33:19 테스트 축소 395052: USDJPY M15 DebugMyInit InitialMyInitCalls: 0 IndexCount: 4 nach CreateHistory()
2013.11.15 12:33:20 테스트 축소 395052: USDJPY M15 DebugMyInit InitialMyInitCalls: 0 IndexCount: 5 nach CreateHistory()
2013.11.15 12:33:21 테스트 축소 395052: USDJPY M15 DebugMyInit InitialMyInitCalls: 0 IndexCount: 6 nach CreateHistory()
2013.11.15 12:33:22 테스트 축소 395052: USDJPY M15 DebugMyInit InitialMyInitCalls: 0 IndexCount: 7 nach CreateHistory()
2013.11.15 12:33:22 테스트 축소 395052: USDJPY M15 DebugMyInit 반환 InitialMyInitCalls: 0 IndexCount: 8
2013.11.15 12:33:22 테스트 축소 395052: USDJPY M15 DebugStart: InitialGapFound에서 마지막 반환

 
mt4forum :

내 로그 기능은 다음과 같습니다.

그리고 여기 내 시작 기능이 있습니다.

시작과 끝을 기록하고 있습니다.

CheckDebug() 함수는 항상 true를 반환하므로 영향을 미치지 않습니다.

다음은 생성된 로그 파일입니다.

마지막 항목은 "DebugStart: last return in InitialGapFound"이며, 이는 start() 함수에서 실행된 마지막 명령문입니다.

로그 파일의 다음 항목은 start() 함수의 첫 번째 명령문인 "DebugStart: begin: ..."이어야 합니다.

그러나 start()는 다시 트리거되지 않습니다. 대신 MT4는 루프에 멈춥니다.


에서 OK는 무엇입니까? . .

       return (OK);


디버깅이 문제를 일으키고 있다고 가정하고 start() 실행에서 변수 선언 후에 다음을 추가하고 위와 같이 로그와 로그 발췌문을 보여주는 보고서를 다시 보고하십시오. . .

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