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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 01.02.2012, 18:25   #1  
iglu is offline
iglu
Участник
 
15 / 10 (1) +
Регистрация: 27.07.2011
Имитация завершения выполнения кода.
Добрый день.
Подскажите, пожалуйста, есть ли возможность в Ax 5-ке сымитировать завершение выполнения запущенного кода (job-а или класса)?
Или какие события происходят при завершении выполнения запущенного кода? Можно ли их вызвать принудительно?
Старый 01.02.2012, 18:42   #2  
George Nordic is offline
George Nordic
Модератор
Аватар для George Nordic
Злыдни
 
4,479 / 1250 (50) ++++++++
Регистрация: 17.12.2003
Адрес: Moscow
Записей в блоге: 9
return? throw?
Старый 01.02.2012, 19:33   #3  
raz is offline
raz
NavAx
Аватар для raz
NavAx Club
Лучший по профессии 2014
Лучший по профессии 2009
 
1,490 / 1060 (38) ++++++++
Регистрация: 22.07.2003
Адрес: МО
скорее ttsabort.

т.е.

ttsbegin;

MyClass:construct().run();

ttsabort;
Старый 01.02.2012, 21:21   #4  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,429 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
iglu, расскажите лучше чего вы этим хотите добиться. Возможно вы ищите ответ не на тот вопрос
Старый 01.02.2012, 23:35   #5  
iglu is offline
iglu
Участник
 
15 / 10 (1) +
Регистрация: 27.07.2011
Объясню подробнее, что имел в виду:
Обнаружилась бага при вызове 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;
    }

}
В рамках одного запуска этого job-а время выполнения увеличивается, но если его перезапустить время начинает считаться заново. Соответственно ищу способ как остановить прирост времени выполнения, например, программно сымитировать остановку выполнения job-а, чтобы время начало считаться заново. Ну или может кто сталкивался с такой ситуацией, или знает как решить, подскажите, плиз.


P.S. Уже пробовал запихнуть обработку одного документа в отдельный статический метод и вызывать этот метод в цикле - не помогает, throw error тоже...
Старый 01.02.2012, 23:36   #6  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Цитата:
Сообщение от iglu Посмотреть сообщение
...сымитировать завершение выполнения запущенного кода (job-а или класса)?...
что значит "сымитировать завершение"? Сказать программе что как бы код закончился, но на самом деле продолжать его выполнение? (на такие мысли натолкнуло слово "сымитировать").
и что вообще вы вкладываете в понятие "завершение запущенного кода"?

и пожалуй присоединюсь к S.Kuskov:
Цитата:
расскажите лучше чего вы этим хотите добиться. Возможно вы ищите ответ не на тот вопрос
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 01.02.2012, 23:43   #7  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Цитата:
Сообщение от 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;
    }

}
В рамках одного запуска этого job-а время выполнения увеличивается, но если его перезапустить время начинает считаться заново. Соответственно ищу способ как остановить прирост времени выполнения, например, программно сымитировать остановку выполнения job-а, чтобы время начало считаться заново. Ну или может кто сталкивался с такой ситуацией, или знает как решить, подскажите, плиз.


P.S. Уже пробовал запихнуть обработку одного документа в отдельный статический метод и вызывать этот метод в цикле - не помогает, throw error тоже...
если честно, яснее не стало
Вы опять не рассказали о том, какую проблему решаете... Расскажите пожалйусто, какая изначально стоит задача? Что нужно выполнить?

P.S. закрадывается подозрение, что Вы как то не так работаете с экселем...
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
Старый 02.02.2012, 00:21   #8  
iglu is offline
iglu
Участник
 
