01.02.2012, 18:25 | #1 |
Участник
|
Имитация завершения выполнения кода.
Добрый день.
Подскажите, пожалуйста, есть ли возможность в Ax 5-ке сымитировать завершение выполнения запущенного кода (job-а или класса)? Или какие события происходят при завершении выполнения запущенного кода? Можно ли их вызвать принудительно? |
|
01.02.2012, 18:42 | #2 |
Модератор
|
return? throw?
|
|
01.02.2012, 19:33 | #3 |
NavAx
|
скорее ttsabort.
т.е. ttsbegin; MyClass:construct().run(); ttsabort; |
|
01.02.2012, 21:21 | #4 |
Участник
|
iglu, расскажите лучше чего вы этим хотите добиться. Возможно вы ищите ответ не на тот вопрос
|
|
01.02.2012, 23:35 | #5 |
Участник
|
Объясню подробнее, что имел в виду:
Обнаружилась бага при вызове COM методов из Ax. Последовательное открытие и осуществление каких-либо действий через COM методы с большим количеством Excel-документов вызывает увеличение длительности выполнения COM методов после каждого документа. Смоделировать можно с помощью job-а: X++: static void ComExcelDocument_RU(Args _args) { ComExcelDocument_RU excel; counter startTime, endTime; com range; int i, j; while(1==1) { startTime = WinAPI::getTickCount(); for(j=1; j < 10; j++) { excel = new ComExcelDocument_RU(); excel.newFile('',false); for(i=1; i < 10; i++) { range = excel.findRange("A1"); range.value2("dsf"); } excel.closeDocument(false); excel.quitApplication(false); excel.finalize(); } print (WinAPI::getTickCount() - startTime) / 1000; } } P.S. Уже пробовал запихнуть обработку одного документа в отдельный статический метод и вызывать этот метод в цикле - не помогает, throw error тоже... |
|
01.02.2012, 23:36 | #6 |
Ищущий знания...
|
Цитата:
и что вообще вы вкладываете в понятие "завершение запущенного кода"? и пожалуй присоединюсь к S.Kuskov: Цитата:
расскажите лучше чего вы этим хотите добиться. Возможно вы ищите ответ не на тот вопрос
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
01.02.2012, 23:43 | #7 |
Ищущий знания...
|
Цитата:
Сообщение от iglu
Объясню подробнее, что имел в виду:
Обнаружилась бага при вызове COM методов из Ax. Последовательное открытие и осуществление каких-либо действий через COM методы с большим количеством Excel-документов вызывает увеличение длительности выполнения COM методов после каждого документа. Смоделировать можно с помощью job-а: X++: static void ComExcelDocument_RU(Args _args) { ComExcelDocument_RU excel; counter startTime, endTime; com range; int i, j; while(1==1) { startTime = WinAPI::getTickCount(); for(j=1; j < 10; j++) { excel = new ComExcelDocument_RU(); excel.newFile('',false); for(i=1; i < 10; i++) { range = excel.findRange("A1"); range.value2("dsf"); } excel.closeDocument(false); excel.quitApplication(false); excel.finalize(); } print (WinAPI::getTickCount() - startTime) / 1000; } } P.S. Уже пробовал запихнуть обработку одного документа в отдельный статический метод и вызывать этот метод в цикле - не помогает, throw error тоже... Вы опять не рассказали о том, какую проблему решаете... Расскажите пожалйусто, какая изначально стоит задача? Что нужно выполнить? P.S. закрадывается подозрение, что Вы как то не так работаете с экселем...
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
02.02.2012, 00:21 | #8 |
Участник
|
Нужно напечатать очень много отчетов за определенное время. Решаю проблему времени, из-за нарастания времени выполнения кода печатается слишком долго...
|
|
02.02.2012, 07:59 | #9 |
Участник
|
Исследование скорости экспорта данных из Axapta в Excel (коллективный эксперимент)
Поговорим об ADO Поговорим об MS Script Control Ещё, если переписывать отчёты для вас не вариант, то тогда для увеличении производительности можно попробовать распаралелить их построение. Какждый отчёт запускать в отдельном потоке. Это, к стати, поможет ещё и застраховаться от ошибок, появляющихся на ровном месте: Ошибка времени выполнения в ComExcelDocument_RU.findRange() Цитата:
Сообщение от AndreyStar
Когда искал причину, увидел что в других языках обращения к COM компилируются с атрибутом [STAThread] - однопоточное исполнение, ну и появилась мысль что многопоточность Win7 мешает жить. Попытка запустить dax2009 в режиме совместимости чуть улучшила ситуацию, но проблему не решила и тогда пришла идея запустить класс экспорта в отдельном потоке, и все заработало
Последний раз редактировалось S.Kuskov; 02.02.2012 в 08:16. |
|
|
За это сообщение автора поблагодарили: lev (5). |
02.02.2012, 08:15 | #10 |
Участник
|
А отчеты выводятся в Excel? И с помощью ComExcelDocument_RU? А вы Excel закрываете после вывода отчетов, или он остается в памяти висеть? А проц при этом не под завязку грузится? Если нет, то по-быстрому на коленке можно было бы классец сбацать, который принимает в статический метод идентификатор документа или список идентификаторов и выводит соотв. отчет. Ну и батником поназапускать клиентов с xml-файлами для SysAutoRun, за счет чего дергался бы нужный класс.
|
|
02.02.2012, 09:14 | #11 |
Участник
|
Это ж никаких лицензий не хватит..
Я запускал приведенный джоб, реально нарастает время выполнения, процессы экселя убиваются, никакие ухищрения с обнулением переменных, вынесением в статические методы, запуск через DictClass.callStatick не помогают. Проц не загружен, память не растет. Пока джоб не закончится - время растет. |
|
02.02.2012, 11:16 | #12 |
Участник
|
UPD. А вот засовывание кода в поток - помогло, кому интересно, проект приложил.
|
|
|
За это сообщение автора поблагодарили: Ace of Database (2), lev (1), S.Kuskov (1). |
02.02.2012, 19:07 | #13 |
Участник
|
Основное правило при написании любых циклов
Вынести все то, что не меняется внутри цикла во вне цикла. Исключить бессмысленные повторы. В данном случае совершенно бессмысленным является открытие/закрытие самого приложения Excel. Той среды, внутри которой и живут Ваши документы. Вынесите этот процесс во вне цикла, а внутри только открывайте/закрывайте документы X++: static void Job_Test(Args _args) { ComExcelDocument_RU excel; counter startTime, endTime; com range; int i, j, k; excel = new ComExcelDocument_RU(); for(k=1; k <= 5; k++) { startTime = timeNow(); for(j=1; j < 10; j++) { excel.newFile('',false); for(i=1; i < 10; i++) { range = excel.findRange("A1"); range.value2("dsf"); } // for(i=1; i < 10; i++) excel.closeDocument(false); } // for(j=1; j < 10; j++) print time2str(timeNow()-startTime,1,1); } // for(k=1; k <= 5; k++) excel.quitApplication(false); excel.finalize(); pause; } Время обработки одного цикла по k сразу сократилось примерно в 2,5 раза по сравнению с Вашим первоначальным вариантом.
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
02.02.2012, 19:41 | #14 |
Участник
|
Цитата:
PS А оно нарастает.. Последний раз редактировалось imir; 02.02.2012 в 19:49. |
|
02.02.2012, 19:45 | #15 |
Участник
|
Цитата:
Засовывание кода в поток действительно помогло. Всем спасибо. |
|
02.02.2012, 20:11 | #16 |
Участник
|
Цитата:
Другими словами, поскольку Вы не выявили причину подобного поведения, то, скорее всего, через некоторое время ситуация повторится. И потоки уже не спасут... Увеличение времени обработки говорит лишь о том, что были использованы все ресурсы компьютера. Он вынужден тратить время на очистку каких-либо временных данных или сбросе части данных на винт. Прежде всего, это говорит о не оптимально построенной процедуре обработки. Она требует слишком больших ресурсов. Вот в этом направлении и надо смотреть. А использование потоков - это Вы просто дырку заткнули... Пока напор не возрастет, еще будет работать...
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
02.02.2012, 20:16 | #17 |
Участник
|
Цитата:
Т.е. Вам надо всего-лишь предусмотреть возможность в Ваших классах приема из-вне экземпляра объекта ComExcelDocument_RU(). И если он передан, то использовать его, а не создавать новый.
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
03.02.2012, 19:18 | #18 |
Участник
|
Не, я таки настаиваю - оно прирастает, сделайте побольше сom-вызовов в вашем джобе (см скрин). Про ресурсы компьютера это вообще.. я ж писал - проц отдахыет, память не растет, пямяти у меня 8 гиг.
|
|
03.02.2012, 20:03 | #19 |
Участник
|
Цитата:
X++: excel.closeDocument(false); PS: Кстати, для справки. В версии Ax2009 в классе ComExcelDocument_RU создали в ClassDeclaration переменную comWorkSheets. Однако в методе closeDocument() эта переменная не обнуляется. Отсюда возникают глюки после первого закрытия документа, поскольку не срабатывает метод getWorkSheets(), где как раз-таки этой переменной и должны присвоить значение. Для лечения "по быстрому" надо в методе ComExcelDocument_RU.closeDocument() после успешного закрытия документа добавить пару строчек X++: m_comDocument = null; comWorkSheets = null; X++: // Учет возможности работы с несколькими книгами в одном экземпляре Excel в классе ComExcelDocument_RU public void closeDocument(boolean _save = false, int _workBook = 1) { COM comWorkBooks; COM comWorkBook; // RTG, 19.12.2005, МВБ --> int countWorkBooks; // количество рабочих книг boolean isClosedSelectedWorkBooks; // Закрывается ли текущая рабочая книга // RTG, 19.12.2005, МВБ <-- try { if (m_comApplication) { m_comApplication.cutCopyMode(false); // 08.04.2004, Использование нескольких листов comWorkBooks = m_comApplication.workBooks(); // RTG, 19.12.2005, МВБ --> /* comWorkBook = comWorkBooks.item(_workBook); comWorkBook.close(_save); */ countWorkBooks = comWorkBooks.Count(); if (_workBook > 0 && _workBook <= countWorkBooks) { comWorkBook = comWorkBooks.item(_workBook); isClosedSelectedWorkBooks = (comWorkBook.name() == m_comDocument.name()); comWorkBook.close(_save); } if (isClosedSelectedWorkBooks) { countWorkBooks = comWorkBooks.Count(); if (countWorkBooks) { m_comDocument = comWorkBooks.Item(countWorkBooks); } else { m_comDocument = null; comWorkSheets = null; } } // RTG, 19.12.2005, МВБ <-- return; } } catch (Exception::Error) { exceptionTextFallThrough(); } catch(Exception::Internal) { exceptionTextFallThrough(); } error(this.getCOMErrorMsg()); if (comWorkBook) { comWorkBook.detach(); } if (comWorkBooks) { comWorkBooks.detach(); } }
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... Последний раз редактировалось Владимир Максимов; 03.02.2012 в 20:37. |
|
|
За это сообщение автора поблагодарили: Maxim Gorbunov (2). |