Уважаемые разработчики!
Quik 6.02, 6.3
В S# 4.1.2, 4.1.3(rev 18591) стабильно подвисает OnProcess если делаю вызовы в GUI.
Схема такая:
- TimeFrameStrategy c интервалом 50ms.
- В OnProcess делаются расчеты и результат показывается в GUI через вызов в MainWindow.Instance.GuiAsync где делается апдейт а-ля TextField = value.
При прохождении от 1000 до 10000 циклов все подвисает. Если вызовы в GUI закомментировать стратегия не виснет.
Еще она зависает периодически после вызовов addLog...
В 3.x, 4.0, 4.1 стратегии пахали весь тороговый день с 10.00 до 23.50 без проблем.
С чем это может быть связано, что можете посоветовать?
Comments (16)
Login or Create account, Log in or register to leave a comment
Поизучать стек трейсы на предмет дедлоков.
А нету трейсов в моем роботе. Все треды от S#, в них стэк не кажется...
У меня код не менялся... А что вы поменяли в тредах начиная с 4.1.2?
Лочится еще при вызове логгинга из TimeFrameStrategy.Process в ConsoleLogListener. В моем коде нет никаких Wait'ов, Sleep'ов и т.д. У меня не начем лочиться. Похоже это нутро S# лочится...
Вот картинка с тредами, но стек трейса ни у одного не достать:
Как дебажить дальше?
P.S.
может быть имеет смысл давать имя тредам по имени стратегий, кот. они вызывают?Понял, что на каждый вызов OnProcess из пула берется новый тред.Да подобная беда была у меня как-то раз именно из за дедлоков. Лочилось окошко лога и дальше весь поток тоже лочился.
на чем оно лочилось, как избавились?
Ну там длинная замута была достаточно. Чисто в коде моего коннектора. http://stocksharp.com/forum/2464/Blokirovaniie-potoka-v-mietodie-AddInfoLog/
В итоге разобрались или нет? Если нет - попробуйте пустой OnProcess только с работой с gui.
Не разобрался. Если в трейсах нет моего кода как мне разобраться?
Пока, действительно, остается минизировать кейс.
В трейсах всегда должен быть код. В т.ч. и ваш. Думаю не там смотрите.
Я смотрю закладку Threads. А потом для всех тредов смотрю Call Stack. Ничего нет. Если в OnProcess поставлю Sleep и нажму на паузу - тогда в стеке есть мой код.
Буду благодарен, если расскажете что я делаю не так и как правильно. Я вообще java developer, а C# по аналогии юзаю :)
На вкладке с тредами, где написан статус треда, тыкнуть на стрелочку вниз и развернется последовательность вызовов. То есть что было вызвано до текущего лока. Вот собственно если посмотреть эти последовательности, можно определить где собственно затык случился.
ПС: судя по тому что вижу, каждый стакан по инструменту прет в отдельном треде, это интересно.
Ну именно так я и делал. [External Code] было мне ответом...)
Экспресс версия студии чтоли? Тока в ней все порезано почикано, что ничего не сделать толком.
Нормальная студия. Когда я ставлю брейк или Sleep в своем коде, то показывыется стек с вызовами в моем коде на одном из тредов. На всех остальных [External Code].
Когда все подвисает как я описал в самом начале, на всех тредах наблюдаю [External Code].
Вообще даже если код не собственный стек показывается. Включая стокшарп вызовы. Тока так крякозябры. Режим дебаг? Я даж не знаю что предположить :)
А вот это была очень полезная информация. Я просто об этом не знал :) Спасибо!
Сразу нарыл решение на stackoverflow:
Go into Tools | Options | Debugging | General, and uncheck the "Enable Just My Code" checkbox. Now Visual Studio will show the full call stack (at least for managed code, you still may see some "native to managed transitions" in there).