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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 28.02.2011, 14:04   #1  
AndreyStar is offline
AndreyStar
Участник
 
11 / 23 (1) +++
Регистрация: 01.04.2004
Тоже столкнулись с этой проблемой, идея сделать как в российском функционале, с макросами на try catch очень не понравилась, да и объем переписывания немалый

Проблема возникала только на системах с Win7, XP + Office 2010 + dax 2009 работало без проблем

Когда искал причину, увидел что в других языках обращения к COM компилируются с атрибутом [STAThread] - однопоточное исполнение, ну и появилась мысль что многопоточность Win7 мешает жить. Попытка запустить dax2009 в режиме совместимости чуть улучшила ситуацию, но проблему не решила и тогда пришла идея запустить класс экспорта в отдельном потоке, и все заработало

Сейчас все протестировано в разных связках, в том числе и в 64-битной системе, все работает, и переписывать нужно только способ запуска класса
За это сообщение автора поблагодарили: Logger (5), Ace of Database (2), coolibin (1), vc (1), alex55 (1), someOne (1).
Старый 02.03.2011, 13:29   #2  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,889 / 3165 (113) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от AndreyStar Посмотреть сообщение
Когда искал причину, увидел что в других языках обращения к COM компилируются с атрибутом [STAThread] - однопоточное исполнение, ну и появилась мысль что многопоточность Win7 мешает жить. Попытка запустить dax2009 в режиме совместимости чуть улучшила ситуацию, но проблему не решила и тогда пришла идея запустить класс экспорта в отдельном потоке, и все заработало

Сейчас все протестировано в разных связках, в том числе и в 64-битной системе, все работает, и переписывать нужно только способ запуска класса
Не могли бы подробнее рассказать что нужно сделать ?
Старый 02.03.2011, 14:12   #3  
someOne is offline
someOne
Участник
Аватар для someOne
 
173 / 423 (15) +++++++
Регистрация: 11.12.2008
Адрес: Москва
Цитата:
Сообщение от AndreyStar Посмотреть сообщение
Тоже столкнулись с этой проблемой, идея сделать как в российском функционале, с макросами на try catch очень не понравилась, да и объем переписывания немалый

Проблема возникала только на системах с Win7, XP + Office 2010 + dax 2009 работало без проблем

Когда искал причину, увидел что в других языках обращения к COM компилируются с атрибутом [STAThread] - однопоточное исполнение, ну и появилась мысль что многопоточность Win7 мешает жить. Попытка запустить dax2009 в режиме совместимости чуть улучшила ситуацию, но проблему не решила и тогда пришла идея запустить класс экспорта в отдельном потоке, и все заработало

Сейчас все протестировано в разных связках, в том числе и в 64-битной системе, все работает, и переписывать нужно только способ запуска класса
Кажется понял как это работает.

Запускаем импорт из екселя, например, так
X++:
thread    thread = new thread();

     thread.setInputParm(["Т000081968", "c:\text.xlsx"]); // какие то параметры

     thread.run(classnum(TetImportClass), identifierstr(importFromExcel));
А сам метод импорта в классе TetImportClass
X++:
static client void importFromExcel(thread _thread)

ComExcelDocument_RU        document = new ComExcelDocument_RU();
str path;
str parm;
;
[parm, path] = _thread.getInputParm();

    document.open(path, false);

    .....
     ....
Думаю, так импорт не получится прервать передвиганием мыши или переключением окон, так как импорт проходит в отдельном потоке. И ошибок не будет.
Какое никакое, но все же решение.
Только теперь ряд других проблем имеется, например перехват ошибок и вывод их на экран - не тривиальная задача. Но решаемая.
За это сообщение автора поблагодарили: Logger (3).
Старый 04.03.2011, 09:51   #4  
AndreyStar is offline
AndreyStar
Участник
 
11 / 23 (1) +++
Регистрация: 01.04.2004
Цитата:
Сообщение от someOne Посмотреть сообщение
Только теперь ряд других проблем имеется, например перехват ошибок и вывод их на экран - не тривиальная задача. Но решаемая.
для перехвата ошибок делаем в конце главного метода класса потока, не статического, упаковку инфолога в outParams потока, и дополнительно создан глобальный класс менеджер потоков, в котором все потоки регистрируются и через него можно получить доступ к прогрессу выполнения, инфологу и есть возможность прервать по желанию

все подсмотрено в классе TutorialThread, идея менеджера потоков вспомнилась из проектирования многозадачных систем

все реализуемо

