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

проблемы с остановкой стратегии
Atom
8/24/2010
Serg


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

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

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


Tags:


Thanks:


< 1 2 3  >
Mikhail Sukhov

Avatar
Date: 8/25/2010
Reply


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

Thanks:

Serg

Avatar
Date: 8/25/2010
Reply


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

Thanks:

Mikhail Sukhov

Avatar
Date: 8/25/2010
Reply


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

Thanks:

Serg

Avatar
Date: 8/25/2010
Reply


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

Thanks:

Mikhail Sukhov

Avatar
Date: 8/25/2010
Reply


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

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

Thanks:

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

Avatar
Date: 8/26/2010
Reply


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

Thanks:

Mikhail Sukhov

Avatar
Date: 8/26/2010
Reply


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

Thanks:

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

Avatar
Date: 8/26/2010
Reply


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

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

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

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

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

Thanks:

Mikhail Sukhov

Avatar
Date: 8/26/2010
Reply


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

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

Thanks:

Serg

Avatar
Date: 8/26/2010
Reply


Вот что иногда бывает в лог файле (первые 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;

Thanks:
< 1 2 3  >

Attach files by dragging & dropping, , or pasting from the clipboard.

loading
clippy