← 返回

Attempted to read or write protected memory.

Михаил, добрый день. Помогите, пожалуйста, найти причину ошибки.

Описание ситуации: периодически, приблизительно раза два в неделю, при работе 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)

登录创建账户, 登录或注册以发表评论

Mikhail Sukhov
Mikhail Sukhov

Квик при этом запущен? Или он так же запускается чуть раньше данного кода?

Maxim
Maxim 作者

Что Вы подразумеваете под словом «запущен»?

Если работает ли сама программа, то да, она параллельно работает, во время того, когда выполняется этот код. Квик соединен с сервером в этот момент.

Если Вы имеете ввиду связана ли библиотека с Квиком, то то же да. Это есть в примере кода: Quik.Connect();

Mikhail Sukhov
Mikhail Sukhov

Maxim: Что Вы подразумеваете под словом «запущен»?

Если работает ли сама программа, то да, она параллельно работает, во время того, когда выполняется этот код. Квик соединен с сервером в этот момент.

Если Вы имеете ввиду связана ли библиотека с Квиком, то то же да. Это есть в примере кода: Quik.Connect();

Я имею ввиду что ошибка вылетает в процессе работы (не утром, когда Квик запускается, ни вечером, когда выключается). Ошибка просто вылетает или она вылетает когда Вы что то в Квике параллельно делаете?

Maxim
Maxim 作者

Ошибка возникает, когда Квик работает в обычном режиме, а я запускаю программу с S#. Ошибка возникает только при старте программы. После того, как ошибка возникла, повторные запуски программы с S# заканчиваются аналогично. Единственный способ запустить программу, это сделать логоф, подождать немного, залогинится и запустить программу.

В то время, когда появляется ошибка я в Квике ничего не делаю.

Mikhail Sukhov
Mikhail Sukhov

Maxim: Ошибка возникает, когда Квик работает в обычном режиме, а я запускаю программу с S#. Ошибка возникает только при старте программы. После того, как ошибка возникла, повторные запуски программы с S# заканчиваются аналогично. Единственный способ запустить программу, это сделать логоф, подождать немного, залогинится и запустить программу.

В то время, когда появляется ошибка я в Квике ничего не делаю.

Я правильно понял, что для того, чтобы робот на S# запустился, вы делаете перелогин в Квике?

Maxim
Maxim 作者

Mikhail Sukhov: Я правильно понял, что для того, чтобы робот на S# запустился, вы делаете перелогин в Квике?

Нет. Не правильно.

Если возникла эта ошибка, то единственный способ (по крайне мере который я знаю) это перелогинится из виндового пользователя. Просто закрыть программу и Квик, а потом все запустить — не помогает.

Повторюсь — ошибка возникает не всегда. Иногда. Из-за этого ее трудно повторить и локализовать.

Mikhail Sukhov
Mikhail Sukhov

Maxim: Если возникла эта ошибка, то единственный способ (по крайне мере который я знаю) это перелогинится из виндового пользователя. Просто закрыть программу и Квик, а потом все запустить — не помогает.

Да, очень странно. У меня было до этого предположение, что порядок меню элементов меняется в процессе работы Квика. А тут совсем другое. Сам Квик нормально работает после этой ошибки?

Maxim
Maxim 作者

В Квике после ошибки я интенсивно не работал. Надо будет проверить.

Но явных косяков в Квике после ошибки не видно.

Mikhail Sukhov
Mikhail Sukhov

Maxim: В Квике после ошибки я интенсивно не работал. Надо будет проверить.

Но явных косяков в Квике после ошибки не видно.

В догонку, выведите QuikTerminal.MainWindow.Title когда вновь появиться такая ситуация.

Maxim
Maxim 作者

QuikTerminal.MainWindow.Title

"[qtest078 UID: 1737] Информационно-торговая система QUIK (версия 5.18.0.239) - [Заявки]"

Получилось добиться повторяемости ошибки.

Как оказалось, ошибка возникает, когда окно «Заявки» развернуто в Квике на весь экран.

Maxim
Maxim 作者

Михаил, получилось ли воспроизвести ошибку? Когда то была похожая проблема: возникала ошибка, если был развернут на все окно график. Ошибка, правда, была какая-то другая, подробности не смог найти в истории форума.

Mikhail Sukhov
Mikhail Sukhov

Maxim: Михаил, получилось ли воспроизвести ошибку?

Вы же привели закономерность. Она не работает?

Maxim
Maxim 作者

Вы же привели закономерность. Она не работает?

Немного не понял вопрос.

Наблюдается баг: если окно заявки развернуто на максимум, то при попытке соединится с Квиком посредсвтом S# возникает исключение: "Attempted to read or write protected memory. This is often an indication that other memory is corrupt.»

Баг не критичный, но хотелось бы его устранить.

Mikhail Sukhov
Mikhail Sukhov

Вы же привели закономерность. Она не работает?

Немного не понял вопрос.

Наблюдается баг: если окно заявки развернуто на максимум, то при попытке соединится с Квиком посредсвтом S# возникает исключение: "Attempted to read or write protected memory. This is often an indication that other memory is corrupt.»

Баг не критичный, но хотелось бы его устранить.

Вопрос в чем? Как воспроизвести багу или как ее устранить?

Maxim
Maxim 作者

Вопрос как его устранить? И считаете ли Вы это багом?

Mikhail Sukhov
Mikhail Sukhov

Maxim: Вопрос как его устранить? И считаете ли Вы это багом?

Устранить - использовать S# 3.0. И да, конечно же это баг.

Maxim
Maxim 作者

Вроде Вас понял. У нас недопонимание получилось.

Надо было спросить, устранен ли этот баг в 3 версии. Насколько я понял из ответа — устранен.

Я только начал переход на 3.0