Верно ли, что когда удаляется вручную индикатор во время выполнения OnCalculate, то OnDeinit исполняется сразу, иногда одновременно с не успевшим завершиться OnCalculate?
Похоже, что так. Класс имеет динамический массив экземпляров другого класса, который освобождается в деструкторе.
Деструктор вызывается только в OnDeinit через delete.
Так вот когда снимаю индикатор с чарта во время выполнения OnCalculate, упомянутый выше массив начинает очищаться сампороизвольно, будто кто-то вызвал деструктор. Этот кто-то - OnDeinit.
В итоге нарываюсь на NULL, вместо экземпляров класса.
Пробовал в OnCalculate использовать _StopFlag, но не помогает.
Как заставить выполняться OnDeinit не во время выполнения OnCalculate, а после?
Если из OnDeinit убираю delete, то на NULL прекращаю нарываться. Однако, в лог получаю логичный leaked memory. Так что это точно OnDeinit. Пробовал в нем Sleep прописать. Но похоже, Sleep в индикаторах не пашет. Пробовал даже так
Использую предопределенные макроподстановки при дебаге. Возможно ли также удобно без передачи соответствующего параметра в функцию/метод узнать, кто ее/его вызвал?
Встроенными в MQL средствами нельзя, это надо делать самому, например, для отладочной версии добавлять параметр "имя вызвавшей функции"
Похоже, что так. Класс имеет динамический массив экземпляров другого класса, который освобождается в деструкторе.
Деструктор вызывается только в OnDeinit через delete.
Так вот когда снимаю индикатор с чарта во время выполнения OnCalculate, упомянутый выше массив начинает очищаться сампороизвольно, будто кто-то вызвал деструктор. Этот кто-то - OnDeinit.
В итоге нарываюсь на NULL, вместо экземпляров класса.
Пробовал в OnCalculate использовать _StopFlag, но не помогает.
Как заставить выполняться OnDeinit не во время выполнения OnCalculate, а после?
Если из OnDeinit убираю delete, то на NULL прекращаю нарываться. Однако, в лог получаю логичный leaked memory. Так что это точно OnDeinit. Пробовал в нем Sleep прописать. Но похоже, Sleep в индикаторах не пашет. Пробовал даже так
индикатор будто игнорит и такое.
Пожалуйста, откройте заявку в сервисдеск и приведите код функции OnDeinit
Спасибо, воспроизвести на простом примере не получилось. Нарвался только на indicator is too slow, 10015 ms. rewrite the indicator, please. Буду думать над примером, воспроизводящим проблему.
Slawa: OnDeinit всегда выполняется после OnCalculate
Есть ли какая-нибудь еще причина в терминале, которая в состоянии удалить из памяти экземпляр класса, когда его деструктор вызывается только в OnDeinit?
Верно ли, что когда удаляется вручную индикатор во время выполнения OnCalculate, то OnDeinit исполняется сразу, иногда одновременно с не успевшим завершиться OnCalculate?
Похоже, что так. Класс имеет динамический массив экземпляров другого класса, который освобождается в деструкторе.
Деструктор вызывается только в OnDeinit через delete.
Так вот когда снимаю индикатор с чарта во время выполнения OnCalculate, упомянутый выше массив начинает очищаться сампороизвольно, будто кто-то вызвал деструктор. Этот кто-то - OnDeinit.
В итоге нарываюсь на NULL, вместо экземпляров класса.
Пробовал в OnCalculate использовать _StopFlag, но не помогает.
Как заставить выполняться OnDeinit не во время выполнения OnCalculate, а после?
Если из OnDeinit убираю delete, то на NULL прекращаю нарываться. Однако, в лог получаю логичный leaked memory. Так что это точно OnDeinit. Пробовал в нем Sleep прописать. Но похоже, Sleep в индикаторах не пашет. Пробовал даже так
индикатор будто игнорит и такое.
Использую предопределенные макроподстановки при дебаге. Возможно ли также удобно без передачи соответствующего параметра в функцию/метод узнать, кто ее/его вызвал?
Похоже, что так. Класс имеет динамический массив экземпляров другого класса, который освобождается в деструкторе.
Деструктор вызывается только в OnDeinit через delete.
Так вот когда снимаю индикатор с чарта во время выполнения OnCalculate, упомянутый выше массив начинает очищаться сампороизвольно, будто кто-то вызвал деструктор. Этот кто-то - OnDeinit.
В итоге нарываюсь на NULL, вместо экземпляров класса.
Пробовал в OnCalculate использовать _StopFlag, но не помогает.
Как заставить выполняться OnDeinit не во время выполнения OnCalculate, а после?
Если из OnDeinit убираю delete, то на NULL прекращаю нарываться. Однако, в лог получаю логичный leaked memory. Так что это точно OnDeinit. Пробовал в нем Sleep прописать. Но похоже, Sleep в индикаторах не пашет. Пробовал даже так
индикатор будто игнорит и такое.
Пожалуйста, откройте заявку в сервисдеск и приведите код функции OnDeinit
Порекомендуйте, как искусственно заставить OnCalculate выполняться долго? Со слипом облом.
У меня воспроизводится только в сложном индикаторе (много расчетов). Как расчеты убираю - все норм, т.к. OnCalculate выполняется почти мгновенно.
Как заставить выполняться OnDeinit не во время выполнения OnCalculate, а после?
Порекомендуйте, как искусственно заставить OnCalculate выполняться долго? Со слипом облом.
У меня воспроизводится только в сложном индикаторе (много расчетов). Как расчеты убираю - все норм, т.к. OnCalculate выполняется почти мгновенно.
OnDeinit всегда выполняется после OnCalculate
Встроенными в MQL средствами нельзя, это надо делать самому, например, для отладочной версии добавлять параметр "имя вызвавшей функции"