AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 09.09.2009, 11:26   #1  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Ускорение вывода в Word в терминальном режиме
AX 2.5 SP3, Word 2003

В модуле "Расчеты с персоналом" есть ряд отчетов, выводящих информацию в предварительно подготовленный шаблоны Word. Вывод идет через объекты COM.

При работе на "обычном" клиенте вывод занимает 10..20 секунд. При работе в терминальном клиенте - около 2 минут.

Если сразу после создания экземпляра Word "передернуть" его видимость следующим образом

X++:
    worddocument.visible(true);   // сделать экземпляр Word видимым и тут же
    worddocument.visible(false);  // сделать экземпляр Word не видимым
И только после этого начать заполнение документа Word, то время заполнения в терминальном клиенте сокращается до 4..5 секунд.

На время заполнения документа Word в обычном клиенте такое "передергивание" практически не влияет.

Собственно, вопрос заключается в том, почему? Почему "передергивание" видимости экземпляра Word настолько существенно влияется на время заполнения именно в терминальном клиенте? Можно ли добиться того же эффекта без "передергивания" видимости?

AX2.5 SP3, Word 2003
Старый 09.09.2009, 13:10   #2  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
У Word.Application помимо Visible есть еще свойство ScreenUpdating (тоже булевского типа) - попробуйте перед началом вывода установить его в false. А на счет терминального клиента - там же отрисовка несколько отличается от работы напрямую с железом (обновляемая картинка, возможно, в некоем WMF-образном виде, еще и передается на клиента). Вон, MSIE тот же вроде в терминальной сессии рендерит картинку иначе, нежели в консольной - какая-то у него настройка даже есть на этот счет.

Последний раз редактировалось gl00mie; 09.09.2009 в 13:13.
Старый 09.09.2009, 13:54   #3  
dech is offline
dech
Участник
Аватар для dech
Самостоятельные клиенты AX
 
647 / 350 (13) ++++++
Регистрация: 25.06.2009
Адрес: Омск
Записей в блоге: 3
Word отображает все изменения динамически, т.е. моментально мы все можем увидеть на экране. А прорисовка на удаленке работает гораздо медленнее, сами понимаете. Если попробуйте установить на удаленке количество цветов к примеру 32 бит, то скорость вывода в Word еще больше снизится. Поэтому, если нужно выводить данные в MS Office максимально быстро, перед выводом установите свойство visible в false. Остальное уже зависит от пропускной способности клиента.
__________________
// no comments
Старый 09.09.2009, 14:49   #4  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Гм... Уточню. Заполнение полей Word идет в состоянии Word.visible = false. Так было до передергивания видимости и так и осталось после передергивания видимости. Т.е. изменение значений полей происходит в не видимом, скрытом, приложении Word.

Однако несмотря на этот факт скорость заполнения в обычном клиенте и в терминальном различается на порядок. При одном и том же коде

Передергивание видимости позволяет "привести в чувство" терминального клиента. Что-то, где-то обновляется и тормоза уходят

gl00mie

ScreenUpdating - не помог. Разницы никакой. Собственно, а почему он должен был как-то повлиять, если процесс заполнения идет в visible = false? Нет экрана и нечему обновляться.

