Периодичность обработки событий

 

Друзья, подскажите кто в курсе как обрабатываются события в эксперте.

К примеру я использую 2 события - онтик и онтаймер. В процессе выполения онтик сработал онтаймер, но событие онтик ещё не закончилось. Что делает эксперт? Он хранит все события в каком либо месте(стеке) или же игнорирует все другие события, если текущее ещё в процессе выполнения? Если посмотреть глобально то я подозреваю что существует следующие варианта их обработки:

1 - все события выполняются последовательно, в порядке их очередности. При наложении их друг на друга, последнее просто игнорируется, так как выполняется предыдущее.
2 - все события выполняются последовательно, но при наложении ничего не отбрасывается, а складируется в некий стек и выполняется тогда когда закончится выполнение текущего события (возможно переполнение стека?)
3 - события могут выполнятся параллельно, но тогда возникает вопрос их синхронизации
4 - неведомый мне вариант 

Сейчас же у меня творится вообще что то непонятное: Приходит событие онтик, в конце которого у меня стоит Comment, с выводом пары переменных на экран. Онтик считается долго, порядка 30 секунд, но уже секунд через 10 срабатывает Comment() c нулевыми значениями переменных, и только потом, ещё секунд через 10 появляются значения переменных. Хотя по логике Comment должен появится в конце события с уже рассчитанными значениями. И всё это в одном событии. Онтаймер пока отключил, боюсь даже включать его.

 
Alexey Oreshkin:

Сейчас же у меня творится вообще что то непонятное: Приходит событие онтик, в конце которого у меня стоит Comment, с выводом пары переменных на экран. Онтик считается долго, порядка 30 секунд, но уже секунд через 10 срабатывает Comment() c нулевыми значениями переменных, и только потом, ещё секунд через 10 появляются значения переменных. Хотя по логике Comment должен появится в конце события с уже рассчитанными значениями. И всё это в одном событии. Онтаймер пока отключил, боюсь даже включать его.

Это вам не алгоритмический подход, который изжил себя ещё в 70-е годы прошлого столетия. Нынче всё хозяйство с выводом информации буферировано и распределено по разным потокам, да ещё и с разными приоритетами, а посему синхронность не всегда достижима. Поэтому не стоит удивляться, что порядок, заданный в алгоритме не обязательно будет соблюдаться при выводе информации.
 
Yury Reshetov:
Это вам не алгоритмический подход, который изжил себя ещё в 70-е годы прошлого столетия. Нынче всё хозяйство с выводом информации буферировано и распределено по разным потокам, да ещё и с разными приоритетами, а посему синхронность не всегда достижима. Поэтому не стоит удивляться, что порядок, заданный в алгоритме не обязательно будет соблюдаться при выводе информации.
Надо же, любопытно как. Ну это ладно, буду знать. Работе не мешает просто интересно. А с первым вопросом как, что с периодичностью обработки разных событий?
 
Alexey Oreshkin:

Друзья, подскажите кто в курсе как обрабатываются события в эксперте.

К примеру я использую 2 события - онтик и онтаймер. В процессе выполения онтик сработал онтаймер, но событие онтик ещё не закончилось. Что делает эксперт?

Если речь идет об одном эксперте, то это, по идее, должен быть один поток. Поэтому обрабатывать события он должен последовательно. То есть в этом случае обработчик OnTimer не будет выполнен до окончания обработки OnTick. События будут обрабатываться в порядке поступления. Единственное, о чем постоянно говорят разработчики, так это то, что при обработке одного OnTick до момента его окончания все последующие OnTick игнорируются.

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

 

да, я говорю о событиях внутри одного советника. Ок. Благодарю. Я так и думал, но мало ли, иногда лучше спросить чем промолчать )

И если я дальше мыслю также правильно то у нас есть всего две возможности самостоятельно распараллелить вычисления: 1 - закинуть робота в длл, использую мкл просто как поставщик тиков и уже в VS всё сделать, либо использовать OpenCL ?

 
Вообще-то, хотелось бы заслушать начальника транспортного цеха. Чтобы было кого .. на кого ссылаццо в смысле
 
События выполняются последовательно. Это легко можно проверить самому вот таким кодом: 
int OnInit()
  {
   EventSetTimer(1);      
   return(INIT_SUCCEEDED);
  }

void OnTick()
  {
      Print("Начало");
      int tm=TimeCurrent();
      while(true) if (TimeCurrent()-tm>=3) break;         
      Print("Конец. Прошло не менее 3 секунд");
      ExpertRemove();
  }

void OnTimer()
  {
      Print("Таймер");
  }
 
А в таймер аналогичный тормоз вставить не пробовали? Т.е. у них одинаковый приоритет исполнения?
 
Alexander Puzanov:
А в таймер аналогичный тормоз вставить не пробовали? Т.е. у них одинаковый приоритет исполнения?

Грамотная мысль. Как то сам сразу не догадался.

int OnInit()
  {
   EventSetTimer(1);      
   return(INIT_SUCCEEDED);
  }

void OnTick()
  {
      Print("Тик");
  }

void OnTimer()
  {
      Print("Начало. Таймер");
      int tm=TimeCurrent();
      while(true) if (TimeCurrent()-tm>=3) break;         
      Print("Конец. Прошло не менее 3 секунд");
      ExpertRemove();      
  }
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
      Print("OnChartEvent");
  }  

 Результат тот же. Заодно проверил и событие ончартэвент. Честно говоря я думал оно должно быть параллельно, а тут оказалось тоже нет. Вообщем вывод простой - все события выполняются последовательно, те кто не попал в очередь - игнорируются. По крайней мере в мкл4.

Причина обращения: