|
09.09.2009, 11:26 | #1 |
Участник
|
Ускорение вывода в Word в терминальном режиме
AX 2.5 SP3, Word 2003
В модуле "Расчеты с персоналом" есть ряд отчетов, выводящих информацию в предварительно подготовленный шаблоны Word. Вывод идет через объекты COM. При работе на "обычном" клиенте вывод занимает 10..20 секунд. При работе в терминальном клиенте - около 2 минут. Если сразу после создания экземпляра Word "передернуть" его видимость следующим образом X++: worddocument.visible(true); // сделать экземпляр Word видимым и тут же worddocument.visible(false); // сделать экземпляр Word не видимым На время заполнения документа Word в обычном клиенте такое "передергивание" практически не влияет. Собственно, вопрос заключается в том, почему? Почему "передергивание" видимости экземпляра Word настолько существенно влияется на время заполнения именно в терминальном клиенте? Можно ли добиться того же эффекта без "передергивания" видимости? AX2.5 SP3, Word 2003 |
|
09.09.2009, 13:10 | #2 |
Участник
|
У Word.Application помимо Visible есть еще свойство ScreenUpdating (тоже булевского типа) - попробуйте перед началом вывода установить его в false. А на счет терминального клиента - там же отрисовка несколько отличается от работы напрямую с железом (обновляемая картинка, возможно, в некоем WMF-образном виде, еще и передается на клиента). Вон, MSIE тот же вроде в терминальной сессии рендерит картинку иначе, нежели в консольной - какая-то у него настройка даже есть на этот счет.
Последний раз редактировалось gl00mie; 09.09.2009 в 13:13. |
|
09.09.2009, 13:54 | #3 |
Участник
|
Word отображает все изменения динамически, т.е. моментально мы все можем увидеть на экране. А прорисовка на удаленке работает гораздо медленнее, сами понимаете. Если попробуйте установить на удаленке количество цветов к примеру 32 бит, то скорость вывода в Word еще больше снизится. Поэтому, если нужно выводить данные в MS Office максимально быстро, перед выводом установите свойство visible в false. Остальное уже зависит от пропускной способности клиента.
__________________
// no comments |
|
09.09.2009, 14:49 | #4 |
Участник
|
Гм... Уточню. Заполнение полей Word идет в состоянии Word.visible = false. Так было до передергивания видимости и так и осталось после передергивания видимости. Т.е. изменение значений полей происходит в не видимом, скрытом, приложении Word.
Однако несмотря на этот факт скорость заполнения в обычном клиенте и в терминальном различается на порядок. При одном и том же коде Передергивание видимости позволяет "привести в чувство" терминального клиента. Что-то, где-то обновляется и тормоза уходят gl00mie ScreenUpdating - не помог. Разницы никакой. Собственно, а почему он должен был как-то повлиять, если процесс заполнения идет в visible = false? Нет экрана и нечему обновляться. Не понимаю, как здесь может влиять процесс отрисовки, если "картинки" нет. Или в терминале отрисовка выполняется и для не видимых процессов? Тогда почему "передергивание" видимости что-то меняет? Как была картинка не видимой, так не видимой и осталась. |
|
09.09.2009, 18:53 | #5 |
Участник
|
Цитата:
Сообщение от Владимир Максимов
Заполнение полей Word идет в состоянии Word.visible = false. Так было до передергивания видимости и так и осталось после передергивания видимости. Т.е. изменение значений полей происходит в не видимом, скрытом, приложении Word. Однако несмотря на этот факт скорость заполнения в обычном клиенте и в терминальном различается на порядок. При одном и том же коде
Цитата:
Такой эксперимент покажет, влияет ли пересылка картинки терминальному клиенту на производительность вывода, если предположить, что из-за глюка даже невидимый Word продолжает что-то там... рисовать |
|
09.09.2009, 20:43 | #6 |
Участник
|
Скорее всего
Цитата:
Цитата:
Сообщение от gl00mie
Как вариант, можно еще провести такой эксперимент: запустить вывод отчета в Word в терминальном клиенте и сразу же отключиться от терминальной сессии, чтобы вывод данных происходил без подключенного к сессии клиента, которому бы передавалась картинка.
(...) Такой эксперимент покажет, влияет ли пересылка картинки терминальному клиенту на производительность вывода, если предположить, что из-за глюка даже невидимый Word продолжает что-то там... рисовать Время засекал выводя инфолог по завершении процесса. Что в закрытой сессии, что в открытой - результат одинаковый. |
|
16.09.2009, 09:57 | #7 |
Участник
|
Володя,
скорее всего проблема не в Word'е, а в терминальном сервере. Посмотри схожие (к сожалению, нерешённые) проблемы: Interop Performance with Terminal Server Word 2003 Performance Issue in Terminal Server. Вроде бы в терминалке 2008-го сервера какие-то похожие проблемы решены, если есть возможность, попробуй под 2008. Но сначала: 1) Пропатчен ли Office до SP3? Т. к. M$ официально признала тормоза Word SP2 в терминалке. 2) Запрети на терм. сервере автопроверку грамматики: <HKLM/HKCU>\Software\Microsoft\Office\11.0\Word\Options AutoGrammar(dword) --> 0. 3) Надеюсь, терм. клиент стоит новый, что-то типа 6.0.6001.18000 (longhorn_rtm.080118-1840) или новее? 4) На всякий случай сними на клиенте все галки по производительности (всё на закладке "Дополнительно", кроме "Восстановить подключение при разрыве"), сделай экран похуже (закладка "Экран"), убери звуки/горячие клавиши/принтеры (закладка "Локальные ресурсы"). Просто интересно, повлияет ли на глюк работа в таком "тощем" режиме. Может, хоть время сократится? 5) .NET FW 3.5 SP1 ? Да, ещё вот: если установлен "пакет совместимости с Office 2007", тоже могут быть тормоза: Slow Word 2003 after compatibility pack for Office 2007, причём деинсталляция пакета не помогает. |
|
|
За это сообщение автора поблагодарили: Logger (3), gl00mie (3). |
16.09.2009, 11:04 | #8 |
Участник
|
По результатам экспериментов тормоза целиком и полностью следствие проверки грамматики. Отключение приводит к существенному ускорению.
Примерные цифры для сравнения времени выполнения отчета Word: Без каких-либо модификаций - около 2 минут Принудительное передергивание visible - около 20 секунд С отключенной проверкой грамматики - около 3 секунд вне зависимости от факта передергивания visible Проблема только в том, что я не знаю, каким образом можно принудительно сбросить проверку грамматики на терминалке для всех клиентов. А главное, стоит ли это делать, если найден способ до некоторой степени скомпенсировать влияние этой настройки. |
|
16.09.2009, 11:18 | #9 |
Участник
|
Цитата:
|
|
16.09.2009, 11:59 | #10 |
Участник
|
Цитата:
Но практически, проблема в том, что эта настройка прописывается в реестре. Как следствие, вступает в силу после перезагрузки ВСЕХ экземпляров приложения. На практике это означает следующее: Если до программного изменения Options был запущен другой экземпляр Word, то Options, конечно, будет изменен для нового экземпляра, но в силу не вступит. Так и останутся тормоза при выводе до тех пор, пока не будут перезагружены ВСЕ экземпляры Word. Другими словами, код X++: Com comOptions;
;
comOptions = m_comApplication.options();
comOptions.CheckGrammarAsYouType(false); |
|
16.09.2009, 17:41 | #11 |
Участник
|
Цитата:
Сообщение от Владимир Максимов
Проблема только в том, что я не знаю, каким образом можно принудительно сбросить проверку грамматики на терминалке для всех клиентов.
Ну и на всякий случай в HKLM сервера это прописать. |
|
18.09.2009, 13:10 | #12 |
Участник
|
Цитата:
Сообщение от Владимир Максимов
comOptions.CheckGrammarAsYouType(false);
Цитата:
Сообщение от Владимир Максимов
Так и останутся тормоза при выводе до тех пор, пока не будут перезагружены ВСЕ экземпляры Word.
|
|
18.09.2009, 15:54 | #13 |
Участник
|
Если я принимаю решение блокировать проверку грамматики, то пользователь не должен иметь возможности изменить мои настройки. В противном случае имеем конфликт интересов. Программиста и пользователя.
Вопрос "политический", а не программный. Вне компетенции программиста. Я просто не имею права указывать пользователю как ему работать с внешней программой. С какими настройками. Разумеется, если эти настройки не приводят к краху Axapta или его некорректной работе. |
|
21.09.2009, 16:16 | #14 |
Участник
|
Цитата:
Сообщение от Владимир Максимов
пользователь не должен иметь возможности изменить мои настройки
Не хотелось бы разводить лишнюю болтовню ("офтоповый флуд"), но замечу : 1) Цитата:
Сообщение от Владимир Максимов
не имею права указывать пользователю как ему работать с внешней программой
2) Зная пользователей, рискну утверждать, что 99% из них пожертвуют правом на проверку грамматики на терминальном сервере в обмен на ускорение вывода отчётов :) Притом, что вряд ли работа в Ворде ведётся на терминальном сервере, см. п. 1. 3) Ну и last but not least, вообще-то в руководствах рекомендуется отключать эту самую проверку грамматики на терминальных серверах. Т. к. она сильно нагружает процессор. Цитата:
Сообщение от Владимир Максимов
конфликт интересов. Программиста и пользователя.
|
|
21.09.2009, 16:24 | #15 |
Участник
|
В настоящее время, большинство пользователей работает на бездисковых станциях. Т.е. на терминалке у них все. В том числе и Word. Так что, "своя станция" и есть терминал.
Решение вопроса вне компетенции программиста. |
|