|
28.02.2011, 14:04 | #1 |
Участник
|
Тоже столкнулись с этой проблемой, идея сделать как в российском функционале, с макросами на 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 |
Участник
|
Цитата:
Сообщение от AndreyStar
Когда искал причину, увидел что в других языках обращения к COM компилируются с атрибутом [STAThread] - однопоточное исполнение, ну и появилась мысль что многопоточность Win7 мешает жить. Попытка запустить dax2009 в режиме совместимости чуть улучшила ситуацию, но проблему не решила и тогда пришла идея запустить класс экспорта в отдельном потоке, и все заработало
Сейчас все протестировано в разных связках, в том числе и в 64-битной системе, все работает, и переписывать нужно только способ запуска класса |
|
02.03.2011, 14:12 | #3 |
Участник
|
Цитата:
Сообщение от 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)); 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 |
Участник
|
Цитата:
все подсмотрено в классе TutorialThread, идея менеджера потоков вспомнилась из проектирования многозадачных систем все реализуемо Последний раз редактировалось AndreyStar; 04.03.2011 в 10:04. |
|
07.03.2011, 12:06 | #5 |
Участник
|
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Сообщение от AndreyStar
для перехвата ошибок делаем в конце главного метода класса потока, не статического, упаковку инфолога в outParams потока, и дополнительно создан глобальный класс менеджер потоков, в котором все потоки регистрируются и через него можно получить доступ к прогрессу выполнения, инфологу и есть возможность прервать по желанию
все подсмотрено в классе TutorialThread, идея менеджера потоков вспомнилась из проектирования многозадачных систем |
|
|
За это сообщение автора поблагодарили: someOne (2). |
09.03.2011, 09:04 | #6 |
Участник
|
Цитата:
В предыдущих тестах пытались запустить больше 600, и в районе 700 потоков упирались в размер невыгружаемой памяти win, потоки реально не создавались, но в аксапте регистрировались и зависали в выполнении как в клиенте, так и в активных пользователях А вообще доработка уже ушла на тест к пользователям, время покажет как она ведет себя в жизни На этот вопрос могут ответить только разработчики из Microsoft, но факт что запуск в потоке помогает |
|
|
За это сообщение автора поблагодарили: mazzy (2). |
10.03.2011, 11:05 | #7 |
Участник
|
Цитата:
Сообщение от gl00mie
Я лично для себя пришел к выводу, что надо все нафиг переписать на .NET, как рекомендовали тут. Объем модификаций вроде как ощутимый, но хочется реально решить проблему "враз и навсегда", а не шаманить с макросами try/catch. Семейство классов SysExcel* модифицируется на раз, с ComExcelDocument_RU все сложнее из-за того, что его экземпляры создаются напрямую через new(). Пока есть реализация на уровне proof of concept, о результатах тестирования непременно доложусь.
Была проблема открытия 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
Я лично для себя пришел к выводу, что надо все нафиг переписать на .NET, как рекомендовали тут. Объем модификаций вроде как ощутимый, но хочется реально решить проблему "враз и навсегда", а не шаманить с макросами try/catch. Семейство классов SysExcel* модифицируется на раз, с ComExcelDocument_RU все сложнее из-за того, что его экземпляры создаются напрямую через new(). Пока есть реализация на уровне proof of concept, о результатах тестирования непременно доложусь.
На очереди - ComExcelDocument_RU, но с ним все сложнее, потому что в отличие от SysExcel* в нем не используется инкапсулированный конструктор, в результате чего подменить класс наследником так вот просто нельзя, и остается либо править кучу мест, где создается его экземпляр, либо нещадно переписывать сам класс... PS. Тестировалось все на Ms Office 2010. |
|
|
За это сообщение автора поблагодарили: Logger (15). |
29.06.2011, 14:46 | #9 |
Участник
|
|
|
28.11.2017, 13:09 | #10 |
Участник
|
У нас слишком большой диапазон строк?
Вызов ComExcelDocument_RU.findRange(...) падает на всем известном месте
X++: #StartSafeCall_RU comRange = comApplication.range(bookMark); #EndSafeCall_RU Версия Excel - 14 (2010). |
|
26.04.2018, 10:45 | #11 |
Участник
|
Цитата:
Сообщение от AndreyStar
Проблема возникала только на системах с Win7, XP + Office 2010 + dax 2009 работало без проблем
Когда искал причину, увидел что в других языках обращения к COM компилируются с атрибутом [STAThread] - однопоточное исполнение, ну и появилась мысль что многопоточность Win7 мешает жить. https://tips.efmsoft.com/ru/asynchronous-com/ И основные проблемы пошли начиная с Vista. |
|
Теги |
com-объект, excel, thread, асинхронный com, ошибка |
|
|