04.03.2011, 09:51 | #21 |
Участник
|
Цитата:
все подсмотрено в классе TutorialThread, идея менеджера потоков вспомнилась из проектирования многозадачных систем все реализуемо Последний раз редактировалось AndreyStar; 04.03.2011 в 10:04. |
|
07.03.2011, 12:06 | #22 |
Участник
|
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Сообщение от AndreyStar
для перехвата ошибок делаем в конце главного метода класса потока, не статического, упаковку инфолога в outParams потока, и дополнительно создан глобальный класс менеджер потоков, в котором все потоки регистрируются и через него можно получить доступ к прогрессу выполнения, инфологу и есть возможность прервать по желанию
все подсмотрено в классе TutorialThread, идея менеджера потоков вспомнилась из проектирования многозадачных систем |
|
|
За это сообщение автора поблагодарили: someOne (2). |
09.03.2011, 09:04 | #23 |
Участник
|
Цитата:
В предыдущих тестах пытались запустить больше 600, и в районе 700 потоков упирались в размер невыгружаемой памяти win, потоки реально не создавались, но в аксапте регистрировались и зависали в выполнении как в клиенте, так и в активных пользователях А вообще доработка уже ушла на тест к пользователям, время покажет как она ведет себя в жизни На этот вопрос могут ответить только разработчики из Microsoft, но факт что запуск в потоке помогает |
|
|
За это сообщение автора поблагодарили: mazzy (2). |
10.03.2011, 11:05 | #24 |
Участник
|
Цитата:
Сообщение от 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 решения данных проблем мне представляется более "эстетичным" |
|
19.04.2011, 15:08 | #25 |
Участник
|
См. также
Error executing code: The method has been called with an invalid number of parameters. (EMEA Dynamics AX Support Blog) (Не)перерисовка окна клиента AX 2009 при длительных операциях - вариант решения |
|
26.06.2011, 22:53 | #26 |
Участник
|
Цитата:
Сообщение от gl00mie
Я лично для себя пришел к выводу, что надо все нафиг переписать на .NET, как рекомендовали тут. Объем модификаций вроде как ощутимый, но хочется реально решить проблему "враз и навсегда", а не шаманить с макросами try/catch. Семейство классов SysExcel* модифицируется на раз, с ComExcelDocument_RU все сложнее из-за того, что его экземпляры создаются напрямую через new(). Пока есть реализация на уровне proof of concept, о результатах тестирования непременно доложусь.
На очереди - ComExcelDocument_RU, но с ним все сложнее, потому что в отличие от SysExcel* в нем не используется инкапсулированный конструктор, в результате чего подменить класс наследником так вот просто нельзя, и остается либо править кучу мест, где создается его экземпляр, либо нещадно переписывать сам класс... PS. Тестировалось все на Ms Office 2010. |
|
|
За это сообщение автора поблагодарили: Logger (15). |
29.06.2011, 12:08 | #27 |
NavAx
|
Аналогичным образом перевели на .NET работу с Outlook. Стало гораздо меньше проблем.
Не удивлюсь, если в 2012 увидим полный уход от COM интерфейсов на CLR.
__________________
Жизнь прекрасна! Если, конечно, правильно подобрать антидепрессанты... |
|
29.06.2011, 14:46 | #28 |
Участник
|
|
|
29.06.2011, 15:02 | #29 |
Участник
|
Коварный вопрос... Через Microsoft.Office.Interop.Excel
|
|
02.08.2011, 13:36 | #30 |
Участник
|
Переделали отчеты на .NET с указанием в ссылках АОТ
\References\Microsoft.Office.Interop.Excel Но там жестко прописана версия офиса 2007 (12.0), тк она стоит на сервере с АОС Клиент заходит в АХ с локала, там офис 2003 Имеем ошибку Цитата:
Объект "CLRObject" не может быть создан
System.IO.FileNotFoundException: Невозможно загрузить файл или сборку "Microsoft.Office.Interop.Excel, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" или один из зависимых от них компонентов. Не удается найти указанный файл. Имя файла: "Microsoft.Office.Interop.Excel, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" в System.Reflection.Assembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, Assembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection) в System.Reflection.Assembly.nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, Assembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection) в System.Reflection.Assembly.InternalLoad(AssemblyName assemblyRef, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection) в System.Reflection.Assembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection) в System.AppDomain.Load(String assemblyString) в ClrBridgeImpl.LoadAssembly(ClrBridgeImpl* , Char* assemblyName) в ClrBridgeImpl.NewClrObject(ClrBridgeImpl* , Char* pszClassName, Char* assemblyName, Int32 argsLength, ObjectWrapper** arguments, Boolean* isException) Предупреждение: регистрация привязки сборок выключена. Чтобы включить регистрацию ошибок привязки сборок, установите значение параметра реестра [HKLM\Software\Microsoft\Fusion!EnableLog] (DWORD) в 1. Примечание. Регистрация ошибок привязки сборок может привести к некоторому снижению производительности. Чтобы отключить эту функцию, удалите параметр реестра [HKLM\Software\Microsoft\Fusion!EnableLog]. Если что, сам и отпишусь как решили. Но если кто сталкивался и сразу скажет, куда смотреть - буду сильно признателен. Вариант ставить всем одинаковый Офис - не ок, Когда было через СОМ таких проблем не было Отожрал переход на Ах2009 много нервов и кровушки из-за проблем с отчетами Ехель и Ворд, думали все перешли на .Нет, так нет - продолжает отжирать |
|
02.08.2011, 15:05 | #31 |
Участник
|
Цитата:
По моим наблюдениям сборки для офиса (Microsoft.Office.Interop.Excel.dll) НЕ устанавливаются, например для ОС WinXp при установке office. (C Win 7 проблем не должно быть) Попробуйте скопировать этот файл DLL (Microsoft.Office.Interop.Excel.dll) "вручную", например в папку bin Аксапта клиента. Регистрировать его в GAC не обязательно. Достаточно перезапустить Аксапту. У меня так заработало на WinXp. По поводу версий подключенных к Аксапта библиотек... Не знаю как с 2003 офисом но если подключить к Аксапта сборку DLL от офиса 2007 (версия 12), то написанный код Аксапта будет работать на станции с офисом 2010 (версия 14) без всяких проблем. (Правда все это касается Outlook, но мне кажется что для Excel должно быть то же самое) |
|
|
За это сообщение автора поблагодарили: BOAL (3), Logger (3). |
02.08.2011, 15:51 | #32 |
Участник
|
Кстати, а почему именно 2007 ?
2010 -й не пробовали ? |
|
02.08.2011, 16:35 | #33 |
Участник
|
Просто когда писали метод отправки почты из Аксапта через Outlook - офиса 2010 еще не установливали. Поэтому подключили библиотеку от офиса 2007, и тестировали работу на нем.
Позже, после установки офиса 2010 на новый терминальный сервер выяснилось что и там отправка почты работает без проблем со "старой" dll подключенной в reference Аксапты от офиса 2007 Изменений в Аксапте делать не потребовалось (для "нового" офиса 2010) |
|
02.08.2011, 20:44 | #34 |
Участник
|
клиент запускался на win2003, да, там в папке
C:\Windows\assembly нету подпапки Microsoft.Office.Interop.Excel и ДЛЛ тоже нет Есть только Microsoft.Office.Interop.OWC11 Сервер на win2008 + off2007, там есть C:\Windows\assembly\GAC\Microsoft.Office.Interop.Excel\12.0.0.0__71e9bce111e9429c И речь уж точно не об обновлении на оф2010 Должно работать на том парке офисов, что есть, а это 2007 и 2003 ДЛЛ в Бин засовывать попробуем есть еще такая вот официальная сборочка от МС http://www.microsoft.com/download/en...ng=en&id=18346 |
|
03.08.2011, 12:23 | #35 |
Участник
|
Подложить длл в папку БИН клиента - не помогло
Их нужно как-то на локале регистрировать. В общем, нужно собирать тестовый стенд из разных офисов и мурыжить детальнее. |
|
05.08.2011, 14:41 | #36 |
Участник
|
Отчитываюст:
Собрал тестовый стенд (чтоб не зависеть от компов заказчика) ВинХР+Офис2003 выдает туже ошибку, что приводил выше А вот если в БИН положить ДЛЛ Microsoft.Office.Interop.Excel То все ок! строится! Спасибо Будем разбираться, почему на серве с вин2003 + офис2003 не получилось с папкой бин |
|
05.09.2011, 12:51 | #37 |
Участник
|
Выложил семейство классов SysExcel, переписанное на работу через .NET, см. Взаимодействие с Excel через .NET (семейство классов SysExcel)
|
|
25.10.2011, 19:31 | #38 |
Участник
|
Цитата:
\Classes\SysGridExportToExcel\performPushAndFormatting X++: for (retryCount = 1; retryCount <= 3; retryCount++) { try { // Format the range... break; } catch (Exception::Error) { if (retryCount == 3) { return; } infolog.clear(0); infolog.addTimeOut(infolog, #NotifyMethod, 1000); infolog.wait(); } } X++: sysDictClass = new SysDictClass(classnum(COM)); lcidExist = sysDictClass.hasObjectMethod("lcid"); // ... if(lcidExist) { listSep = WinAPI::getLocaleInfo(#xlEnglishUSLocale, #xlLocaleListSeperator); } else { listSep = excel.international(#xlListSeperator); } // ... cell = cells.item(_numberOfRows + 2, columnToFormat); if(lcidExist) { // Set the locale used by the IDispatch->Invoke method to en-us indicating to // Excel that the formulas are in the en-us locale. Otherwise, we need to // localize to each version of Excel. sysDictClass.callObject("lcid",cell.comObject(),#xlEnglishUSLocale); } |
|
|
За это сообщение автора поблагодарили: Logger (10). |
31.07.2014, 16:11 | #39 |
Участник
|
Добрый день!
А я все же решил попробовать сделать вывод в Excel в другом потоке, т.к. показалось, что это проще с точки зрения реализации. Для анализа завершения потока дописал в WinApi функции работы с событиями, инфолог из нового потока выводится в основной поток - тут проблемы не возникло. Однако когда дочерний поток пытается загрузить ресурс с шаблоном файла Excel, все зависает. Объясните, пжл, почему так происходит и можно ли это исправить. Если указать несуществующую ветку, зависания не произойдет. Если не ждать завершения события, то зависания тоже не будет, но мне нужно вывести инфолог, поэтому жду. Привожу код: X++: static void main(Args _args) { Thread thread = new thread(); container con; int handle; #WinApi ; handle = WinApi::createEvent(); if(!handle) throw error('Не удалось создать событие'); thread.removeOnComplete(true); thread.setInputParm([handle]); thread.run(classnum(ThreadTest), staticmethodstr(ThreadTest, mainThread)); WinApi::waitForSingleObject(handle, #INFINITE); con = thread.getOutputParm(); if(con) info(con2str(con, '\r\n')); } X++: static client void mainThread(thread thread) { int i, eventHandle; container ret; container con; ResourceNode resourceNode; #AOT ; resourceNode = TreeNode::findNode(#ResourcesPath + '\\' + _name_); // все зависает for(i=1; i<=infolog.line(); i++) { ret += infolog.text(i); } thread.setOutputParm(ret); eventHandle = conpeek(thread.getInputParm(), 1); WinApi::setEvent(eventHandle); } X++: client static int createEvent() { DLL _dll = new DLL(#KernelDLL); DLLFunction _function = new DLLFunction(_dll, 'CreateEventW'); ; _function.returns(ExtTypes::DWord); // DWORd _function.arg(ExtTypes::DWord); _function.arg(ExtTypes::DWord); _function.arg(ExtTypes::DWord); _function.arg(ExtTypes::WString); return _function.call(0, false, false, ''); } client static int setEvent(int _handle) { DLL _dll = new DLL(#KernelDLL); DLLFunction _function = new DLLFunction(_dll, 'SetEvent'); ; _function.returns(ExtTypes::DWord); // DWORd _function.arg(ExtTypes::DWord); return _function.call(_handle); } |
|
31.07.2014, 16:37 | #40 |
Участник
|
Решение конечно есть - хранить шаблоны в папке, а не в ресурсах AOT, просто мне казалось, что это современнее. Может быть есть другое? И все таки хотелось бы понять причины такого поведения.
|
|
Теги |
com-объект, excel, thread, асинхронный com, ошибка |
|
|