Не понимаю, как здесь может влиять процесс отрисовки, если "картинки" нет. Или в терминале отрисовка выполняется и для не видимых процессов? Тогда почему "передергивание" видимости что-то меняет? Как была картинка не видимой, так не видимой и осталась.
Старый 09.09.2009, 18:53   #5  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
Заполнение полей Word идет в состоянии Word.visible = false. Так было до передергивания видимости и так и осталось после передергивания видимости. Т.е. изменение значений полей происходит в не видимом, скрытом, приложении Word. Однако несмотря на этот факт скорость заполнения в обычном клиенте и в терминальном различается на порядок. При одном и том же коде
Возможно, это просто глюки ворда Помнится, недавно была тема Предустановка свойства ButtonGroup enabled в значение No, где обсуждался интересный глюк ядра Аксапты: если выставить FormButtonGroup.enabled( false ) в дизайне формы или во время выполнения до super() в run() (т.е. в т.ч. в init() формы), то обратное действие FormButtonGroup.enabled( true ) срабатывает лишь с третьего раза (enable-disable-enable). Как знать, возможно, в Word тоже наблюдается похожее поведение каких-то его настроек, отвечающих за отрисовку изменений. Кроме того, подобное поведение может быть связано с тем, когда изначально выставляется Visible( false ): если вы используете ComWordDocument_RU, то он (точнее, его базовый класс ComOfficeDocument_RU) устанавливает это свойство после инициализации объекта Application, но до открытия файла-шаблона и инициализации объекта Document. Быть может, если делать Word невидимым после открытия шаблона документа, то вывод в шаблон также будет работать быстро.
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
Передергивание видимости позволяет "привести в чувство" терминального клиента. Что-то, где-то обновляется и тормоза уходят
Как вариант, можно еще провести такой эксперимент: запустить вывод отчета в Word в терминальном клиенте и сразу же отключиться от терминальной сессии, чтобы вывод данных происходил без подключенного к сессии клиента, которому бы передавалась картинка. Время отработки вывода в этом случае можно более-менее точно определить по загрузке процессора экземпляром Word, запущенным в соответствующей сессии: активность Word можно наблюдать, например, в диспетчере задач, запущенном в другой сессии или в консоли на том же терминальном сервере с правами просмотра информации о процессах других пользователей. Опередлить "нужный" экземпляр Word, если на сервере их запущено несколько, можно будет по номеру сессии (session id).
Такой эксперимент покажет, влияет ли пересылка картинки терминальному клиенту на производительность вывода, если предположить, что из-за глюка даже невидимый Word продолжает что-то там... рисовать
Старый 09.09.2009, 20:43   #6  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Сообщение от gl00mie Посмотреть сообщение
Возможно, это просто глюки ворда
Скорее всего

Цитата:
Сообщение от gl00mie Посмотреть сообщение
Быть может, если делать Word невидимым после открытия шаблона документа, то вывод в шаблон также будет работать быстро.
Так ведь именно это я и делаю.

Цитата:
Сообщение от gl00mie Посмотреть сообщение
Как вариант, можно еще провести такой эксперимент: запустить вывод отчета в Word в терминальном клиенте и сразу же отключиться от терминальной сессии, чтобы вывод данных происходил без подключенного к сессии клиента, которому бы передавалась картинка.
(...)
Такой эксперимент покажет, влияет ли пересылка картинки терминальному клиенту на производительность вывода, если предположить, что из-за глюка даже невидимый Word продолжает что-то там... рисовать
Проверил. Не влияет.

Время засекал выводя инфолог по завершении процесса. Что в закрытой сессии, что в открытой - результат одинаковый.
Старый 16.09.2009, 09:57   #7  
somebody is offline
somebody
Участник
 
128 / 30 (2) +++
Регистрация: 30.04.2003
Адрес: Москва
->
Володя,

скорее всего проблема не в 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  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
По результатам экспериментов тормоза целиком и полностью следствие проверки грамматики. Отключение приводит к существенному ускорению.

Примерные цифры для сравнения времени выполнения отчета Word:

Без каких-либо модификаций - около 2 минут
Принудительное передергивание visible - около 20 секунд
С отключенной проверкой грамматики - около 3 секунд вне зависимости от факта передергивания visible

Проблема только в том, что я не знаю, каким образом можно принудительно сбросить проверку грамматики на терминалке для всех клиентов. А главное, стоит ли это делать, если найден способ до некоторой степени скомпенсировать влияние этой настройки.
Старый 16.09.2009, 11:18   #9  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5798 (201) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
По результатам экспериментов тормоза целиком и полностью следствие проверки грамматики. Отключение приводит к существенному ускорению. Проблема только в том, что я не знаю, каким образом можно принудительно сбросить проверку грамматики на терминалке для всех клиентов.
Если дело в проверке грамматики, то ее ведь можно отключать не для всех клиентов на терминалке, а для того экземпляра Word, через который вы заполняете шаблон. В MSDN есть описание интерфейса Options приложения Word, через который вы можете программно изменить ряд свойст, связанных с проверкой грамматики.
Старый 16.09.2009, 11:59   #10  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Сообщение от gl00mie Посмотреть сообщение
Если дело в проверке грамматики, то ее ведь можно отключать не для всех клиентов на терминалке, а для того экземпляра Word, через который вы заполняете шаблон.
Теоретически можно.

Но практически, проблема в том, что эта настройка прописывается в реестре. Как следствие, вступает в силу после перезагрузки ВСЕХ экземпляров приложения.

На практике это означает следующее:

Если до программного изменения Options был запущен другой экземпляр Word, то Options, конечно, будет изменен для нового экземпляра, но в силу не вступит. Так и останутся тормоза при выводе до тех пор, пока не будут перезагружены ВСЕ экземпляры Word.

