Ошибка с логами
Atom Ответить
26.09.2011


Вот код:
Код
        private void OnLogUpdate(ErrorTypes err, string message)
        {
            this.Log(new LogMessage(this, DateTime.Now, err, message));
        }
        
        public T400()
        {            
            plaza = new PlazaTrader(this.StrategyParameters.PlazaRouterPath.To<IPEndPoint>());
            this.candleManager = new CandleManager(plaza);
            logManager = new LogManager();
            logManager.Sources.Add(this);
        }

T400 это робот, по сути класс-инфраструктура для запуска стратегии, чтобы он тоже мог писать логи реализуется ILogSource.
На старте робота выполняется:
Код
guiLogListener = new GuiLogListener(_logWindow);
t400.AddLogListener(guiLogListener);

Потом, при выполнении OnLogUpdate ошибка: [System.ArgumentNullException] = {"Значение не может быть неопределенным.\r\nИмя параметра: obj"}
Вот стэктрэйс:
в Ecng.Xaml.XamlHelper.GuiSync(DispatcherObject obj, Action action)
в StockSharp.Xaml.GuiLogListener.OnWriteMessage(LogMessage message)
в StockSharp.Algo.Logging.LogListener.WriteMessage(LogMessage message)
в StockSharp.Algo.Logging.LogManager.#=qrUj$Ns0mMAxxqh0k0FFJLB8wrKr4pz7DsmdCpRVKh18=.#=q3S_X0XbExHKU68uzjbFQVxw4VT4yOdgZvBt8Dr1nZXc=(ILogListener #=qeUzjoy2OxlhpLB1gDjK5qQ==)
в Ecng.Collections.CollectionHelper.ForEach[T](IEnumerable`1 source, Action`1 action)
в StockSharp.Algo.Logging.LogManager.#=qm2awVrrxMn_7KT6KAHw0Wg==(LogMessage #=qJiXkieLb13i$V63GpKExqw==)
в Skynet.T400.OnLogUpdate(ErrorTypes err, String message)

Собственно вопрос: что передается в GuiSync в качестве DispatcherObject и почему все ломается.
Второй вопрос: как правильно в такой ситуации реализовать ILogSource, кто будет Parent, кто Childs, и зачем там Guid?

P.S. Ошибка появилась оч недавно, после последнего обновления референсов

Теги:


Спасибо:




16 Ответов
Alexander

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


Guid пропишите Guid.NewGuid() в конструкторе
остальное верните null

Посмотрите это ради примера
Спасибо:

FiNick

Фотография
Благотворитель
Дата: 27.09.2011
Ответить


Короче это бага в последней сборке похоже.
Если переменная _logWindow имеет тип MonitorWindow то все прекрасно работает, если тип LogWindow то ломается. Странно, ведь LogWindow тоже является DispatcherObject'ом. Я исходников StockSharp.Xaml не имею, потому посмотреть что там не могу.
Автор топика
Спасибо:

Alexander

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


FiNick Перейти
Короче это бага в последней сборке похоже.
Если переменная _logWindow имеет тип MonitorWindow то все прекрасно работает, если тип LogWindow то ломается. Странно, ведь LogWindow тоже является DispatcherObject'ом. Я исходников StockSharp.Xaml не имею, потому посмотреть что там не могу.


LogWindow не наследует ILogListener
Спасибо:

FiNick

Фотография
Благотворитель
Дата: 27.09.2011
Ответить


Alexander Перейти
LogWindow не наследует ILogListener

Правильно, но его наследует GuiLogListener. У меня написано
Код
guiLogListener = new GuiLogListener(_logWindow);
logManager.Listeners.Add(guiLogListener);

Конструктор GuiLogListener принимает типы LogControl, LogWindow, MonitorWindow, это собственно окна, которые будут отображать логи. Раньше с LogWindow все работало, теперь нет.
Ошибка возникает в рантайме, возможно так какое-нибудь явное преобразование типов стоит, обычно оно такие ошибки дает.
Автор топика
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 27.09.2011
Ответить


FiNick Перейти
Ошибка возникает в рантайме, возможно так какое-нибудь явное преобразование типов стоит, обычно оно такие ошибки дает.


В последней версии ошибка. Исправил в ближайшее время.
Спасибо:

FiNick

Фотография
Благотворитель
Дата: 28.09.2011
Ответить


Там еще одна ошибка есть жесткая: при попытке отключится прога зависает намертво. Я выяснил что это именно связано с логгированием. То есть, если не подключать логгирование
Код
guiLogListener = new GuiLogListener(_logWindow);
logManager.Listeners.Add(guiLogListener);
то все норм отключается
Автор топика
Спасибо:

FiNick

Фотография
Благотворитель
Дата: 28.09.2011
Ответить


Поправка:
Если перед отключением от плазы сделать logManager.Sources.Remove(t400); то все нормально становится.
Видимо дело в том, как я реализовал ILogSource у T400
Код
        #region ILogSource Members
        public event Action<LogMessage> Log;
        
        public string Name
        {
            get { return "T400"; }
        }
        
        public Ecng.Collections.INotifyList<ILogSource> Childs
        {
            get { return null; }
        }

        public Guid Id
        {
            get { return Guid.NewGuid(); }
        }

        public ILogSource Parent
        {
            get { return null; }
        }

        #endregion
Автор топика
Спасибо:

Alexander

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


FiNick Перейти
Код
public Guid Id
{
    get { return Guid.NewGuid(); }
}


Каждый раз будет создаваться новый Guid.
Сделайте в конструкторе Id = Guid.NewGuid() и оставьте set; get; по умолчанию.
Спасибо:

FiNick

Фотография
Благотворитель
Дата: 28.09.2011
Ответить


Alexander Перейти
Сделайте в конструкторе Id = Guid.NewGuid() и оставьте set; get; по умолчанию.


Не помогло=(
Автор топика
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 28.09.2011
Ответить


FiNick Перейти
Alexander Перейти
Сделайте в конструкторе Id = Guid.NewGuid() и оставьте set; get; по умолчанию.


Не помогло=(


Подозреваю, что ошибка не в S#.
Спасибо:

FiNick

Фотография
Благотворитель
Дата: 28.09.2011
Ответить


Я вроде как понял:
Код
this.Trader.Disconnected += Trader_Disconnected;
void Trader_Disconnected()
{
     this.Log(new LogMessage(this, DateTime.Now, ErrorTypes.None, "Disconnected"));
}

Проблема в том, что Log вызывается не GuiAsync. Я впринципе не могу вызвать его GuiAsync, т.к. это функция для некоторого DispatcherObject, окна тоесть, а я обрабатываю внутри T400.

Я реализовывал ILogSource для MainWindow, та же проблема возникает. Но если написать так
Код
void Trader_Disconnected()
        {
            this.GuiAsync(() => this.Log(new LogMessage(this, DateTime.Now, ErrorTypes.None, "  ")));

            //this.Log(new LogMessage(this, DateTime.Now, ErrorTypes.None, "  "));    Так не работает
        }

то все норм.
Автор топика
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 28.09.2011
Ответить


ILogListener все тот же? Тогда это тянется отсюда же https://stocksharp.ru/posts/m/11605/
Спасибо:

FiNick

Фотография
Благотворитель
Дата: 28.09.2011
Ответить


Mikhail Sukhov Перейти
ILogListener все тот же? Тогда это тянется отсюда же https://stocksharp.ru/posts/m/11605/

Да, то же самое, T400 реализует ILogListener. в качестве _logWindow используется MonitorWindow (потому что с LogWindow не работает пока).

В прикрепленном файле посмотрите, эта ошибка с зависанием реализована для MainWindow из примера SimpleGUI.
MainWindow.xaml.cs 10,6KB (0)
Автор топика
Спасибо:

FiNick

Фотография
Благотворитель
Дата: 30.09.2011
Ответить


После последнего обновления StockSharp.Algo первая ошибка с LogWindow решилась. Проблема с зависанием осталась.
Автор топика
Спасибо:

Mikhail Sukhov

Фотография
Автор статей Программист Трейдер
Дата: 30.09.2011
Ответить


FiNick Перейти
После последнего обновления StockSharp.Algo первая ошибка с LogWindow решилась. Проблема с зависанием осталась.


А зависание от чего происходит?
Спасибо:

FiNick

Фотография
Благотворитель
Дата: 30.09.2011
Ответить


Mikhail Sukhov Перейти
FiNick Перейти
После последнего обновления StockSharp.Algo первая ошибка с LogWindow решилась. Проблема с зависанием осталась.


А зависание от чего происходит?


Зависание возникает при вызове лога в момент дисконнекта:
Код
        void Trader_Disconnected()
        {
            //this.GuiAsync(() => this.Log(new LogMessage(this, DateTime.Now, ErrorTypes.None, "  "))); //Так не зависает

            this.Log(new LogMessage(this, DateTime.Now, ErrorTypes.None, "  "));    //Так зависает
        }

Причем если обернуть GuiAsync, то не зависает. Это оочень странно, т.к. вроде как внутри GuiLogListener вызов лога оборачивается в GuiAsync автоматически.
Автор топика
Спасибо:


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

loading
clippy