15 / 10 (1) +
Регистрация: 27.07.2011
Цитата:
Сообщение от lev Посмотреть сообщение
Вы опять не рассказали о том, какую проблему решаете... Расскажите пожалйусто, какая изначально стоит задача? Что нужно выполнить?
Нужно напечатать очень много отчетов за определенное время. Решаю проблему времени, из-за нарастания времени выполнения кода печатается слишком долго...
Старый 02.02.2012, 07:59   #9  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,429 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Исследование скорости экспорта данных из 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  
gl00mie is offline
gl00mie
Участник
MCBMSS
Most Valuable Professional
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
3,684 / 5788 (200) ++++++++++
Регистрация: 28.11.2005
Адрес: Москва
Записей в блоге: 3
А отчеты выводятся в Excel? И с помощью ComExcelDocument_RU? А вы Excel закрываете после вывода отчетов, или он остается в памяти висеть? А проц при этом не под завязку грузится? Если нет, то по-быстрому на коленке можно было бы классец сбацать, который принимает в статический метод идентификатор документа или список идентификаторов и выводит соотв. отчет. Ну и батником поназапускать клиентов с xml-файлами для SysAutoRun, за счет чего дергался бы нужный класс.
Старый 02.02.2012, 09:14   #11  
imir is offline
imir
Участник
 
159 / 161 (6) ++++++
Регистрация: 28.05.2010
Цитата:
Сообщение от gl00mie Посмотреть сообщение
. Ну и батником поназапускать клиентов
Это ж никаких лицензий не хватит..

Я запускал приведенный джоб, реально нарастает время выполнения, процессы экселя убиваются, никакие ухищрения с обнулением переменных, вынесением в статические методы, запуск через DictClass.callStatick не помогают. Проц не загружен, память не растет.
Пока джоб не закончится - время растет.
Старый 02.02.2012, 11:16   #12  
imir is offline
imir
Участник
 
159 / 161 (6) ++++++
Регистрация: 28.05.2010
UPD. А вот засовывание кода в поток - помогло, кому интересно, проект приложил.
Вложения
Тип файла: xpo ThreadTest.xpo (4.3 Кб, 406 просмотров)
За это сообщение автора поблагодарили: Ace of Database (2), lev (1), S.Kuskov (1).
Старый 02.02.2012, 19:07   #13  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,653 / 1158 (42) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Основное правило при написании любых циклов

Вынести все то, что не меняется внутри цикла во вне цикла. Исключить бессмысленные повторы.

В данном случае совершенно бессмысленным является открытие/закрытие самого приложения 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  
imir is offline
imir
Участник
 
159 / 161 (6) ++++++
Регистрация: 28.05.2010
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
Основное правило при написании любых циклов

Вынести все то, что не меняется внутри цикла во вне цикла. Исключить бессмысленные повторы.

Время обработки одного цикла по k сразу сократилось примерно в 2,5 раза по сравнению с Вашим первоначальным вариантом.
Данный пример.. как это.. эмулирует, скажем так, одну реальную ситуацию - печать множества разных(!) отчетов подряд в одном цикле. Сами отчеты запускаются в отдельных классах. Т.е. выносить за цикл мы не можем и время обработки нас устраивает, главное - чтобы оно не нарастало.
PS А оно нарастает..

Последний раз редактировалось imir; 02.02.2012 в 19:49.
Старый 02.02.2012, 19:45   #15  
iglu is offline
iglu
Участник
 
15 / 10 (1) +
Регистрация: 27.07.2011
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
В данном случае совершенно бессмысленным является открытие/закрытие самого приложения Excel. Той среды, внутри которой и живут Ваши документы. Вынесите этот процесс во вне цикла, а внутри только открывайте/закрывайте документы
Это уже детали, важно было побороть именно наращивание времени выполнения кода.


Засовывание кода в поток действительно помогло. Всем спасибо.
Старый 02.02.2012, 20:11   #16  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,653 / 1158 (42) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Сообщение от iglu Посмотреть сообщение
Это уже детали, важно было побороть именно наращивание времени выполнения кода.
Дело в том, что у меня никакого "наращивания времени выполнения" на Вашем примере - не происходит. Есть колебания около некой средней величины. Чуть больше, чуть меньше. Но никакого плавного возрастания - нет.