Последний раз редактировалось AndreyStar; 04.03.2011 в 10:04.
Старый 07.03.2011, 12:06   #5  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5788 (200) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от AndreyStar Посмотреть сообщение
Тоже столкнулись с этой проблемой, идея сделать как в российском функционале, с макросами на try catch очень не понравилась, да и объем переписывания немалый
Если вы про методы класса ComExcelDocument_RU, то, по-моему, это ерунда, другое дело, что это на самом деле не спасает. И еще очень жаль, что для создания экземпляров этого класса не используется статический construct(), нашедший повсеместное распространение в AX 2009
Цитата:
Сообщение от AndreyStar Посмотреть сообщение
Проблема возникала только на системах с Win7, XP + Office 2010 + dax 2009 работало без проблем
Попробуйте во время длительного экспорта/импорта попереключаться с окна Аксапты на окна других приложений и обратно или потыкать мышкой в окно Аксапты - все еще "работает без проблем"?
Цитата:
Сообщение от AndreyStar Посмотреть сообщение
Когда искал причину, увидел что в других языках обращения к COM компилируются с атрибутом [STAThread] - однопоточное исполнение, ну и появилась мысль что многопоточность Win7 мешает жить.
Я, может, отстал от жизни, но вроде винды не умеют распараллеливать работу приложения на большее число потоков, чем предусмотрено самим приложением (за исключением, может, кода сервисных библиотек, которые могут создавать собственные дополнительные потоки).
Цитата:
Сообщение от AndreyStar Посмотреть сообщение
Сейчас все протестировано в разных связках, в том числе и в 64-битной системе, все работает, и переписывать нужно только способ запуска класса
Попробуйте еще на терминальном сервере с несколькими одновременно работающими сессиями с Аксаптой - причем даже на w2k3 (который ведать не ведает про заморочки W7/W2K8) - узнаете много интересного
Цитата:
Сообщение от AndreyStar Посмотреть сообщение
для перехвата ошибок делаем в конце главного метода класса потока, не статического, упаковку инфолога в outParams потока, и дополнительно создан глобальный класс менеджер потоков, в котором все потоки регистрируются и через него можно получить доступ к прогрессу выполнения, инфологу и есть возможность прервать по желанию
все подсмотрено в классе TutorialThread, идея менеджера потоков вспомнилась из проектирования многозадачных систем
"Суха теория, мой друг, но древо жизни зеленеет..." Я лично для себя пришел к выводу, что надо все нафиг переписать на .NET, как рекомендовали тут. Объем модификаций вроде как ощутимый, но хочется реально решить проблему "враз и навсегда", а не шаманить с макросами try/catch. Семейство классов SysExcel* модифицируется на раз, с ComExcelDocument_RU все сложнее из-за того, что его экземпляры создаются напрямую через new(). Пока есть реализация на уровне proof of concept, о результатах тестирования непременно доложусь.
За это сообщение автора поблагодарили: someOne (2).
Старый 09.03.2011, 09:04   #6  
AndreyStar is offline
AndreyStar
Участник
 
11 / 23 (1) +++
Регистрация: 01.04.2004
Цитата:
Сообщение от gl00mie Посмотреть сообщение
Попробуйте во время длительного экспорта/импорта попереключаться с окна Аксапты на окна других приложений и обратно или потыкать мышкой в окно Аксапты - все еще "работает без проблем"?
тест был жестким, с 4 машин было запущено по 600 потоков параллельно, в задаче запрос InventTrans + InventDim на тестовых данных, при этом активно переключались между аксаптой и все остальным, велся мониторинг нагрузки, все 2400 соединений отработали на 100% успешно
В предыдущих тестах пытались запустить больше 600, и в районе 700 потоков упирались в размер невыгружаемой памяти win, потоки реально не создавались, но в аксапте регистрировались и зависали в выполнении как в клиенте, так и в активных пользователях
А вообще доработка уже ушла на тест к пользователям, время покажет как она ведет себя в жизни

Цитата:
Сообщение от gl00mie Посмотреть сообщение
Я, может, отстал от жизни, но вроде винды не умеют распараллеливать работу приложения на большее число потоков, чем предусмотрено самим приложением (за исключением, может, кода сервисных библиотек, которые могут создавать собственные дополнительные потоки).
На этот вопрос могут ответить только разработчики из Microsoft, но факт что запуск в потоке помогает
За это сообщение автора поблагодарили: mazzy (2).
Старый 10.03.2011, 11:05   #7  
someOne is offline
someOne
Участник
Аватар для someOne
 
173 / 423 (15) +++++++
Регистрация: 11.12.2008
Адрес: Москва
Цитата:
Сообщение от gl00mie Посмотреть сообщение
Я лично для себя пришел к выводу, что надо все нафиг переписать на .NET, как рекомендовали тут. Объем модификаций вроде как ощутимый, но хочется реально решить проблему "враз и навсегда", а не шаманить с макросами try/catch. Семейство классов SysExcel* модифицируется на раз, с ComExcelDocument_RU все сложнее из-за того, что его экземпляры создаются напрямую через new(). Пока есть реализация на уровне proof of concept, о результатах тестирования непременно доложусь.
Идея с NET - не плохая. Как то сам совсем упустил ее. Попробовал - действительно помогло!!!

