Ошибки, баги, вопросы - страница 1538

 
Vladislav Andruschenko:
Это не полные логи. Пишите в сервисдеск.
[Удален]  
comp:

Верно ли, что когда удаляется вручную индикатор во время выполнения OnCalculate, то OnDeinit исполняется сразу, иногда одновременно с не успевшим завершиться OnCalculate?

Похоже, что так. Класс имеет динамический массив экземпляров другого класса, который освобождается в деструкторе.

Деструктор вызывается только в OnDeinit через delete.

Так вот когда снимаю индикатор с чарта во время выполнения OnCalculate, упомянутый выше массив начинает очищаться сампороизвольно, будто кто-то вызвал деструктор. Этот кто-то - OnDeinit.

В итоге нарываюсь на NULL, вместо экземпляров класса.

Пробовал в OnCalculate использовать _StopFlag, но не помогает.

Как заставить выполняться OnDeinit не во время выполнения OnCalculate, а после?

Если из OnDeinit убираю delete, то на NULL прекращаю нарываться. Однако, в лог получаю логичный leaked memory. Так что это точно OnDeinit. Пробовал в нем Sleep прописать. Но похоже, Sleep в индикаторах не пашет. Пробовал даже так

  void MySleep( const uint Pause ) const
  {
    const uint StartTime = GetTickCount();
    
    while(GetTickCount() - StartTime < Pause)
      ;
      
    return;
  }

индикатор будто игнорит и такое.

 
comp:

Использую предопределенные макроподстановки при дебаге. Возможно ли также удобно без передачи соответствующего параметра в функцию/метод узнать, кто ее/его вызвал? 

Встроенными в MQL средствами нельзя, это надо делать самому, например, для отладочной версии добавлять параметр "имя вызвавшей функции"
 
comp:

Похоже, что так. Класс имеет динамический массив экземпляров другого класса, который освобождается в деструкторе.

Деструктор вызывается только в OnDeinit через delete.

Так вот когда снимаю индикатор с чарта во время выполнения OnCalculate, упомянутый выше массив начинает очищаться сампороизвольно, будто кто-то вызвал деструктор. Этот кто-то - OnDeinit.

В итоге нарываюсь на NULL, вместо экземпляров класса.

Пробовал в OnCalculate использовать _StopFlag, но не помогает.

Как заставить выполняться OnDeinit не во время выполнения OnCalculate, а после?

Если из OnDeinit убираю delete, то на NULL прекращаю нарываться. Однако, в лог получаю логичный leaked memory. Так что это точно OnDeinit. Пробовал в нем Sleep прописать. Но похоже, Sleep в индикаторах не пашет. Пробовал даже так

индикатор будто игнорит и такое.

Пожалуйста, откройте заявку в сервисдеск и приведите код функции OnDeinit
[Удален]  
Ilyas:
Пожалуйста, откройте заявку в сервисдеск и приведите код функции OnDeinit

Порекомендуйте, как искусственно заставить OnCalculate выполняться долго? Со слипом облом.

У меня воспроизводится только в сложном индикаторе (много расчетов). Как расчеты убираю - все норм, т.к. OnCalculate выполняется почти мгновенно.

 
comp:

Как заставить выполняться OnDeinit не во время выполнения OnCalculate, а после?


OnDeinit всегда выполняется после OnCalculate
 
comp:

Порекомендуйте, как искусственно заставить OnCalculate выполняться долго? Со слипом облом.

У меня воспроизводится только в сложном индикаторе (много расчетов). Как расчеты убираю - все норм, т.к. OnCalculate выполняется почти мгновенно.

#import "kernel32.dll"
    void Sleep(uint);
#import



kernel32::Sleep(10000);
[Удален]  
Ilyas:
Спасибо, воспроизвести на простом примере не получилось. Нарвался только на indicator is too slow, 10015 ms. rewrite the indicator, please. Буду думать над примером, воспроизводящим проблему.

[Удален]  
Slawa:
OnDeinit всегда выполняется после OnCalculate
Есть ли какая-нибудь еще причина в терминале, которая в состоянии удалить из памяти экземпляр класса, когда его деструктор вызывается только в OnDeinit?
[Удален]  
Ilyas:
Встроенными в MQL средствами нельзя, это надо делать самому, например, для отладочной версии добавлять параметр "имя вызвавшей функции"
Такой параметр добавил. А что имеется в виду под отличающимися отладочной и релизной версией в одном коде?