Другими словами, поскольку Вы не выявили причину подобного поведения, то, скорее всего, через некоторое время ситуация повторится. И потоки уже не спасут...

Увеличение времени обработки говорит лишь о том, что были использованы все ресурсы компьютера. Он вынужден тратить время на очистку каких-либо временных данных или сбросе части данных на винт. Прежде всего, это говорит о не оптимально построенной процедуре обработки. Она требует слишком больших ресурсов. Вот в этом направлении и надо смотреть. А использование потоков - это Вы просто дырку заткнули... Пока напор не возрастет, еще будет работать...
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
Старый 02.02.2012, 20:16   #17  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,653 / 1158 (42) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Сообщение от imir Посмотреть сообщение
Данный пример.. как это.. эмулирует, скажем так, одну реальную ситуацию - печать множества разных(!) отчетов подряд в одном цикле. Сами отчеты запускаются в отдельных классах. Т.е. выносить за цикл мы не можем (...).
Почему же не можем? Очень даже можем! Подобные задачи решаются через передачу в соответсвующий класс через set() или parm() методы нужных объектов. Ну, или подчиненный класс обращается к вызвавшему за нужным объектом через get() или parm() методы.

Т.е. Вам надо всего-лишь предусмотреть возможность в Ваших классах приема из-вне экземпляра объекта ComExcelDocument_RU(). И если он передан, то использовать его, а не создавать новый.
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
Старый 03.02.2012, 19:18   #18  
imir is offline
imir
Участник
 
159 / 161 (6) ++++++
Регистрация: 28.05.2010
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
Дело в том, что у меня никакого "наращивания времени выполнения" на Вашем примере - не происходит.

Увеличение времени обработки говорит лишь о том, что были использованы все ресурсы компьютера.
Не, я таки настаиваю - оно прирастает, сделайте побольше сom-вызовов в вашем джобе (см скрин). Про ресурсы компьютера это вообще.. я ж писал - проц отдахыет, память не растет, пямяти у меня 8 гиг.
Миниатюры
Нажмите на изображение для увеличения
Название: Снимок.JPG
Просмотров: 359
Размер:	80.1 Кб
ID:	7525  
Старый 03.02.2012, 20:03   #19  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,653 / 1158 (42) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Сообщение от imir Посмотреть сообщение
Не, я таки настаиваю - оно прирастает, сделайте побольше сom-вызовов в вашем джобе (см скрин).
В Вашем случае количество циклов роли не играет. Вы же закомментировали закрытие документа

X++:
excel.closeDocument(false);
Естесственно, что чем больше документов открыто, тем больше ресурсов потребляется. Снимите комментарии с закрытия документа и повторите проверку.

PS: Кстати, для справки.

В версии Ax2009 в классе ComExcelDocument_RU создали в ClassDeclaration переменную comWorkSheets. Однако в методе closeDocument() эта переменная не обнуляется. Отсюда возникают глюки после первого закрытия документа, поскольку не срабатывает метод getWorkSheets(), где как раз-таки этой переменной и должны присвоить значение.

Для лечения "по быстрому" надо в методе ComExcelDocument_RU.closeDocument() после успешного закрытия документа добавить пару строчек

X++:
m_comDocument = null;
comWorkSheets = null;
А если делать по серьезному, то в методе closeDocument() надо много чего добавлять Например, этот метод вообще не предусматривает вариант, когда в одном экземляре Excel открыто несколько книг (несколько файлов Excel).

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).
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Масштабируемость AOS'а AX 2009 и принципы выполнения кода клиентских сессий на сервере gl00mie DAX: Администрирование 27 28.05.2013 17:40
Отображение места выполнения кода в отладчике kashperuk DAX: Программирование 5 16.08.2006 12:17
проблема с настройкой штрихового кода Nic DAX: Функционал 4 27.12.2004 09:04
Оптимизация кода X++ Владимир Максимов DAX: Программирование 8 19.01.2004 15:24
Имитация связи между таблицами из кода программы Андре DAX: Программирование 3 31.01.2002 11:00

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

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

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