Михаил, добрый день. Помогите, пожалуйста, найти причину ошибки.
Описание ситуации: периодически, приблизительно раза два в неделю, при работе S# c Квиком возникает ошибка. В остальное время все работает без ошибки.
Описание исключения из дебагера:
ex {"Attempted to read or write protected memory. This is often an indication that other memory is corrupt."}
[System.AccessViolationException] {"Attempted to read or write protected memory. This is often an indication that other memory is corrupt."}
Data {System.Collections.ListDictionaryInternal}
HelpLink null
InnerException null
Message "Attempted to read or write protected memory. This is often an indication that other memory is corrupt."
Source "mscorlib
StackTrace
at System.StubHelpers.ValueClassMarshaler.ConvertToManaged(IntPtr dst, IntPtr src, IntPtr pMT)\r\n
at Ecng.Interop.WinApi.GetMenuItemInfo(IntPtr hMenu, UInt32 uItem, Boolean fByPosition, MenuItemInfo& lpmii)\r\n
at Ecng.Interop.ManagedWinApiHelper.GetMenuItems(IntPtr hMenu, SystemWindow window)\r\n
at Ecng.Interop.SystemMenu..ctor(IntPtr hMenu, SystemWindow window)\r\n
at Ecng.Interop.ManagedWinApiHelper.GetMenu(SystemWindow window)\r\n
at Ecng.Trading.Quik.QuikTerminal.GetAccounts()\r\n
at Ecng.Trading.Quik.QuikTrader.#=qOpBiLK4QqpviIWtcch8OWgvUqP3awIStT7FRqaHhRZY=.#=qCEoE_nVJQF0bssPXr1HgDhv_eIFFIbEByDSR6PGDD1A=()\r\n
at Ecng.Trading.Algo.BaseTrader.ProcessEvents(Action handler)
TargetSite {Void ConvertToManaged(IntPtr, IntPtr, IntPtr)}
Ошибка возникает при исполнении участка кода:
// Подписываемся на событие соединения с квик
Global.Quik.Connected += () =>
{
_waitConnected.Set();
};
// Подписываемся на событие появление портфеля
Global.Quik.NewPortfolios += portfolios =>
{
Portfolio _portfolio = portfolios.FirstOrDefault(p => p.Name == Global.SqlQuikProperty.QuikAccount);
if (_portfolio != null)
{
Global.Portfolio = _portfolio;
_waitPortfolio.Set();
}
};
// Соединяемся с Quik
Global.Quik.Connect();
if (_waitConnected.WaitOne(10000) == false)
throw new Exception("We try connect to Quik, but have reach timeout");
if (_waitPortfolio.WaitOne(10000) == false)
throw new Exception("We try connect to get Portfolio, but have reach timeout");
Более конкретно — ошибка возникает при исполнении вот этой строчки:
if (_waitPortfolio.WaitOne(10000) == false)
При этом ошибка возникает не в выше описанном коде, а ошибка ловится обработчиком события BaseTrader.ProcessDataError
Решить вопрос удается только логофом пользователя, после чего необходимо подождать некоторое время, прежде чем повторно входить под этим пользователем.
评论 (17)
登录 或 创建账户, 登录或注册以发表评论
Квик при этом запущен? Или он так же запускается чуть раньше данного кода?
Что Вы подразумеваете под словом «запущен»?
Если работает ли сама программа, то да, она параллельно работает, во время того, когда выполняется этот код. Квик соединен с сервером в этот момент.
Если Вы имеете ввиду связана ли библиотека с Квиком, то то же да. Это есть в примере кода: Quik.Connect();
Я имею ввиду что ошибка вылетает в процессе работы (не утром, когда Квик запускается, ни вечером, когда выключается). Ошибка просто вылетает или она вылетает когда Вы что то в Квике параллельно делаете?
Ошибка возникает, когда Квик работает в обычном режиме, а я запускаю программу с S#. Ошибка возникает только при старте программы. После того, как ошибка возникла, повторные запуски программы с S# заканчиваются аналогично. Единственный способ запустить программу, это сделать логоф, подождать немного, залогинится и запустить программу.
В то время, когда появляется ошибка я в Квике ничего не делаю.
Я правильно понял, что для того, чтобы робот на S# запустился, вы делаете перелогин в Квике?
Нет. Не правильно.
Если возникла эта ошибка, то единственный способ (по крайне мере который я знаю) это перелогинится из виндового пользователя. Просто закрыть программу и Квик, а потом все запустить — не помогает.
Повторюсь — ошибка возникает не всегда. Иногда. Из-за этого ее трудно повторить и локализовать.
Да, очень странно. У меня было до этого предположение, что порядок меню элементов меняется в процессе работы Квика. А тут совсем другое. Сам Квик нормально работает после этой ошибки?
В Квике после ошибки я интенсивно не работал. Надо будет проверить.
Но явных косяков в Квике после ошибки не видно.
В догонку, выведите QuikTerminal.MainWindow.Title когда вновь появиться такая ситуация.
QuikTerminal.MainWindow.Title
"[qtest078 UID: 1737] Информационно-торговая система QUIK (версия 5.18.0.239) - [Заявки]"
Получилось добиться повторяемости ошибки.
Как оказалось, ошибка возникает, когда окно «Заявки» развернуто в Квике на весь экран.
Михаил, получилось ли воспроизвести ошибку? Когда то была похожая проблема: возникала ошибка, если был развернут на все окно график. Ошибка, правда, была какая-то другая, подробности не смог найти в истории форума.
Вы же привели закономерность. Она не работает?
Немного не понял вопрос.
Наблюдается баг: если окно заявки развернуто на максимум, то при попытке соединится с Квиком посредсвтом S# возникает исключение: "Attempted to read or write protected memory. This is often an indication that other memory is corrupt.»
Баг не критичный, но хотелось бы его устранить.
Немного не понял вопрос.
Наблюдается баг: если окно заявки развернуто на максимум, то при попытке соединится с Квиком посредсвтом S# возникает исключение: "Attempted to read or write protected memory. This is often an indication that other memory is corrupt.»
Баг не критичный, но хотелось бы его устранить.
Вопрос в чем? Как воспроизвести багу или как ее устранить?
Вопрос как его устранить? И считаете ли Вы это багом?
Устранить - использовать S# 3.0. И да, конечно же это баг.
Вроде Вас понял. У нас недопонимание получилось.
Надо было спросить, устранен ли этот баг в 3 версии. Насколько я понял из ответа — устранен.
Я только начал переход на 3.0