|  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. Однако несмотря на этот факт скорость заполнения в обычном клиенте и в терминальном различается на порядок. При одном и том же коде  Помнится, недавно была тема Предустановка свойства 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 продолжает что-то там... рисовать   | 
|  | 
|  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. Так что, "своя станция" и есть терминал. Решение вопроса вне компетенции программиста. | 
|  |