Нужна помощь (очередь событий)
Atom Ответить
11.11.2013


Нужна помощь!

Есть код:
Код

//Событие изменения PnL
strategy.PnLChanged += () =>
  {
     x = x + 1;
  };


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

Подскажите как сделать очередь выполнения событий или еще лучше сделать их параллельное вычисление.

Вот нашел пример в интернете:
http://usings.ru/2009/06/22/eventpool/

Заранее спасибо.

Теги:


Спасибо:




8 Ответов
IvanB

Фотография
Дата: 12.11.2013
Ответить


Bond Перейти
Нужна помощь!

Есть код:
Код

//Событие изменения PnL
strategy.PnLChanged += () =>
  {
     x = x + 1;
  };


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

Подскажите как сделать очередь выполнения событий или еще лучше сделать их параллельное вычисление.

Вот нашел пример в интернете:
https://usings.ru/2009/06/22/eventpool/

Заранее спасибо.


В теле обработчика события напишите так:
Код

System.Threading.ThreadPool.QueueUserWorkItem((s) => { 
     x = x + 1;
});

это, грубо говоря, через многопоточность.

Либо попробовать через блокировку:
Код
lock()
{

}

http://msdn.microsoft.co...ru/library/c5kehkcz.aspx
Спасибо:

Bond

Фотография
Курсы
Дата: 12.11.2013
Ответить


Lock не работает. Перебрал все возможные варианты. Может потому что метод только один и он статичный?
В общем не пошло, а первый вариант пока запустить не получается.
Автор топика
Спасибо:

IvanB

Фотография
Дата: 12.11.2013
Ответить


Bond Перейти
Lock не работает. Перебрал все возможные варианты. Может потому что метод только один и он статичный?
В общем не пошло, а первый вариант пока запустить не получается.


Можно на код взглянуть, где этот кусок используется?
Спасибо:

Bond

Фотография
Курсы
Дата: 12.11.2013
Ответить




В циклах перебираются параметры при тестировании. Это еще черновая версия, но рабочая. Когда запускаю по одному трейдеру все нормально. Когда больше, то в стратегиях начинают мешаться значения и не получается их вывести. В общем нет синхронизации.

П.С. Использую циклы по условию для ожилания завершения стратегии и потом только запускаю новую партию стратегий. Есть ли другие более производительные варианты реализации кроме как While? Или и так нормально?
Автор топика
Спасибо:

Bond

Фотография
Курсы
Дата: 12.11.2013
Ответить


Могу всю программу на почту сбросить.
Автор топика
Спасибо:

IvanB

Фотография
Дата: 12.11.2013
Ответить


Bond Перейти


В циклах перебираются параметры при тестировании. Это еще черновая версия, но рабочая. Когда запускаю по одному трейдеру все нормально. Когда больше, то в стратегиях начинают мешаться значения и не получается их вывести. В общем нет синхронизации.

П.С. Использую циклы по условию для ожилания завершения стратегии и потом только запускаю новую партию стратегий. Есть ли другие более производительные варианты реализации кроме как While? Или и так нормально?

С циклом все в порядке.
По поводу подсчета прибыли-убытка. Нужно вынести код вычисления в отдельный метод, примерно так:


И далее его используем так:
Код

//Событие изменения PnL
                            strategy.PnLChanged += () =>
                            {
                                System.Threading.ThreadPool.QueueUserWorkItem((s) =>
                                 {
                                     PnLCalc((MyStrategy)s);
                                          }, strategy);
                            }
Спасибо:

Bond

Фотография
Курсы
Дата: 12.11.2013
Ответить


Попробовал. Не помогло. Тот же фарш из потоков. Прям генератор случайных чисел получился)))
Поменял код. Решил оставить только одну подписку на события. И забираю коллекцию trader.MyTrades. Потом буду ее потрошить.


Попробовал с этой подпиской. Вообще вылетает.




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

П.С. Вылетает ошибка, что IEnumerable<MyTrade> нельзя сериализовать.
"Тип "Ecng.ComponentModel.NotifiableObject" в сборке "Ecng.ComponentModel, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" не помечен как сериализуемый."
Конвертировать в другую коллекцию? Или можно проще решить?
Автор топика
Спасибо:

IvanB

Фотография
Дата: 13.11.2013
Ответить


Bond Перейти
Попробовал. Не помогло. Тот же фарш из потоков. Прям генератор случайных чисел получился)))
Поменял код. Решил оставить только одну подписку на события. И забираю коллекцию trader.MyTrades. Потом буду ее потрошить.


Попробовал с этой подпиской. Вообще вылетает.




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


Тот вариант что я рекомендовал, он должен работать, он работает в многопоточном режиме, т.е. не гарантируется, что порядок обработки вызываемых обработчиков будет соответствовать порядку вызовов. Вот Вы и думаете что получается ерунда. Если хотите работать с многопоточностью, то соответственно, может понадобиться и переделывать логику, которая была реализована как линейная.
Цитата:

П.С. Вылетает ошибка, что IEnumerable<MyTrade> нельзя сериализовать.
"Тип "Ecng.ComponentModel.NotifiableObject" в сборке "Ecng.ComponentModel, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" не помечен как сериализуемый."
Конвертировать в другую коллекцию? Или можно проще решить?

То, что Вы передаете в PnLCalc, я рекомендую объединить в один экземпляр, некоторого класса (нужно создать класс) и этот экземпляр передавать в пул:
System.Threading.ThreadPool.QueueUserWorkItem((s =>
{
...
}), <экземпляр класса с параметрами, объектами>)
и этот экземпляр Вы можете использовать внутри пула, т.е. он передается в тело в виде аргумента:
System.Threading.ThreadPool.QueueUserWorkItem((s =>
{
<используем s, предварительно явно преобразовав его к типу вашего класса>
}), <экземпляр класса с параметрами, объектами>)
Спасибо:


Добавить файлы через драг-н-дроп, , или вставить из буфера обмена.

loading
clippy