indicator is too slow

 

Индикатор не имеет индикаторных буферов:

#property indicator_plots               0
#property indicator_buffers             0

и ничего не считает в OnCalculate():

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[])
  {
//--- return value of prev_calculated for next call
   return(rates_total);
  }


Это индикатор отображает панель диалога. Тем не менее периодически получаю ошибку "too slow" и индикатор после этого останавливается.

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

 
barabashkakvn:

Индикатор не имеет индикаторных буферов:

и ничего не считает в OnCalculate():

nn

Нужно больше информации, телепаты в отпуске :)

Может там таймер есть? 

 
fyords:

Нужно больше информации, телепаты в отпуске :)

Может там таймер есть? 

В индикаторе нет никаких ресурсоёмких расчётов. Пришло событие - нарисовали кружочек.
 
barabashkakvn: 

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

Возможно очередь событий переполняется, отсюда и ошибка.
Может нужно дополнительные проверки делать?
Возможно очень часто перерисовываются объекты.
 
barabashkakvn:
В индикаторе нет никаких ресурсоёмких расчётов. Пришло событие - нарисовали кружочек.

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

На сколько помню, у индикатора один поток, и рисование происходит в этом потоке тоже. 

 
fyords:
Возможно очередь событий переполняется, отсюда и ошибка.
Может нужно дополнительные проверки делать?
Возможно очень часто перерисовываются объекты.
Если очередь переполнится, то просто не нарисуется чего-то там. А рисуется всегда - я это вижу, значит очередь событий обрабатывается.
 
Сколько обьектов читается/пишется/модифицируется/перемещается на каждом тике?

Есть ли защита от попыток бесполезного изменения позиций/статусов/итд, если позиция не изменилось?

Учтите, что очередь сообщений(все чтения и запись идут через очередь с блокировками) обьектов тесно связана с чартом и запросто может тормозить, если обьем изменений огромен или компьютер слаб.

Как идет работа с обьектами? Смешано ли чтение с записью? Если идет массовый режим читаю/пишу по каждому обьекту, то очередь будет постоянно синхронизироваться, ожидая сброса команд записи, что в разы увеличит задержки. Лучше всего массово читать (если обьектов очень много), а потом писать.
 
Renat:
Сколько обьектов читается/пишется/модифицируется/перемещается на каждом тике?

Есть ли защита от попыток бесполезного изменения позиций/статусов/итд, если позиция не изменилось?

Учтите, что очередь сообщений(все чтения и запись идут через очередь с блокировками) обьектов тесно связана с чартом и запросто может тормозить, если обьем изменений огромен или компьютер слаб.

Как идет работа с обьектами? Смешано ли чтение с записью? Если идет массовый режим читаю/пишу по каждому обьекту, то очередь будет постоянно синхронизироваться, ожидая сброса команд записи, что в разы увеличит задержки. Лучше всего массово читать (если обьектов очень много), а потом писать.
Упростил до невозможности индикатор (нет ни индикаторных буферов, ни построений, ни рисований на графике) - только с приходом тиков отсылаю пользовательские события. Один раз словил "... too slow..". Продолжаю наблюдение...
 

Индикатор при получении события сам генерирует новые события (создает/меняет объекты), и тут же их обрабатывает, это замкнутый круг.

На время отрисовки нужно отключать прием других событий (я делал это с помощью простого флага). 

 
komposter:

Индикатор при получении события сам генерирует новые события (создает/меняет объекты), и тут же их обрабатывает, это замкнутый круг.

На время отрисовки нужно отключать прием других событий (я делал это с помощью простого флага). 

Нет. Я упростил. Индикатор теперь вообще ничего не рисует. Только отсылает события и свои события он не обрабатывает. На выходных, к сожалению, ничего не проверить.
 
barabashkakvn:

Индикатор не имеет индикаторных буферов:

и ничего не считает в OnCalculate():


Это индикатор отображает панель диалога. Тем не менее периодически получаю ошибку "too slow" и индикатор после этого останавливается.

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

Ну а чего вы хотите от такого индикатора?