проблемы с остановкой стратегии
Atom
24.08.2010


где-то в программе пытаюсь остановить стратегию
if (strat.ProcessState == StrategyProcessStates.Stopped)
strat.Start();
else
strat.Stop();

... в моей производной стратегии от Strategy ...
protected override void OnStopping()
{
Trader.QuotesChanged -= _trader_QuotesChanged;
}

после выхода из этого метода программа зависает(чаще чем не виснет) по
непонятным для меня причинам.
Если кто сталкивался подскажите в чем может быть проблема?
спс

Теги:


Спасибо:


< 1 2 3  >
Mikhail Sukhov

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


А как часто вызывается Log событие? Invoke - это ведь синхронизация с
ГУИ потоком. Может быть фишка в том, что все время уходит на эту саму
синхронизацию?

Спасибо:

Serg

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


вызывается минимум раз в секунду, а то и чаще. пробую обновлять данные
порциями - не очень информативно.
видимо нужно придумать прокладку между гуи и логгированием. хотя по
сути логи нужны лишь при тестировании.
Спасибо:

Mikhail Sukhov

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


А если писать в файл?

Спасибо:

Serg

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


в файл пишу через StategyLogger все норм. но если часто писать то
бывает что строки одна на другую вылазят) А как обстоят дела с wpf и
LogWindow? там таких проблем нет?
Спасибо:

Mikhail Sukhov

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


Строки вылазят одна на другую - это как?

В LogWindow может быть чуть шустрее, за счет того, что он не
конкатенирует текст в контроле, а используется ListView. Попробуйте,
может и хватит скорости. А вообще вариант напрашивается писать в некую
очередь, из которой ГУИ поток выгребает данные и отображает на форме.

Спасибо:

Иванов Андрей

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


Думаю, это когда несколько потоков параллельно пишут в один файл.

Спасибо:

Mikhail Sukhov

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


А что с ними произойдет? Будут разрыва в строчках? Или просто строчки
будут идти одна за другой но из разных стратегий?

Спасибо:

Иванов Андрей

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


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

Разрывы в строках да, могут быть. Может быть перемешано. Это в лучшем
случае =) А в худшем можно получить мусор, потому что StreamWriter не
тредсейфовый и можно поломать его состояние. Но такое получить
непросто, надо высокую concurrency иметь, чтобы постоянно ловить.

Лечится просто.
private object _syncRoot; // вместо этого можно использовать любой
reference type филд

lock(_syncRoot)
{
_writer.WriteLine("{0:T} {1}", DateTime.Now, message);

Вряд ли синхронизация спасёт автора темы, но с логом всё будет
нормально.

Спасибо:

Mikhail Sukhov

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


Да, почитал про StreamWriter. Не все так хорошо. Заодно наткнулся на
интересный методhttp://msdn.microsoft.com/en-us/library/system.io.textwriter.synchronized.aspx

Думаю будет элегантнее, чем вводить в коде свой маркер.

Спасибо:

Serg

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


Вот что иногда бывает в лог файле (первые 5 строк):

S S 12:33:36.0820929 working
0820929 S запущена.
S запуS 12:33:36.0977180 working
S 12:33:36.0977180 working
S 12:33:36.1133431 working

а в OnProcess сделано так:
protected override bool OnProcess()
{
if (this.ProcessState == StrategyProcessStates.Stopping)
return false;

int inUse = Interlocked.CompareExchange(ref _inUse, 1, 0);
if (inUse == 0)
{
try
{
AddLog(StrategyErrorStates.Error, /
*DateTime.Now.ToString("H:mm:ss:fff") + */" working", this);
AddLog(StrategyErrorStates.None, /
*DateTime.Now.ToString("H:mm:ss:fff") + */" working", this);
AddLog(StrategyErrorStates.Warning, /
*DateTime.Now.ToString("H:mm:ss:fff") + */" working", this);
}
finally
{
Interlocked.Exchange(ref _inUse, 0);
}
}
return true;
}
а интервал стратегии this.Interval = TimeSpan.Zero;

Спасибо:
< 1 2 3  >

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

loading
clippy