Новая версия платформы MetaTrader 5 build 1870: Добавление символов в Обзор рынка по ISIN - страница 12

 

Да, для случая с одним объектом можно сделать что-то такое:

bool ObjectDelete_One( string name )
{
   bool res = ObjectDelete( 0, name );
   ChartRedraw();
   return(res);
}

А Comment просто принудительно делает ChartRedraw, поэтому с ним все работает.

 

fxsaber:

       if(!ResourceReadImage(ResourceName,C.m_pixels,width_bmp,height_bmp)) Print("Error read resource: ",GetLastError()); // переносим bmp файл в массив arr[]
CCanvas C; // необходимо, чтобы в файле Canvas.mqh массив m_pixels был public
fxsaber:

Поэтому и написал, что баг.

Бажочек. Маленький такой , т.к. в справке на ObjectDelete на этом сделан акцент:
"При вызове ObjectDelete() всегда используется асинхронный вызов, поэтому функция возвращает только результат постановки команды в очередь графика. В этом случае true означает только то, что команда успешно поставлена в очередь, сам результат её выполнения неизвестен."
Удаление то всегда происходит, но иногда просто не сразу, но со сменой ТФ всегда сразу. 

 
Andrey Khatimlianskii:

Да, для случая с одним объектом можно сделать что-то такое:

А Comment просто принудительно делает ChartRedraw, поэтому с ним все работает.

Это понятно. Об этом я и писал: "(ChartRedraw или Comment - не важно, т.к. Comment тоже выполняет ChartRedraw)"
Но работает и с ChartXYToTimePrice (просто функция очень медленная, поэтому и привел ее в качестве примера), а она то уж вряд ли перерисовывает график.

 
Alexey Viktorov:
Ну какой-же баг? Вы хотите чтобы в ObjectDelete принудительно сунули ChartRedraw? А "завтра" найдётся такой умник который станет замерять скорость выполнения ObjectDelete нескольких объектов в цикле и после каждого объекта будет ChartRedraw, ну и какая скорость будет при этом?

ChartRedraw перерисовывает чарт. Он не занимается удалением объекта (не остатков его отображения). Изначально же велась речь о том, что не что-то там отображается, а что объект полноценно существует. Код приведен для воспроизведения.

 
fxsaber:

ChartRedraw перерисовывает чарт. Он не занимается удалением объекта (не остатков его отображения). Изначально же велась речь о том, что не что-то там отображается, а что объект полноценно существует. Код приведен для воспроизведения.

Не упорствуйте.

Представьте, что это не ОбжектДелит(), а ПриготовитьОбъектКУдалениюПриСледующейПерерисовке().

А Делит можете написать сами.

 
Andrey Khatimlianskii:

Не упорствуйте.

Представьте, что это не ОбжектДелит(), а ПриготовитьОбъектКУдалениюПриСледующейПерерисовке().

А Делит можете написать сами.

Почти соглашусь. 
Почти потому, что если удаленный объект остается на экране и я мышкой делаю скролинг баров , то перерисовка уже происходит, но объект не удаляется, но удаляется при смене ТФ. Поэтому согласен и с Фабером, что маленький баг все же имеет место быть. В очереди на удаление то он стоит, но почему то не торопиться удаляться.:))
 
Nikolai Semko:

Бажочек. Маленький такой , т.к. в справке на ObjectDelete на этом сделан акцент:
"При вызове ObjectDelete() всегда используется асинхронный вызов, поэтому функция возвращает только результат постановки команды в очередь графика. В этом случае true означает только то, что команда успешно поставлена в очередь, сам результат её выполнения неизвестен."
Удаление то всегда происходит, но иногда просто не сразу, но со сменой ТФ всегда сразу. 

Описание в справке абсолютно точное. Команда удаления лишь поставлена в очередь графика. И пока команда находится в очереди, пока она не выполнена, объект не является удаленным. ChartRedraw() принудительно инициирует процессинг команд в очереди чарта. Процессинг команд в очереди чарта может быть запущен и по многим другим причинам, но если вы хотите гарантировано запустить процессинг команд - используйте ChartRedraw(). И это не специфика команды ObjectDelete(), а абсолютно общее поведение для всех асинхронных команд работы с графиком. Такой подход позволяет использовать пакетную обработку команд, он описан в справке и изначально заложен в архитектуру терминала МТ5, т.е. не является новинкой.

 
Anton:

И пока команда находится в очереди, пока она не выполнена, объект не является удаленным.

Находится в очереди часами.

 
fxsaber:

Находится в очереди часами.

Сколько угодно долго. Если процессинг очереди не запущен, то команда продолжает оставаться в очереди. Магии тут нет.

Если вы используете в своей программе асинхронные команды работы с чартом, то для их фактического исполнения вы обязаны явно инициировать процессинг очереди команд чарта. Отсутствие такого кода в вашем примере является вашей ошибкой, а не багом терминала.

Я еще раз напоминаю, что такое поведение асинхронных команд работы с чартом описано в справке и изначально заложено в архитектуру терминала МТ5.

 
Anton:

Сколько угодно долго. Если процессинг очереди не запущен, то команда продолжает оставаться в очереди. Магии тут нет.

Если вы используете в своей программе асинхронные команды работы с чартом, то для их фактического исполнения вы обязаны явно инициировать процессинг очереди команд чарта. Отсутствие такого кода в вашем примере является вашей ошибкой, а не багом терминала.

Я еще раз напоминаю, что такое поведение асинхронных команд работы с чартом описано в справке и изначально заложено в архитектуру терминала МТ5.

Логика понятна, спасибо. К сожалению, по Справке без этих пояснений не разобраться.