Обсуждение статьи "Графические интерфейсы X: Расширенное управление списками и таблицами. Оптимизация кода (build 7)" - страница 3

 

Толь, понимаю, что не в эту тему, но раз уж последнее обновление...

В общем: заметил давно, но ждал когда выйдет это обновление (вдруг пофиксено будет, ан нет...).

Если есть окно с графиком (CStandartChart), и есть окно, расположенное поверх субграфика, то, если пропала связь с сервером, а потом восстановилась, то объект-график становится выше остальных окон.

Надо бы как-то перерисовывать самое верхнее окно. Понятно, что сиё можно в своём CProgram отследить, но мне кажется, что библиотека должна такие вещи делать.

(Тормозит сильно, но это скорее всего из-за реалтайм-записи)


 
Artyom Trishkin:

...

Если есть окно с графиком (CStandartChart), и есть окно, расположенное поверх субграфика, то, если пропала связь с сервером, а потом восстановилась, то объект-график становится выше остальных окон.

Надо бы как-то перерисовывать самое верхнее окно. Понятно, что сиё можно в своём CProgram отследить, но мне кажется, что библиотека должна такие вещи делать.

(Тормозит сильно, но это скорее всего из-за реалтайм-записи)

Хорошо, спасибо за сообщение. Не тестировал ещё с отключением/возобновлением связи. Посмотрю, что можно сделать.

А чего такие тормоза сильные? С помощью какой программы запись ведётся? Уж очень сильно тормозит. Выглядит так, что как будто процессор на все 100% загружен? Попробовал записывать через Fast Stone Capture и активно пользоваться графическим интерфейсом в MQL-приложении. Всё нормально, ничего так не тормозит. 

 
Anatoli Kazharski:

Хорошо, спасибо за сообщение. Не тестировал ещё с отключением/возобновлением связи. Посмотрю, что можно сделать.

А чего такие тормоза сильные? С помощью какой программы запись ведётся? Уж очень сильно тормозит. Выглядит так, что как будто процессор на все 100% загружен? Попробовал записывать через Fast Stone Capture и активно пользоваться графическим интерфейсом в MQL-приложении. Всё нормально, ничего так не тормозит. 

Бесплатная версия oCam. Но у меня, кстати, и без реалтайм записи тоже подтормаживает. Объектов-то очень много. И в таймере приходится сканировать много символов на предмет пересечения ценой уровней, которые для каждого символа - свой соответственно, да и список символов динамический, и его тоже нужно контролировать на предмет изменения. Одно радует - после обновления не пришлось переделывать как в прошлый раз ;))
 

Artyom Trishkin:
...

Но у меня, кстати, и без реалтайм записи тоже подтормаживает.

Объектов-то очень много. 

И в таймере приходится сканировать много символов на предмет пересечения ценой уровней, которые для каждого символа - свой соответственно, да и список символов динамический, и его тоже нужно контролировать на предмет изменения. 

...
И с какой частотой эти проверки делаются?
 
Anatoli Kazharski:
И с какой частотой эти проверки делаются?

Таймер:

