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

 
Alexey Viktorov:

А не может получиться так, что цикл длится дольше чем отведено времени на выполнение OnDeinit?

Ведь у вас в примере все объекты имеют префикс "trend" почему-бы не воспользоваться этим и отказаться от цикла?

Это только в примере. В индикаторе же, над которым я работаю довольно сложные имена. А пример я сделал просто для демонстрации.

 
Mihail Matkovskij:

Я конечно же думал раньше об этом примечании. Но потом почему-то решил что это баг терминала. За что приношу свои извинения. Получается, это моя недоработка.

Но я не знаю, что в данном случае делать. Вызывать ObjectDelete, а потом ObjectFind и дожидаться пока он отработает, чтобы узнать, удален ли на самом деле объект. Исходя из того же примечания, это слишком затратно по времени. Да и не знаю, сработает ли повторное удаление (в своем индикаторе я пытался вызывать ObjectDelete два раза подряд и безрезультатно). А функция Sleep в индикаторах не работает, чтобы дать графику немного времени на удаление каждого объекта. Возможно где-нибудь есть примеры, как это обойти?

Вы же по-моему добавляете все указатели в список. Подсистема терминала сама удаляет такие объекты, указатели на которые лежат в списке CArrayObj

trend = new CChartObjectTrend();
    if(trend.Create(0, "trend"+(string)i, 0, time[shift], low[shift], time[shift], high[shift]))
      listOfTrendLines.Add(trend);
Здесь у вас потенциальная утечка памяти. И потенциальное обращение к невалидному объекту.
 
Artyom Trishkin:
Вы же по-моему добавляете все указатели в список. Подсистема терминала сама удаляет такие объекты, указатели на которые лежат в списке CArrayObj

После завершения работы терминала после индикатора остаются объекты на чарте. И когда я снова запускаю терминал, то эти объекты видны и портят весь вид.

 
Mihail Matkovskij:

После завершения работы терминала после индикатора остаются объекты на чарте. И когда я снова запускаю терминал, то эти объекты видны и портят весь вид.

Я не у компа чтобы проверить ваш пример. Свой пост выше дополнил тем, что вижу по ошибкам. 
 
Artyom Trishkin:
Вы же по-моему добавляете все указатели в список. Подсистема терминала сама удаляет такие объекты, указатели на которые лежат в списке CArrayObj

Здесь у вас потенциальная утечка памяти.

Если утечка памяти (по указателю объект не был удален), то по завершению в журнале пишет, каких и сколько объектов не было удалено и сколько памяти не освобождено. Но у меня не было ничего подобного. Объекты удаляются, а их объекты чарта удаляются не все.

Rashid Umarov заметил, что проблема в том что график не успевает обработать такое большое количество команд на удаление объектов чарта! При чем здесь утечки памяти?
Документация по MQL5: Основы языка / Типы данных / Указатели объектов
Документация по MQL5: Основы языка / Типы данных / Указатели объектов
  • www.mql5.com
//| Script program start function                                    | //|  Объекты всегда передаются по ссылке                             | //| Передача массива объектов                                        | //| Передача массива указателей на объект                            |
 
Mihail Matkovskij:

Это только в примере. В индикаторе же, над которым я работаю довольно сложные имена. А пример я сделал просто для демонстрации.

А в чём проблема сделать префикс? Может надо было сначала проверить такой вариант?

 
Mihail Matkovskij:

Если утечка памяти (по указателю объект не был удален), то по завершению в журнале пишет, каких и сколько объектов не было удалено и сколько памяти не освобождено. Но у меня не было ничего подобного. Объекты удаляют, а их объекты чарта удаляются не все.

Rashid Umarov заметил, что проблема в том что график не успевает обработать такое большое количество команд на удаление объектов чарта! При чем здесь утечки памяти?
Я ж написал "потенциальное". Это значит, что потом будете опять искать. Лучше сразу. 
 
Alexey Viktorov:

А в чём проблема сделать префикс? Может надо было сначала проверить такой вариант?

Это мне нудно переделывать все алгоритмы именования объектов в моем индикаторе и не известно заработает ли... А там кода достаточно много, уж поверьте.

Может быть есть какой-то другой способ. Например, сначала вызвать ObjectDelete для всех объектов, а потом после задержки вызвать ObjectFind. И снова удалить те объекты, которые не удалились. И так пока их количество не станет равным 0. Но как в индикаторе сделать задержку, если функция Sleep там не работает?

Artyom Trishkin:
Я ж написал "потенциальное". Это значит, что потом будете опять искать. Лучше сразу. 
Это просто пример и суть не в утечках памяти. В индикаторе у меня всё устроено по-другому.
 
Mihail Matkovskij:

Это мне нудно переделывать все алгоритмы именования объектов в моем индикаторе. А там кода достаточно много, уж поверьте.

Может быть есть какой-то другой способ. Например, сначала вызвать ObjectDelete для всех объектов, а потом после задержки вызвать ObjectFind. И снова удалить те объекты, которые не удалились. И так пока их количество не станет равным 0. Но как в индикаторе сделать задержку, если функция Sleep там не работает?

Очень правильный подход. Мне нудно всё менять, пусть разработчики нудно всё меняют. Кто вам мешает проверить на вашем-же примере и огласить результат? Вы даже этого сделать не хотите, «Пусть пробуют они. Я лучше пережду…» © В.Высоцкий.

 
Alexey Viktorov:

Очень правильный подход. Мне нудно всё менять, пусть разработчики нудно всё меняют. Кто вам мешает проверить на вашем-же примере и огласить результат? Вы даже этого сделать не хотите, «Пусть пробуют они. Я лучше пережду…» © В.Высоцкий.

Я такого не говорил, чтобы разработчики за меня что-то делали! Просто сам алгоритм именования объектов у меня не рассчитан на последующий вызов функции ObjectDeledeAll. Это только в примере простое именование "trend".