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

 
Mihail Matkovskij #:

Интересно, в каких случаях если индикатор запущен а его окна не существует? 

Имел ввиду использование iCustom

А когда окно неактивно (пользователь переключился на другой чарт или свернул его), то что ресурс выгружается из памяти, попросту удаляется? 

это было лишь мое предположение, так как особого смысла формирования изображений при свернутом окне нет. Как это реализовано в MT - не проверял, но сталкивался с чем-то подобным. Забыл нюансы.
Во всяком случае вряд ли ресурс удаляется, но и не обновляется со времением. Т.е. не работает CCanvas::Update

void CCanvas::Update(const bool redraw)
  {
//--- check
   if(m_rcname==NULL)
      return;
//--- update resource and redraw
   if(ResourceCreate(m_rcname,m_pixels,m_width,m_height,0,0,0,m_format) && redraw)
      ChartRedraw(this.m_chart_id);
  }
 
Nikolai Semko #:

Имел ввиду использование iCustom

Получается, через ресурс и буферы можно передавать значения, а через ресурс Канваса нет. Интересная задача получается, вызов индикатора с выводом на Канвас с помощью iCustom. Такого я не пробовал. Мне кажется в данном случае возможны шибки. А может быть, такой индикатор, загруженный через iCustom вообще не будет работать?...

Во всяком случае вряд ли ресурс удаляется, но и не обновляется со времением. Т.е. не работает CCanvas::Update

Думаю, ResourceCreate работает, но результат не выводится с помощью ChartRedraw. Обращения к функции идут, но система понимает, что чарт обновлять не надо пока он неактивен. Но если бы не работал ResourceCreate, то представьте, что индикатор обновил данные на произвольном тике в момент когда чарт неактивен, но ресурс Канваса не обновился. А потом пользователь решил активировать данный неактивный чарт и посмотреть на индикатор (на Канву). И получается такая ситуация, что тик был, а Канва осталась прежней, как была до момента смены чарта пользователем. А если в период неактивности било множество тиков?... То индикатор их бы обработал конечно, но не один результат не отобразился бы на Канве.

 
Mihail Matkovskij #:

Думаю, ResourceCreate работает, но результат не выводится с помощью ChartRedraw. 

Да, наверное, Вы правы. Скорей всего так и будет. 
И для экономии ресурсов правильно бы контролировать активность окна и не формировать битмап, если окно не активно.

Стоит проверить, а не строить предположений.

 

Ах, неужели эта тема в дебаге больше не работает?
Печалька :(( Очень пригождалась в работе


 
Nikolai Semko #:

Да, наверное, Вы правы. Скорей всего так и будет. 
И для экономии ресурсов правильно бы контролировать активность окна и не формировать битмап, если окно не активно.

Стоит проверить, а не строить предположений.

Что удалось выяснить:

  • при переключении окон ресурс не удаляется
  • при переключении окон происходит событие CHARTEVENT_CHART_CHANGE, так как меняется размер окна на размер окна предыдущих установок размера "не на все окно", т.е. словно окно перешло в такой режим: 
  • целесообразно контролировать активность окна (ChartGetInteger(0, CHART_BRING_TO_TOP)) и выключать формирование битмапа (заполнять канвас) для экономии ресурсов работы процессора в случае неактивности окна


В тестовом индикаторе счетчик сохраняется в ресурсе канваса.

Файлы:
 
Nikolai Semko #:

Что удалось выяснить:

  • при переключении окон ресурс не удаляется
  • при переключении окон происходит событие CHARTEVENT_CHART_CHANGE, так как меняется размер окна на размер окна предыдущих установок размера "не на все окно", т.е. словно окно перешло в такой режим: 
  • целесообразно контролировать активность окна (ChartGetInteger(0, CHART_BRING_TO_TOP)) и выключать формирование битмапа (заполнять канвас) для экономии ресурсов работы процессора в случае неактивности окна

В тестовом индикаторе счетчик сохраняется в ресурсе канваса.

так это же очевидная Ваша ошибка - использование одного и того же ресурса на многих чартах во многих индикаторах.
ваши индикаторы (или ЕА) не работают если окно не активно - то есть пользователь не сможет использовать несколько копий одновременно на разных чартах.
 
Taras Slobodyanik #:

так это же очевидная Ваша ошибка - использование одного и того же ресурса на многих чартах во многих индикаторах.
ваши индикаторы (или ЕА) не работают если окно не активно - то есть пользователь не сможет использовать несколько копий одновременно на разных чартах.
Что за бред, Тарас?
Даже не знаю как ответить.
Изучайте матчасть.
При чем тут работа индикатора и графический вывод? У каждого индикатора или EA свой графический ресурс.
Загляните в класс CCanvas, как формируется имя ресурса.
 
Nikolai Semko #:
При чем тут работа индикатора и графический вывод? У каждого индикатора или EA свой графический ресурс.
Загляните в класс CCanvas, как формируется имя ресурса.

При том что когда одинаковые ресурсы то они перерисовываются для всех копий.

Проверял ваш код в "окнонном" режиме и на одном чарте - размер один и тот же.
Для "развернутого" режима да размер изменяется, но это древний баг - несколько лет ему точно.

При чем тут работа индикатора и графический вывод?

при том что если окно неактивно то вы рекомендуете не обновлять канвас - это значит что

пс. ну и следовательно - не будут работать панели, благодаря вашему совету :)

то есть визуально в "оконном" режиме, индикаторы (и ЕА) не будут обновляться.

пс. хотя если проверка только в OnChartEvent то должно работать, надо проверить.

 
Taras Slobodyanik #:

При том что когда одинаковые ресурсы то они перерисовываются для всех копий.

они не одинаковые

при том что если окно неактивно то вы рекомендуете не обновлять канвас - это значит что

то есть визуально в "оконном" режиме, индикаторы (и ЕА) не будут обновляться.

да, был не прав с CHART_BRING_TO_TOP
надо использовать вариант fxsaber

 
Nikolai Semko #:

Что удалось выяснить:

  • при переключении окон ресурс не удаляется
  • при переключении окон происходит событие CHARTEVENT_CHART_CHANGE, так как меняется размер окна на размер окна предыдущих установок размера "не на все окно", т.е. словно окно перешло в такой режим: 
  • целесообразно контролировать активность окна (ChartGetInteger(0, CHART_BRING_TO_TOP)) и выключать формирование битмапа (заполнять канвас) для экономии ресурсов работы процессора в случае неактивности окна


В тестовом индикаторе счетчик сохраняется в ресурсе канваса.

Прекрасно. Теперь можно точно сказать как всё работает, а не предполагать. Будет полезно всем, кто работает с CCanvas.