![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Канвас это объект, к которому привязан массив пикселей. За привязку этого массива пикселей отвечает Ресурс (см. функцию bool CCanvas::Create())
Плохая практика все время удалять и пересоздавать канвас.
Хорошая практика создать канвас, когда он нужен и удалить его, когда он больше не будет нужен, например в конце программы.
Один раз создав объект канваса, вы можете его очищать, перезаписывать массив пикселей хоть каждый кадр, изменять размер канваса и передвигать его в любое место.
Спасибо, стало немного понятнее, но не все. Я правильно понимаю, что если после создания канвас-объекта, я просто удаляю объект с графика с помощью ObjectDelete(), то массив пикселей привязанный к этому объекту остается нетронутым и... когда я снова создаю новый канвас-объект уже с другим именем, в памяти создается и новый массив пикселей, и таким образом теоретически можно забить всю память?
Или все-таки старый массив пикселей каждый раз просто перепривязывается к последнему созданному канвас-объекту (ведь именно и только с ним начинают работать все функции используемого экземпляра канвас-класса)
Спасибо, стало немного понятнее, но не все. Я правильно понимаю, что если после создания канвас-объекта, я просто удаляю объект с графика с помощью ObjectDelete(), то массив пикселей привязанный к этому объекту остается нетронутым и... когда я снова создаю новый канвас-объект уже с другим именем, в памяти создается и новый массив пикселей, и таким образом теоретически можно забить всю память?
конечно, бесхозные ресурсы будут множиться.
Или все-таки старый массив пикселей каждый раз просто перепривязывается к последнему созданному канвас-объекту (ведь именно и только с ним начинают работать все функции используемого экземпляра канвас-класса)
с фантазией у вас все просто супер. Аж завидно. До такого бы я не додумался. :))
впрочем, если сохранить имя бесхозного ресурса, то можно повторно привязать его к новому битмап объекту. Но это из области шизофрении.
впрочем, если сохранить имя бесхозного ресурса, то можно повторно привязать его к новому битмап объекту. Но это из области шизофрении.
Беру свои слова обратно. Вроде нашел случай, когда такое могло бы пригодиться.
Благодарю, я просто хотел понять, что происходить в памяти, если вместо Destroy() использовать ObjectDelete(). И понял, что в таком случае графические ресурсы (бесхозные пиксельные массивы и что-то там еще) будут множиться, если каждый раз для нового канвас объекта генерировать новое имя.
А если использовать использовать ObjectDelete(), но затем создать канвас-объект с тем же именем, пиксельный массив старый будет или все равно новый?
p.s. вопросы наверное глупые, но мне это нужно для понимания механизма работы канвас
Благодарю, я просто хотел понять, что происходить в памяти, если вместо Destroy() использовать ObjectDelete(). И понял, что графические ресурсы (бесхозные пиксельные массивы и что-то там еще) будут множиться, если каждый раз для нового канвас объекта генерировать новое имя.
Это ж легко проверить, написав простенький скрипт
Подскажите как?
Подскажите как?
например так:
и смотрим на коммент:
!!! после работы этого скрипта не забудьте перезагрузить терминал, чтобы память под бесхозные ресурсы освободилась.
например так:
и смотрим на коммент:
!!! после работы этого скрипта не забудьте перезагрузить терминал, чтобы память под бесхозные ресурсы освободилась.
Большое спасибо за помощь! Не работал так с памятью раньше, буду тестировать.
За подсказку, что бесхозные ресурсы удаляются при перезагрузке терминала, отдельное спасибо! Многие подобные вещи для меня еще пока не очевидны.
p.s. в этом примере прекрасно всё! Есть на что посмотреть, над чем подумать и есть возможность поэкспериментировать... благо код короткий.
Подскажите еще, если канвас используется в советнике, нужно ли выполнять Destroy(), при удалении советника с графика и при закрытии терминала? Тоже не знаю как это проверить. Имеется ввиду рабочий канвас с закрепленным объектом. Там разница в памяти в пределах погрешности (если выполнять и не выполнять Destroy().
Не нужно. В деструкторе Canvas'а он автоматически отрабатывает:
~iCanvas() { Destroy(); ChartRedraw();};