Другими словами, код

X++:
   Com     comOptions;
    ;

    comOptions = m_comApplication.options();
    comOptions.CheckGrammarAsYouType(false);
окажет нужный эффект только в том случае, если на момент его исполнения существует только один запущенный экземпляр Word в котором и выполняются модификации.
Старый 16.09.2009, 17:41   #11  
somebody is offline
somebody
Участник
 
128 / 30 (2) +++
Регистрация: 30.04.2003
Адрес: Москва
->
Цитата:
Сообщение от Владимир Максимов
Проблема только в том, что я не знаю, каким образом можно принудительно сбросить проверку грамматики на терминалке для всех клиентов.
Это можно сделать очень просто, через logon script на терминалке для профиля "all users". Тогда при входе у каждого пользователя в HKCU будет прописываться отключение грамматики.

Ну и на всякий случай в HKLM сервера это прописать.
Старый 18.09.2009, 13:10   #12  
somebody is offline
somebody
Участник
 
128 / 30 (2) +++
Регистрация: 30.04.2003
Адрес: Москва
Цитата:
Сообщение от Владимир Максимов
comOptions.CheckGrammarAsYouType(false);
Почему не хочешь делать это напрямую через реестр?
Цитата:
Сообщение от Владимир Максимов
Так и останутся тормоза при выводе до тех пор, пока не будут перезагружены ВСЕ экземпляры Word.
Если в некоторый момент Word не работает на сервере вообще, а затем все заходящие на терминалку получают через реестр запрет проверки грамматики, то и не возникнет такая ситуация.
Старый 18.09.2009, 15:54   #13  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Если я принимаю решение блокировать проверку грамматики, то пользователь не должен иметь возможности изменить мои настройки. В противном случае имеем конфликт интересов. Программиста и пользователя.

Вопрос "политический", а не программный. Вне компетенции программиста. Я просто не имею права указывать пользователю как ему работать с внешней программой. С какими настройками. Разумеется, если эти настройки не приводят к краху Axapta или его некорректной работе.
Старый 21.09.2009, 16:16   #14  
somebody is offline
somebody
Участник
 
128 / 30 (2) +++
Регистрация: 30.04.2003
Адрес: Москва
Цитата:
Сообщение от Владимир Максимов
пользователь не должен иметь возможности изменить мои настройки
А вот это делается через политики, в данном случае скорее всего локальную. Групповые могут запретить пользователю проверку грамматики на любом компьютере, нам надо только на терминальном сервере.

Не хотелось бы разводить лишнюю болтовню ("офтоповый флуд"), но замечу :

1)
Цитата:
Сообщение от Владимир Максимов
не имею права указывать пользователю как ему работать с внешней программой
Терминальное соединение используется для работы в Аксапте? В таком случае совесть при запрете проверки грамматики должна быть спокойна. В Ворде поработать можно и на своей собственной рабочей станции.

2) Зная пользователей, рискну утверждать, что 99% из них пожертвуют правом на проверку грамматики на терминальном сервере в обмен на ускорение вывода отчётов :) Притом, что вряд ли работа в Ворде ведётся на терминальном сервере, см. п. 1.

3) Ну и last but not least, вообще-то в руководствах рекомендуется отключать эту самую проверку грамматики на терминальных серверах. Т. к. она сильно нагружает процессор.
Цитата:
Сообщение от Владимир Максимов
конфликт интересов. Программиста и пользователя.
Так что это в действительности конфликт администратора и пользователя. А он обычно решается в пользу 1-го :)
Старый 21.09.2009, 16:24   #15  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,701 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
В настоящее время, большинство пользователей работает на бездисковых станциях. Т.е. на терминалке у них все. В том числе и Word. Так что, "своя станция" и есть терминал.

Решение вопроса вне компетенции программиста.
Теги
ax2.5, word, терминал

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Ошибки Word 2003 при работе в терминальном режиме Владимир Максимов DAX: Программирование 17 03.07.2017 13:42
axcoder: WordSL - Microsoft Word as a visual XSLT editor Blog bot DAX Blogs 0 26.01.2007 05:45
Вывод отчета в файл в пакетном режиме Egor_bl DAX: Программирование 16 09.10.2006 19:10
Шрифт для вывода в Word Прокопьева DAX: Программирование 2 13.09.2006 08:55
Как импортировать из Word chuf DAX: Программирование 4 21.06.2003 15:33

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 08:42.