//+------------------------------------------------------------------+
//| Таймер                                                           |
//+------------------------------------------------------------------+
void CProgram::OnTimerEvent(void)
  {
   CWndEvents::OnTimerEvent();
//---
   static int count=0;
   if(count<500)
     {
      count+=TIMER_STEP_MSC;
      return;
     }
//--- Обнулить счётчик
   count=0;
//--- Отлавливаем изменение в Обзоре рынка
   if(IsChangeSymbolListInMW()) {
      UpdateAllDataAndTables();
      }
//--- Ловим появление новых баров
   bool need_update=false;
   for(int i=0; i<ArraySize(m_array_new_bar); i++) {
      if(m_array_new_bar[i].isNewBar()>0) {
         string sy=m_array_new_bar[i].GetSymbol();
         ENUM_TIMEFRAMES timeframe=m_array_new_bar[i].GetPeriod();
         Print("Новый бар ",sy," на ",GetNameTF(timeframe));
         if(timeframe==PERIOD_D1) {
            for(int j=0; j<ArraySize(m_array_symbols_new_sig_d1); j++) delete m_array_symbols_new_sig_d1[j].symbol_tick;
            ZeroMemory(m_array_symbols_new_sig_d1);
            }
         if(timeframe==PERIOD_W1) {
            for(int j=0; j<ArraySize(m_array_symbols_new_sig_w1); j++) delete m_array_symbols_new_sig_w1[j].symbol_tick;
            ZeroMemory(m_array_symbols_new_sig_w1);
            }
         if(timeframe==PERIOD_MN1) {
            for(int j=0; j<ArraySize(m_array_symbols_new_sig_mn); j++) delete m_array_symbols_new_sig_mn[j].symbol_tick;
            ZeroMemory(m_array_symbols_new_sig_mn);
            }
         need_update=true;
         }
      }
   if(need_update) {
      UpdateAllDataAndTables();
      }
//--- Изменение текстов значений в главном окне
   short row=(short)m_table_base_symbol_list.SelectedItem();
   ChangeTextData(row);

//--- Ищем критерии уведомлений D1, W1, MN1
   GetNotify(m_sorted_struct_symbols_d1,m_array_symbols_new_sig_d1,PERIOD_D1);
   GetNotify(m_sorted_struct_symbols_w1,m_array_symbols_new_sig_w1,PERIOD_W1);
   GetNotify(m_sorted_struct_symbols_mn,m_array_symbols_new_sig_mn,PERIOD_MN1);
//--- Перерисовать график
   m_chart.Redraw();
  }
//+------------------------------------------------------------------+
шаг таймера (TIMER_STEP_MSC) 16
 
Artyom Trishkin:

Таймер:

...
шаг таймера (TIMER_STEP_MSC) 16

Обязательно ли проверку условий такого рода делать именно в таймере?

Если в таймере, то зачем так часто?

Можно попробовать уменьшить шаг, а также для каждой группы условий установить свой интервал. Для этого добавил класс CTimeCounter. Прочитай ещё раз статью, чтобы понять, как это использовать. Раздел: Приложение для теста элемента

 
Anatoli Kazharski:

Обязательно ли проверку условий такого рода делать именно в таймере?

Если в таймере, то зачем так часто?

Можно попробовать уменьшить шаг, а также для каждой группы условий установить свой интервал. Для этого добавил класс CTimeCounter. Прочитай ещё раз статью, чтобы понять, как это использовать. Раздел: Приложение для теста элемента

Да, я уже думаю над этим.

Проверку на новый бар можно конечно и реже сделать - не критично. А вот проверку на пересечение ценами уровней на некоторых символах (их список меняется динамически, соответственно, и динамически добавляются/удаляются экземпляры класса работы с тиками) нужно делать достаточно часто чтобы успевать вовремя определять факты пересечений.

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

 
Artyom Trishkin:

... А вот проверку на пересечение ценами уровней на некоторых символах (их список меняется динамически, соответственно, и динамически добавляются/удаляются экземпляры класса работы с тиками) нужно делать достаточно часто чтобы успевать вовремя определять факты пересечений.

Ну так, если с тиками работаешь, то в OnTick() тогда лучше эти проверки делать. Зачем в таймер долбиться каждые 16 мс ?
 
Anatoli Kazharski:
Ну так, если с тиками работаешь, то в OnTick() тогда лучше эти проверки делать. Зачем в таймер долбиться каждые 16 мс ?
Так мультивалютный же. Какой OnTick() ?
 
Artyom Trishkin:
Так мультивалютный же. Какой OnTick() ?

Через события тогда. Но никак не через таймер с такой частотой. В общем, тормоза с твоей стороны, а не со стороны библиотеки или записи видео. У меня больше вопросов нет.