Пробую подключение к Quik и запуск DDE из примеров (Sample, SampleSMA). Все происходит очень медленно, поискал по форуму, есть несколько сообщений с такими же проблемами. Железо вроде не самое слабое (Phenom II X2 555/8Gb/SSD), система Windows 7 Ultimate 64bit. Запускаются Quik и примеры от имени администратора. Хотелось бы все-таки с помощью Михаила докопаться до возможных причин таких тормозов.
В связи с этим первый вопрос:
после установки соединения с Квиком через QuikTrader.Connect() и поступления события Connected секунд где-то через 10 в Квике появляется окно "Выбор активных счетов и задание их очередности", которое висит и пропадает где-то через 30 секунд.
Так и должно быть?

Вот код этого консольного приложения:
Console.WriteLine("Запуск...");
try
{
var waitHandle = new AutoResetEvent(false);
// создаем шлюз к Quik-у
var trader = new QuikTrader(@"C:\FinamJunior\info.exe");
// подписываемся на событие успешного подключения
// все действия необходимо производить только после подключения
trader.Connected += () =>
{
Console.WriteLine("Подключение было произведено успешно.");
// извещаем об успешном соединени
waitHandle.Set();
};
Console.WriteLine("Производим подключение...");
trader.Connect();
// дожидаемся события об успешном соединении
waitHandle.WaitOne();
Console.ReadKey();
trader.Dispose();
}
catch (Exception ex)
{
Console.WriteLine(ex);
Console.ReadKey();
}
评论 (59)
登录 或 创建账户, 登录或注册以发表评论
у меня тож примерно так же . секунд 10-30, иногда пошустрей иногда помедленней
Тоже наблюдаю.
По этому поводу уже была дискуссия - подобное наблюдается только на Windows 7 (как 32bit, так и 64bit) и связано именно со стартом DDE в этой операционной системе (под Windows XP всё моментально).
Если я не ошибаюсь, то: Из окна "Выбор активных счетов и задание их очередности" экспортируются все текущие счета в квике и задаются портфели. Данный экспорт запускается подленным и его медлительность также связаны с особенностью работы Квика в Windows 7.
Ну до старта DDE еще не дошло дело. Если я правильно понимаю, то приложение сначала ждет появления окна "Выбор активных счетов и задание их очередности" и после его появления должно программно нажать кнопку "Да". Но почему оно это делает так медленно?
Похоже медленное подключение к Квику и запуск ДДЕ происходит из-за множества открытых окон программ (в моем случае Internet Explorer-а с кучей вкладок в каждой), чем их больше, тем медленнее идет процесс. Сейчас запущен только Google Chrome с 30-ю вкладками и сам Квик, соединение и запуск ДДЕ происходит за 16 секунд вместо 4 минут...
Не смотрел еще причину, но думаю что и да и нет. S# использует поиск окон (что само по себе не быстрый процесс). Возможно в Win7 это работает медленнее, так как безопасность все время расширяется, а ее расширение постепенно подминает и производительность.
На следующей неделе я постараюсь с этим разобраться. Но сразу оговорюсь, ждать чуда не стоит. Если это можно поправить моими силами и в самом S#, я это сделаю. Иначе, увы.
Решил написать свои изыскания:
на одном форуме читал про проблему, что GetPixel стал работать в десятки раз медленнее на Win7 по сравнению с Win XP. Человеку надо было читать цвет пикселей игрушки, запущенной в браузере. В итоге он разобрался и написал следущее:
"если получать пиксель используя хэндл рабочего стола (или контекст ус-ва, связанный с раб. столом в случае с GetPixel()), то тупит , если использовать например хэндл браузера, то работает быстро. Вот такая вот магия... "
Михаил, возможно из этого вы по аналогии сможете решить проблему долгого поиска окон на Win7: брать Handle от окна Quik для поиска таблиц.
Очень бесит сидеть на XP только из-за экспорта по DDE 🤨...Михаил можно ли выложить кусок чек кода, который запускает экспорт какой-нить таблицы с при менением поиска окон?- Может совместными усилиями получится нагуглить причину тормозов.
Давно под 7кой пробовали? :) Относительно недавно был фикс, у меня сейчас работает реально шустро.
У меня на рабое семерка(работает в домене), дома виста, и есть комп с XP еще, поэтому есть возможность сравнивать: W7- я плачу Vista - в депрессии XP - Летает
Особенно поражает разница в скорости работы верифаера... В XP он как на межгалактической станции отрабатывает, а в W7 или Vista гораздо медленнее. При разработке, во время тестов - это ОЧЕНЬ ограничивает, поэтому лучше сидеть на XP, т.к. в W7 при такой сорости могут нервы не выдержать. После фикса стал быстрее отрабатывать запуск Quik, но на запуске экспорта я че-то не очень ощутил изменения. Я вот думаю, может это все связано с появлением WPF в новых операционках,который многослоен, может это как-то увеличивает количество окон, участвующих в поиске, надо Spy++ поковырять...
Оставь почту, вечером вышлю файл с экспортом
Спасибо, вот она! nazaroid2@mail.ru
Увы, че-то не получил ничего...
Вчера очень занят был, сейчас отправил.
Понял... Спасибо, все получил! Будем разбираться...
У меня тоже на XP экспорт по DDE летает. На Win7 жутко тормозит - пробовал на 3.2.2, отлаживаться вообще нервов не хватает. Возможно коммент #8 может помочь разобраться...
Есть идеи как сделать оптимизацию, но к сожалению, пока не пробовал их воплотить, т.к. нахожусь в отпуске. Обязательно сообщу че и как, когда поковыряюсь
Если не получится, то по форумам вопросы раскидаю...
Всем доброго дня! Пока что изыскания следующие:
Vista
Запуск экспорта по ДДЕ Выпонение метода GetQuikWindows(Process process) заняло 0,3300634 секунд. Метод вернул 12 из 565 окон Выпонение метода GetQuikWindows(Process process) заняло 0,3549551 секунд. Метод вернул 12 из 565 окон Выпонение метода GetQuikWindows(Process process) заняло 0,329384 секунд. Метод вернул 13 из 566 окон Открытие DDE окна => Выпонение метода WaitFor заняло 0,6904268 секунд Остановка DDE вывода => Выпонение метода WaitFor заняло 0,0019952 секунд Запуск DDE вывода => Выпонение метода WaitFor заняло 0,004298 секунд Выпонение метода GetQuikWindows(Process process) заняло 0,355389 секунд. Метод вернул 12 из 566 окон Закрытие DDE окна => Выпонение метода WaitFor заняло 0,355694 секунд Запуск окна с заголовком <инструменты> занял 1,3918877 секунд
Запуск ДДЕ занял: 2,762106 секунд
XP
Запуск экспорта по ДДЕ Выпонение метода GetQuikWindows(Process process) заняло 0,0347218 секунд. Метод вернул 15 из 263 окон Выпонение метода GetQuikWindows(Process process) заняло 0,0358152 секунд. Метод вернул 15 из 263 окон Выпонение метода GetQuikWindows(Process process) заняло 0,0357294 секунд. Метод вернул 16 из 264 окон Открытие DDE окна => Выпонение метода WaitFor заняло 0,0836615 секунд Остановка DDE вывода => Выпонение метода WaitFor заняло 0,0018648 секунд Запуск DDE вывода => Выпонение метода WaitFor заняло 0,0039082 секунд Выпонение метода GetQuikWindows(Process process) заняло 0,0349754 секунд. Метод вернул 15 из 263 окон Закрытие DDE окна => Выпонение метода WaitFor заняло 0,0351794 секунд Запуск окна с заголовком <инструменты> занял 0,1647161 секунд
Запуск ДДЕ занял: 0,320936 секунд
Артём, спасибо. Посмотрю сегодня чего да как.
Кроме тебя ни у кого нет доступа к этим методам, поэтому названия остальным мало что скажут :)
AllToplevelWindows - это уже свойство в ManagedApi.dll
Кстати по теме. В W7 х64 ДДЕ достаточно быстро запускается. Почти как в ХР. Версия 2.6.2
Да, у меня тоже собственно не было... Располагал только классом QuikTrminal🤨. Я думал ManagedWinapi.dll заимствованная библиотека:
http://mwinapi.sourceforge.net/doc/html/P_ManagedWinapi_Windows_SystemWindow_AllDescendantWindows.htm
Да, у меня тоже собственно не было... Располагал только классом QuikTrminal🤨. Я думал ManagedWinapi.dll заимствованная библиотека:
http://mwinapi.sourceforge.net/doc/html/P_ManagedWinapi_Windows_SystemWindow_AllDescendantWindows.htm
Верно, так и есть. Только http://mwinapi.sourceforge.net/doc/html/P_ManagedWinapi_Windows_SystemWindow_AllToplevelWindows.htm - вот как раз AllToplevelWindows. Не совсем понял откуда взялось FilterToplevelWindows в выводах
Это я залез через задний так сказать проход внутрь AllToplevelWindows и определил, что
Есть предложения как от этой функции уйти?
Увы, мои спосбности на этом этапе исчерпали себя😭 Пока никаких предложений нету. Эта функция делает следующее:
Чего с этим делать пока непонятно
Предлагаю задать вопрос на сайте rsdn.ru и уже там дальше провести разбор полетов Это форум для программистов. Боюсь своими силами проблему не решить.
А EnumWindows - это Api
Да, вот я думаю, может быть можно как-то кэшировать окна, а не производить посик каждый раз по всему списку открытых окон. На rsdn, конечно, тоже надо будет написать
А может спросить у Микрософта? Если кто может грамотно поставить вопрос. Мол, пацаны, такая хрень происходит, что на вин7 тормоза нереальные появляются, что думаете, куда смотреть и т.д.
Сижу на вин7, после 14.00 тестировать невозможно, время включения дде до 20 мин... а утром 2-5 мин!!! после 16.00 дде вообще не поднимется за какоето измеряемое время...
Странно, пользуюсь Win7, но экспорт стартует достаточно быстро (секунд 15 максимум, если по всем возможным таблицам) независимо от времени суток...
Я вам завидую. Но похоже проблема существует реально. Возможно дело в настройке вин7, возможно в связке с железом или что-то еще. У меня совершенно четкая связь времени суток и скорости вкллючения дде.
Использую Windows Server 2008R2 x64,старт экспорта конечно медленней чем на Win2003, но запуск проходит секунд за 30 максимум. Время запуска сильно зависит от количества открытых окон, а так же от количества вкладок в опере. Зависимости от времени суток нет.
Коллеги, проблема локализована(см. #28,#30), - это функция EnumWindows из user32.dll,которая фигово работает в виндоусе после висты. Сегодня я напишу письмо на форумах, с вопросом откуда такая несправедливость и есть ли достойные альтернативы. Если там не получится, то я за то, чтобы искать другое решение, т.к. очевидно проблему надо решать. Уверен, при содействии таких мастеров как Михаил и Александр решение обязательно найдется.
Сейчас отдельно проверил у себя время работы функции EnumWindows. Программа в аттаче, код следующий:
На Windows Server 2008R2 x86 он выполняется за "Total time: 00:00:00.0009447". Что программа выведет у вас?
Уменя На w7 x86 за "Total time: 00:00:00.0008483".
Потому что она вызывается в #28. Но конкретно по EnumWindows я замеры не делал, т.к. замучился в исследовниях и как-то решил, что дело именно в ней, раз она ключевая в FilterToplevelWindows да и проблема привязана к платформе
Откуда вызывается FilterToplevelWindows? Из SystemWindow.AllToplevelWindows? Возьмем следующий пример:
Вывод:
При этом время увеличивапется, если добавить условие на Linq
var wins = SystemWindow.AllToplevelWindows.Where(w=>w.Process.Id == AppDomain.GetCurrentThreadId()).ToArray();
, тогда
EnumWindows time: 00:00:00.0009348 Windows count: 730 AllToplevelWindows time: 00:00:00.9365030 Windows count: 0
Видать, зря я EnumWindows так катигорично забраковал
У меня это условие не очень сильно увеличивает время
Вообще, дело тут не в LINQ, дело в том, что SystemWindow.Process выполняет пару дополнительных действий, в частности тормозит Process.GetProcessById
P.s. посмотреть бы как это все используется в S#... Alexander, можете показать эту часть исходника?
Оставьте почту, отправлю весь QuikTerminal
А после такого измения кода как быстро стало отрабатывать?
У меня это условие не очень сильно увеличивает время
В 100 раз. Довольно сильно :)
С измененным предикатом:
без:
Видимо, время тратится на доступ к w.Process
Может быть тогда можно попробовать для получения окон квика сначала ограничить выборку из AllToplevelWindows по какому-нить нетормозному признаку (по ClassName или еще как), а потом уже фильтровать по w.Process
Эх, нету ни квика ни кода из QuikTerminal сейчас под рукой чтоб проверить😭
Я не сразу допер... С новым предикатом ведь совсем все замечательно!!!🤤
Александр, можете попробовать собрать проект с такой вот функцией GetQuikWindows:
Получилось чего-нить?
На моей машине (Win 7) стало запускаться раз в 10 быстрее - я банально даже не успеваю просмотреть окошки. Вы большие молодцы, спасибо! 👍
После закрытия основной сессии протестирую с 7 копиями квиков.
Exception возник при остановке экспорта. Буду разбираться.
В любом случае - запуск \ остановка стала на порядки быстрее :)
Урааа!😀 Отдельное спасибо esper!
Exception поборол, в 3.2.6 будет это изменение.
Ура!!! Свершилось!!! Спасибо!!!