Собственно теперь вываливается следующее:
"Попытка чтения или записи в защищенную память. Это часто свидетельствует о том, что другая память повреждена."
Насколько помню, до 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 я не понял до сих пор, а то что во втором фрагменте - это лишь мысли о том как это должно быть и не тестилось даже.
评论 (29)
登录 或 创建账户, 登录或注册以发表评论
У меня все ок. Пример так же не работает?
Пример с той же ошибкой
Приведите полный стек трейс.
Хотел, но что-то до него дело не доходит
Еще как доходит, если кликнуть 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 я не понял до сих пор, а то что во втором фрагменте - это лишь мысли о том как это должно быть и не тестилось даже.