Была проблема открытия outlook через COM с вложенным файлом в процедуре обработки счета на оплату. Воспроизводилась лишь на терминальном сервере WinServ 2008 r2. Перевод процедуры на NET проблему решил.

Есть лишь одна проблема такого решения: Не на всех системах, где запускается клиент Аксапты, имеются установленные dll NET компонентов для доступа к office (например Microsoft.Office.Interop.Outlook.dll)

По умолчанию эти компоненты есть лишь на "свежих" ОС типа WinServ 2008, Vista (предполагаю, не проверял). На все другие клиентские места (например XP) придется дополнительно эти компоненты устанавливать и регистрировать - без этого код NET работать не будет. Это дополнительные сложности.

Но тем не менее вариант с NET решения данных проблем мне представляется более "эстетичным"
Старый 26.06.2011, 22:53   #8  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5788 (200) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
Цитата:
Сообщение от gl00mie Посмотреть сообщение
Я лично для себя пришел к выводу, что надо все нафиг переписать на .NET, как рекомендовали тут. Объем модификаций вроде как ощутимый, но хочется реально решить проблему "враз и навсегда", а не шаманить с макросами try/catch. Семейство классов SysExcel* модифицируется на раз, с ComExcelDocument_RU все сложнее из-за того, что его экземпляры создаются напрямую через new(). Пока есть реализация на уровне proof of concept, о результатах тестирования непременно доложусь.
Переписал семейство классов SysExcel на .NET, по ходу дела пришлось добавить несколько новых оберток для интерфейсов Excel, чтобы избавиться от необходимости работать напрямую через COM. Пока повсеместно включать не решился - ограничился лишь стандартным импортом из Excel (класс SysDataExcelCOM) - там тоже понадобилось в несских местах избавиться от прямой работы через COM, но результат превзошел все ожидания! При запуске на терминальном сервере с полусотней параллельно работающих пользовательских сессий импорт из Excel через .NET несмотря на нещадные переключения между окнами (которые раньше валили импорт на раз) не только стабильно завершался без ошибок, но и отрабатывал при этом достаточно шустро - в отличие от "залатанного" импорта через COM, где за счет дополнительных try/catch/retry ошибки вроде как маскировались, но приводили к очень ощутимому замедлению работы.
На очереди - ComExcelDocument_RU, но с ним все сложнее, потому что в отличие от SysExcel* в нем не используется инкапсулированный конструктор, в результате чего подменить класс наследником так вот просто нельзя, и остается либо править кучу мест, где создается его экземпляр, либо нещадно переписывать сам класс...

PS. Тестировалось все на Ms Office 2010.
За это сообщение автора поблагодарили: Logger (15).
Старый 29.06.2011, 14:46   #9  
belugin is offline
belugin
Участник
Аватар для belugin
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,622 / 2925 (107) +++++++++
Регистрация: 16.01.2004
Записей в блоге: 5
Цитата:
Сообщение от gl00mie Посмотреть сообщение
Переписал семейство классов SysExcel на .NET
Через Office SDK или OOXML SDK?
Старый 28.11.2017, 13:09   #10  
AR® is offline
AR®
Участник
 
30 / 15 (1) ++
Регистрация: 07.09.2012
У нас слишком большой диапазон строк?
Вызов ComExcelDocument_RU.findRange(...) падает на всем известном месте
X++:
            #StartSafeCall_RU
            comRange = comApplication.range(bookMark);
            #EndSafeCall_RU
если bookMark == "23:66481" или чему-то вроде того, т.е. номер нижней строки больше 2^16. Это лечится?
Версия Excel - 14 (2010).
Старый 26.04.2018, 10:45   #11  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,889 / 3165 (113) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от AndreyStar Посмотреть сообщение
Проблема возникала только на системах с Win7, XP + Office 2010 + dax 2009 работало без проблем

Когда искал причину, увидел что в других языках обращения к COM компилируются с атрибутом [STAThread] - однопоточное исполнение, ну и появилась мысль что многопоточность Win7 мешает жить.
Народ решал те же проблемы
https://tips.efmsoft.com/ru/asynchronous-com/
И основные проблемы пошли начиная с Vista.
Теги
com-объект, excel, thread, асинхронный com, ошибка

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Ошибка времени выполнения DmitryS DAX: Администрирование 5 17.06.2010 13:14
Ошибка времени выполнения: В NumberSeqReference_Empl_RU (Объект), не найден исполнимый код метода "loadModule" Ksju DAX: Функционал 14 21.10.2009 13:00
Ошибка времени выполнения Stas[SNRC] DAX: Программирование 6 12.03.2008 12:21
Ошибка времени выполнения Didukh84 DAX: Программирование 19 06.03.2008 09:11
Ошибка времени выполнения: Binary (Объект), метод string вызван с недопустимыми параметрами. mmm DAX: Программирование 4 15.05.2007 16:00

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 00:05.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.