| 
			
			 | 
		#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  | 
| 
	
 | 
| 
			
			 | 
		#2 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			У Word.Application помимо Visible есть еще свойство ScreenUpdating  (тоже булевского типа) - попробуйте перед началом вывода установить его в false. А на счет терминального клиента - там же отрисовка несколько отличается от работы напрямую с железом (обновляемая картинка, возможно, в некоем WMF-образном виде, еще и передается на клиента). Вон, MSIE тот же вроде в терминальной сессии рендерит картинку иначе, нежели в консольной - какая-то у него настройка даже есть на этот счет.
		 
		
		
		
		
		
		
		
		
			Последний раз редактировалось gl00mie; 09.09.2009 в 13:13.  | 
| 
	
 | 
| 
			
			 | 
		#3 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Word отображает все изменения динамически, т.е. моментально мы все можем увидеть на экране. А прорисовка на удаленке работает гораздо медленнее, сами понимаете. Если попробуйте установить на удаленке количество цветов к примеру 32 бит, то скорость вывода в Word еще больше снизится. Поэтому, если нужно выводить данные в MS Office максимально быстро, перед выводом установите свойство visible в false. Остальное уже зависит от пропускной способности клиента.  
		
		
		
		
		
		
			 
		
				__________________ 
		
		
		
		
	// no comments  | 
| 
	
 | 
| 
			
			 | 
		#4 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Гм... Уточню. Заполнение полей Word идет в состоянии Word.visible = false. Так было до передергивания видимости и так и осталось после передергивания видимости. Т.е. изменение значений полей происходит в не видимом, скрытом, приложении Word. 
		
		
		
		
		
		
		
	Однако несмотря на этот факт скорость заполнения в обычном клиенте и в терминальном различается на порядок. При одном и том же коде Передергивание видимости позволяет "привести в чувство" терминального клиента. Что-то, где-то обновляется и тормоза уходят gl00mie ScreenUpdating - не помог. Разницы никакой. Собственно, а почему он должен был как-то повлиять, если процесс заполнения идет в visible = false? Нет экрана и нечему обновляться. Не понимаю, как здесь может влиять процесс отрисовки, если "картинки" нет. Или в терминале отрисовка выполняется и для не видимых процессов? Тогда почему "передергивание" видимости что-то меняет? Как была картинка не видимой, так не видимой и осталась.  | 
| 
	
 | 
| 
			
			 | 
		#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 продолжает что-то там... рисовать  
		 | 
| 
	
 | 
| 
			
			 | 
		#6 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Скорее всего 
		
		
		
		
		
		
		
	Цитата: 
	
Цитата: 
	
		
			Сообщение от gl00mie
			 
 
			Как вариант, можно еще провести такой эксперимент: запустить вывод отчета в Word в терминальном клиенте и сразу же отключиться от терминальной сессии, чтобы вывод данных происходил без подключенного к сессии клиента, которому бы передавалась картинка. 
		
	(...) Такой эксперимент покажет, влияет ли пересылка картинки терминальному клиенту на производительность вывода, если предположить, что из-за глюка даже невидимый Word продолжает что-то там... рисовать ![]() Время засекал выводя инфолог по завершении процесса. Что в закрытой сессии, что в открытой - результат одинаковый.  | 
| 
	
 | 
| 
			
			 | 
		#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). | |
| 
			
			 | 
		#8 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			По результатам экспериментов тормоза целиком и полностью следствие проверки грамматики. Отключение приводит к существенному ускорению. 
		
		
		
		
		
		
		
	Примерные цифры для сравнения времени выполнения отчета Word: Без каких-либо модификаций - около 2 минут Принудительное передергивание visible - около 20 секунд С отключенной проверкой грамматики - около 3 секунд вне зависимости от факта передергивания visible Проблема только в том, что я не знаю, каким образом можно принудительно сбросить проверку грамматики на терминалке для всех клиентов. А главное, стоит ли это делать, если найден способ до некоторой степени скомпенсировать влияние этой настройки.  | 
| 
	
 | 
| 
			
			 | 
		#9 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
 | 
| 
	
 | 
| 
			
			 | 
		#10 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
Но практически, проблема в том, что эта настройка прописывается в реестре. Как следствие, вступает в силу после перезагрузки ВСЕХ экземпляров приложения. На практике это означает следующее: Если до программного изменения Options был запущен другой экземпляр Word, то Options, конечно, будет изменен для нового экземпляра, но в силу не вступит. Так и останутся тормоза при выводе до тех пор, пока не будут перезагружены ВСЕ экземпляры Word. Другими словами, код X++:    Com     comOptions;
    ;
    comOptions = m_comApplication.options();
    comOptions.CheckGrammarAsYouType(false); | 
| 
	
 | 
| 
			
			 | 
		#11 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
			
			 Цитата: 
	
		
			Сообщение от Владимир Максимов
			
			 
Проблема только в том, что я не знаю, каким образом можно принудительно сбросить проверку грамматики на терминалке для всех клиентов. 
		
	Ну и на всякий случай в HKLM сервера это прописать.  | 
| 
	
 | 
| 
			
			 | 
		#12 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
		
			Сообщение от Владимир Максимов
			
			 
comOptions.CheckGrammarAsYouType(false); 
		
	Цитата: 
	
		
			Сообщение от Владимир Максимов
			
			 
Так и останутся тормоза при выводе до тех пор, пока не будут перезагружены ВСЕ экземпляры Word. 
		
	 | 
| 
	
 | 
| 
			
			 | 
		#13 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			Если я принимаю решение блокировать проверку грамматики, то пользователь не должен иметь возможности изменить мои настройки. В противном случае имеем конфликт интересов. Программиста и пользователя. 
		
		
		
		
		
		
		
	Вопрос "политический", а не программный. Вне компетенции программиста. Я просто не имею права указывать пользователю как ему работать с внешней программой. С какими настройками. Разумеется, если эти настройки не приводят к краху Axapta или его некорректной работе.  | 
| 
	
 | 
| 
			
			 | 
		#14 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 Цитата: 
	
		
			Сообщение от Владимир Максимов
			
			 
пользователь не должен иметь возможности изменить мои настройки 
		
	Не хотелось бы разводить лишнюю болтовню ("офтоповый флуд"), но замечу : 1) Цитата: 
	
		
			Сообщение от Владимир Максимов
			
			 
не имею права указывать пользователю как ему работать с внешней программой 
		
	2) Зная пользователей, рискну утверждать, что 99% из них пожертвуют правом на проверку грамматики на терминальном сервере в обмен на ускорение вывода отчётов :) Притом, что вряд ли работа в Ворде ведётся на терминальном сервере, см. п. 1. 3) Ну и last but not least, вообще-то в руководствах рекомендуется отключать эту самую проверку грамматики на терминальных серверах. Т. к. она сильно нагружает процессор. Цитата: 
	
		
			Сообщение от Владимир Максимов
			
			 
конфликт интересов. Программиста и пользователя. 
		
	 | 
| 
	
 | 
| 
			
			 | 
		#15 | 
| 
			
			 Участник 
		
			
	 | 
	
	
	
		
		
		
		 
			
			В настоящее время, большинство пользователей работает на бездисковых станциях. Т.е. на терминалке у них все. В том числе и Word. Так что, "своя станция" и есть терминал. 
		
		
		
		
		
		
		
	Решение вопроса вне компетенции программиста.  | 
| 
	
 |