Собственно теперь вываливается следующее:
"Попытка чтения или записи в защищенную память. Это часто свидетельствует о том, что другая память повреждена."
Насколько помню, до 4.0.6 было нормально.
Supervisor:
Хотел, но что-то до него дело не доходит
Еще как доходит, если кликнуть Vew Details. В Visual Studio самое главное - это умение производить отладку приложения. Иначе бы ничем не отличалась она от Notepad++ Потратьте неделю на изучение этого аспекта. Сэкономите себе месяцы мучений.
Supervisor:
Хотел, но что-то до него дело не доходит
Еще как доходит, если кликнуть Vew Details. В Visual Studio самое главное - это умение производить отладку приложения. Иначе бы ничем не отличалась она от Notepad++ Потратьте неделю на изучение этого аспекта. Сэкономите себе месяцы мучений.
Спасибо за совет, изучаю всё в процессе работы, пока навыков отладки хватало, вот:
в System.StubHelpers.ValueClassMarshaler.ConvertToManaged(IntPtr dst, IntPtr src, IntPtr pMT)
в Ecng.Interop.WinApi.GetMenuItemInfo(IntPtr hMenu, UInt32 uItem, Boolean fByPosition, MenuItemInfo& lpmii)
в Ecng.Interop.ManagedWinApiHelper.GetMenuItems(IntPtr hMenu, SystemWindow window)
в Ecng.Interop.SystemMenu..ctor(IntPtr hMenu, SystemWindow window)
в Ecng.Interop.ManagedWinApiHelper.GetMenu(SystemWindow window)
в StockSharp.Quik.QuikTerminal.Logout()
в IronTrader.Core.LogoutQuik() в C:\Users\user_197\Desktop\Trader\Trader\Classes\Core.cs:строка 421
в IronTrader.Views.MainWindow.LogoutQuik(Object sender, EventArgs e) в C:\Users\user_197\Desktop\Trader\Trader\Views\MainWindow.xaml.cs:строка 240
в System.Windows.Input.MouseButtonEventArgs.InvokeEventHandler(Delegate genericHandler, Object genericTarget)
в System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target)
в System.Windows.RoutedEventHandlerInfo.InvokeHandler(Object target, RoutedEventArgs routedEventArgs)
в System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
в System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args)
в System.Windows.UIElement.RaiseTrustedEvent(RoutedEventArgs args)
в System.Windows.UIElement.RaiseEvent(RoutedEventArgs args, Boolean trusted)
в System.Windows.Input.InputManager.ProcessStagingArea()
в System.Windows.Input.InputManager.ProcessInput(InputEventArgs input)
в System.Windows.Input.InputProviderSite.ReportInput(InputReport inputReport)
в System.Windows.Interop.HwndMouseInputProvider.ReportInput(IntPtr hwnd, InputMode mode, Int32 timestamp, RawMouseActions actions, Int32 x, Int32 y, Int32 wheel)
в System.Windows.Interop.HwndMouseInputProvider.FilterMessage(IntPtr hwnd, WindowMessage msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
в System.Windows.Interop.HwndSource.InputFilterMessage(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
в MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
в MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)
в System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
в MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler)
в System.Windows.Threading.Dispatcher.InvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs)
в MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)
в System.Windows.Forms.UnsafeNativeMethods.CallWindowProc(IntPtr wndProc, IntPtr hWnd, Int32 msg, IntPtr wParam, IntPtr lParam)
в System.Windows.Forms.NativeWindow.DefWndProc(Message& m)
в System.Windows.Forms.Integration.WindowsFormsHost.ActivateWindowListener.WndProc(Message& m)
в System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
в MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg)
в System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame)
в System.Windows.Threading.Dispatcher.PushFrame(DispatcherFrame frame)
в System.Windows.Application.RunDispatcher(Object ignore)
в System.Windows.Application.RunInternal(Window window)
в System.Windows.Application.Run(Window window)
в System.Windows.Application.Run()
в Trader.App.Main() в C:\Users\user_197\Desktop\Trader\Trader\obj\x86\Debug\App.g.cs:строка 0
в System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
в System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
в Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
в System.Threading.ThreadHelper.ThreadStart_Context(Object state)
в System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
в System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
в System.Threading.ThreadHelper.ThreadStart()
Supervisor:
Хотел, но что-то до него дело не доходит
Еще как доходит, если кликнуть Vew Details. В Visual Studio самое главное - это умение производить отладку приложения. Иначе бы ничем не отличалась она от Notepad++ Потратьте неделю на изучение этого аспекта. Сэкономите себе месяцы мучений.
Спасибо за совет, изучаю всё в процессе работы, пока навыков отладки хватало, вот:
в StockSharp.Quik.QuikTerminal.Logout()
в IronTrader.Core.LogoutQuik() в C:\Users\user_197\Desktop\Trader\Trader\Classes\Core.cs:строка 421
в IronTrader.Views.MainWindow.LogoutQuik(Object sender, EventArgs e) в C:\Users\user_197\Desktop\Trader\Trader\Views\MainWindow.xaml.cs:строка 240
Еще не плохо бы показывать стек трейс по первоначальным ошибкам.
Alexander Mukhanchikov:
Вставил в Quik\Sample\MainWindow.xaml.cs после
this.Trader = new QuikTrader(this.Path.Text);
строчку с подключением:
Trader.Terminal.Login("мой логин", "мой пароль");
>
> всё сработало как надо - подключение произошло.
>
> Как вы модифицировали Sample, что у вас стало падать?
Sample не модифицировал вообще, и на нем точно так же падает. Скрин выше - из моей программы. Возможно какая-то проблема в моем компьютере, позже попробую на других это сделать, отпишусь.
Alexander Mukhanchikov:
Вставил в Quik\Sample\MainWindow.xaml.cs после
this.Trader = new QuikTrader(this.Path.Text);
строчку с подключением:
Trader.Terminal.Login("мой логин", "мой пароль");
> >
> > всё сработало как надо - подключение произошло.
> >
> > Как вы модифицировали Sample, что у вас стало падать?
> Sample не модифицировал вообще, и на нем точно так же падает. Скрин выше - из моей программы. Возможно какая-то проблема в моем компьютере, позже попробую на других это сделать, отпишусь.
Что за Sample использовался?
Где там делается Terminal.Login?
Maxim:
Вопрос как его устранить?
И считаете ли Вы это багом?
Устранить - использовать S# 3.0. И да, конечно же это баг.
Получается этот баг не был исправлен в S# 3.0)
Так или иначе, нашел причину: сделал окно с портфелем на QPILE не на весь экран и все заработало.
Supervisor:
Так или иначе, нашел причину: сделал окно с портфелем на QPILE не на весь экран и все заработало.
Ну вот видите что делает терпение и труд с багами. И сами находятся, и сами устраняются. Кстати, вашу ошибку я нашел через Гугл, который меня привел обратно на S# форум. Заняло буквально 5 минут. Еще 5 минут на чтение топика. Еще 15 минут на эсперименты. Итого, такие проблемы оптимально решать за 25 минут.😉
Такой вопрос - в какой момент меняется состояние QuikTerminal с IsConnected = false на IsConnected =true ?
Просто при вызове terminal.Login(login.pw,server) это состояние вроде как меняется сразу, даже если не получается подключиться. Просто проблема в следующем:
Для квмка есть три сервера, к которым он может подключиться. На момент запуска робота два из трех серверов заняты, но робот не знает какие именно. Он пытается перебрать все три сервера примерно так:
if (!terminal.IsConnected)
{
var adresses = terminal.Addresses;
foreach (var ipEndPoint in adresses)
{
terminal.Login(login, password, ipEndPoint);
if (terminal.IsConnected) break;
}
}
Но так не получается, потому что на после terminal.Login() terminal.IsConnected всегда получается true в не зависимости от результата подключения. Не подскажите куда копать надо ?
Спасибо.
Александр, вдогонку еще один похожий вопрос по запуску. Такой трабл - если запускать терминал из программы с помощью метода QuikTerminal.Launch() событие IsLaunched остается в состоянии false. Но стоит его запустить его с рабочего стола или из проводника, то все ок - событие возвращает true. Подскажите в чем может быть глюк? Не, конечно можно из программы и запуск из проводника сымитировать, просто мож вы знаете в чем дело и удастся это сделать культурно?
Система Win7.
Mach342:
Александр, вдогонку еще один похожий вопрос по запуску. Такой трабл - если запускать терминал из программы с помощью метода QuikTerminal.Launch() событие IsLaunched остается в состоянии false. Но стоит его запустить его с рабочего стола или из проводника, то все ок - событие возвращает true. Подскажите в чем может быть глюк? Не, конечно можно из программы и запуск из проводника сымитировать, просто мож вы знаете в чем дело и удастся это сделать культурно?
Система Win7.
Зачем вам IsLaunched?
Посмотрите на SystemProcess и SystemProcess.HasExited под дебагом. Чему они равны?
Здравствуйте !
QuikTerminal.IsConnected выставляется в true, если окно сообщений содержит хотя бы одну (не важно какую) запись. Это утверждение истинно или ложно ?
Если ложно, не могли бы вы сказать как Quikterminal узнает, IsConnected он или нет ?
Спасибо.
Maxim K.:
Здравствуйте !
QuikTerminal.IsConnected выставляется в true, если окно сообщений содержит хотя бы одну (не важно какую) запись. Это утверждение истинно или ложно ?
Если ложно, не могли бы вы сказать как Quikterminal узнает, IsConnected он или нет ?
Спасибо.
Alexander Mukhanchikov:
Зачем вам QuikTerminal.IsConnected?
Я уже писал, но повторюсь:
Роботу периодически необходимо запускать другие квики, помимо одного основного, к которому он всегда подключен и с которого получает все необходимые данные. после запуска квика, необходимо его подключить. И вот тут возникает проблема: В этих квиках, по мимо робота, могут еще и люди работать, но на других компьютерах. В квике есть три сервера, и какой из них свободен заранее не известно. Сейчас я сделал так: перебираю все возможные сервера и остаюсь на том, к которму первым подключились. Сделал так:
foreach (var ipEndPoint in adresses)
{
terminal.Login(login, password, ipEndPoint);
while (terminal.GetMessages() == null) ;
var msg = terminal.GetMessages();
if (!(msg.Last().Contains("error") || msg.Last().Contains("уже")))
{
break;
}
}
Вы предлагаете сделать так:
foreach (var ipEndPoint in adresses)
{
terminal.Login(login, password, ipEndPoint);
var trader = new QuikTrader{Path = path, DdeServer = "ANOTHERDDESERVER", DllName="TRANS2QUIK1.DLL"};
bool f = false;
trader.ConnectionError+=error=>{f=true;};
trader.Connected+=()=>{f=true; };
trader.Connect();
while(!f);
if(trader.IsConnected)break;
}
То есть если терминал не подключен к серверу, мы создаем трейдера и пишем trader.Connect(), потом смотрим trader.IsConnected - он должен быть false. Если же терминал подключен, то при таких же условиях trader.IsConnected будет true. Так ?
Да, я в курсе, потому что он не совсем адекватно работает на мой взгляд - в случае если сервер занят и подключиться не удалось, он будет выставлен в true, хотя долден быть false. первый фрагмент кода - это кривой костыль, временно приделанный чтобы хоть как то работало. Как использовать QuikTrader.IsConnected я не понял до сих пор, а то что во втором фрагменте - это лишь мысли о том как это должно быть и не тестилось даже.
We use cookies to ensure the best experience on our website. By continuing to use our site, you agree to the use of cookies.
Comments (29)
Login or Create account, Log in or register to leave a comment
У меня все ок. Пример так же не работает?
Пример с той же ошибкой
Приведите полный стек трейс.
Хотел, но что-то до него дело не доходит
Еще как доходит, если кликнуть Vew Details. В Visual Studio самое главное - это умение производить отладку приложения. Иначе бы ничем не отличалась она от Notepad++ Потратьте неделю на изучение этого аспекта. Сэкономите себе месяцы мучений.
в StockSharp.Quik.QuikTerminal.Logout() в IronTrader.Core.LogoutQuik() в C:\Users\user_197\Desktop\Trader\Trader\Classes\Core.cs:строка 421 в IronTrader.Views.MainWindow.LogoutQuik(Object sender, EventArgs e) в C:\Users\user_197\Desktop\Trader\Trader\Views\MainWindow.xaml.cs:строка 240
http://stocksharp.com/forum/1331/Attempted-to-read-or-write-protected-memory/
Нужно всю ветку прочитать.
Вставил в Quik\Sample\MainWindow.xaml.cs после this.Trader = new QuikTrader(this.Path.Text); строчку с подключением:
всё сработало как надо - подключение произошло.
Как вы модифицировали Sample, что у вас стало падать?
Trader.Terminal.Login("мой логин", "мой пароль");
Trader.Terminal.Login("мой логин", "мой пароль");
Да, ошибка одинаковая по обоим методам, вот по логину:
Ну вот видите что делает терпение и труд с багами. И сами находятся, и сами устраняются. Кстати, вашу ошибку я нашел через Гугл, который меня привел обратно на S# форум. Заняло буквально 5 минут. Еще 5 минут на чтение топика. Еще 15 минут на эсперименты. Итого, такие проблемы оптимально решать за 25 минут.😉
Будет фикс в 4.0.11 Поломалось из-за перехода на .Net 4.0
Такой вопрос - в какой момент меняется состояние QuikTerminal с IsConnected = false на IsConnected =true ? Просто при вызове terminal.Login(login.pw,server) это состояние вроде как меняется сразу, даже если не получается подключиться. Просто проблема в следующем: Для квмка есть три сервера, к которым он может подключиться. На момент запуска робота два из трех серверов заняты, но робот не знает какие именно. Он пытается перебрать все три сервера примерно так:
Но так не получается, потому что на после terminal.Login() terminal.IsConnected всегда получается true в не зависимости от результата подключения. Не подскажите куда копать надо ? Спасибо.
Не так. QuikTerminal.IsConnected - это если что-то есть в статус баре в квике, тогда считаем что как минимум подключаемся
лучше смотреть на QuikTrader.IsConnected он смотрит совсем другое и как раз то, что нужно
Александр, вдогонку еще один похожий вопрос по запуску. Такой трабл - если запускать терминал из программы с помощью метода QuikTerminal.Launch() событие IsLaunched остается в состоянии false. Но стоит его запустить его с рабочего стола или из проводника, то все ок - событие возвращает true. Подскажите в чем может быть глюк? Не, конечно можно из программы и запуск из проводника сымитировать, просто мож вы знаете в чем дело и удастся это сделать культурно? Система Win7.
Зачем вам IsLaunched?
Посмотрите на SystemProcess и SystemProcess.HasExited под дебагом. Чему они равны?
Здравствуйте ! QuikTerminal.IsConnected выставляется в true, если окно сообщений содержит хотя бы одну (не важно какую) запись. Это утверждение истинно или ложно ? Если ложно, не могли бы вы сказать как Quikterminal узнает, IsConnected он или нет ? Спасибо.
Зачем вам QuikTerminal.IsConnected? Используйте QuikTrader.IsConnected
Вот для QuikTerminal:
Вы предлагаете сделать так:
Или что-то наподобии. Я правильно понял ?
Выкину этот метод в 4.1 от греха подальше, он нафиг не нужен.
То есть если терминал не подключен к серверу, мы создаем трейдера и пишем trader.Connect(), потом смотрим trader.IsConnected - он должен быть false. Если же терминал подключен, то при таких же условиях trader.IsConnected будет true. Так ?
QuikTerminal.IsConnected не используется ни в первом, ни во втором участке кода
Да, я в курсе, потому что он не совсем адекватно работает на мой взгляд - в случае если сервер занят и подключиться не удалось, он будет выставлен в true, хотя долден быть false. первый фрагмент кода - это кривой костыль, временно приделанный чтобы хоть как то работало. Как использовать QuikTrader.IsConnected я не понял до сих пор, а то что во втором фрагменте - это лишь мысли о том как это должно быть и не тестилось даже.