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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 19.04.2007, 08:05   #1  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Какие проблемы у SysOperationProgress?
Здесь aEremenko: Update_RecordSet
я советовал пользоваться классом SysOperationProgress для отображения текущего статуса выполнения.

Было очень много намеков, что этот класс работает плохо.

Цитата:
Сообщение от slava Посмотреть сообщение
Особенно чудные результаты дает этот класс при работе с несколькими компаниями.
Для обсуждения создал новую ветку.
__________________
полезное на axForum, github, vk, coub.
Старый 19.04.2007, 09:04   #2  
Recoilme is offline
Recoilme
злыдень
Аватар для Recoilme
Злыдни
 
895 / 192 (8) ++++++
Регистрация: 18.06.2003
Смотри ветку:
Тормозит ли градусник
30 минут из 40 тратить на перерисовку текста - это ненормально, притом что кода там - 2 строчки поправить
__________________
Ибо зло есть лучшая сила человека. "Человек должен становиться все лучше и злее" -- так учу я. /Ф. Ницше/
Старый 19.04.2007, 09:44   #3  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от Recoilme Посмотреть сообщение
Смотри ветку:
Тормозит ли градусник
30 минут из 40 тратить на перерисовку текста - это ненормально, притом что кода там - 2 строчки поправить
Вам несколько людей пытались объяснить, что не тратит прогресс-бар столько времени на прорисовку. Но вам "надоело ковыряться".

Я могу только повторить - разберитесь со стандартным кодом.
Разберитесь с tutorial_progress как работает прогресс-бар в двухуровневой и трехуровневой системе.

Ок. Recoilme, большое спасибо за ваш ценный вклад.

Еще проблемы есть?
Я, например, очень хотел бы понять что за проблемы с переключением компании. Прогрусс-бар вообще не должен зависеть от компаний.
А еще?
__________________
полезное на axForum, github, vk, coub.
Старый 19.04.2007, 10:17   #4  
ivas is offline
ivas
Участник
Аватар для ivas
 
252 / 68 (3) ++++
Регистрация: 22.12.2005
код:
PHP код:
#Define.LoopCount(100000)
static void Job1(Args _args)
{
    
SysOperationProgress pBar = new SysOperationProgress();
    
int time timeNow();
    
int ij;
    ;
    
pBar.setCaption("Обработка");
    for (
0#LoopCount; i++)
    
{
        
pBar.setText(strfmt("Операция № %1"i));
        
pBar.incCount();
        
j++;
    }
    
info(strfmt("Прошло: %1 сек."timeNow() - time));

c прогресс баром работает минуту
без < 1сек
а если у нас 10 000 000 циклов (например бежим по InventTrans)
получается прогресс бар отожрет почти 2 часа

Последний раз редактировалось ivas; 19.04.2007 в 10:20.
Старый 19.04.2007, 10:27   #5  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от ivas Посмотреть сообщение
код:
PHP код:
#Define.LoopCount(100000)
static void Job1(Args _args)
{
    
SysOperationProgress pBar = new SysOperationProgress();
    
int time timeNow();
    
int ij;
    ;
    
pBar.setCaption("Обработка");
    
pBar.setCount(#LoopCount);
    
for (0#LoopCount; i++)
    
{
        
pBar.setText(strfmt("Операция № %1"i));
        
pBar.incCount();
        
j++;
    }
    
info(strfmt("Прошло: %1 сек."timeNow() - time));

c прогресс баром работает минуту
без < 1сек
а если у нас 10 000 000 циклов (например бежим по InventTrans)
получается прогресс бар отожрет почти 2 часа
Еще бы. Этот цикл ничего кроме показа прогресс бара и не делает.

Представьте нормальную работу... Представили?

Нет-нет, вы представьте действительно нормальную работу Аксапты: в каждом цикле делается поиск, расчет какой-нибудь себестоимости, проверка какого-нибудь дурацкого кредитного лимита, запись результатов расчета по нескольким таблицам, неизбежные блокировки...

Как вы думаете, сколько часов займет в Аксапте выполнение 10млн циклов при НОРМАЛЬНОЙ работе? Вы предлагаете пользователю ждать все это время, не имея никакой информации о ходе работ? Я правильно понимаю, что вы предлагаете пользователю сидеть несколько часов-суток перед пустым экраном? Я не ошибся?

Да, прогресс-бар сам занимает некоторое количество ресурсов.
Но его польза при больших нормальных обработках гораздо больше, нежели какие-то жалкие несколько процентов дополнительного времени...

Возвращаясь к вашему коду.
Вы просто не умеете его готовить.
Во-первых, вы не установили setTotal.
Во-вторых, если отображение прогресс-бара выполняет дольше чем сама работа, то надо пользоваться методом UpdateInterval(), чтобы установить большее время между обновлениями.

Посмотрите же в метод update(), люди!
__________________
полезное на axForum, github, vk, coub.
За это сообщение автора поблагодарили: alex55 (1).
Старый 19.04.2007, 10:37   #6  
ivas is offline
ivas
Участник
Аватар для ivas
 
252 / 68 (3) ++++
Регистрация: 22.12.2005
согласен, setCount по запарке вставил
вот по вашему совету
Код:
#Define.LoopCount(100000)
static void Job80(Args _args)
{
    SysOperationProgress pBar = new SysOperationProgress();
    int time = timeNow();
    int i, j;
    ;
    pBar.setCaption("Обработка");
    pBar.updateInterval(10);  // типа ускорение?
    for (i = 0; i < #LoopCount; i++)
    {
        pBar.setText(strfmt("Операция № %1", i));
        pBar.incCount();
        j++;
    }
    info(strfmt("Прошло: %1 сек.", timeNow() - time));
}
по времени +10 сек
дело в том что действительно сталкивался с этим в реальной обработке:
предварительная выгрузка inventTrans (15000000 строк) в мапу
с прогресс баром 4часа без 2часа
решилось добавлением пары строк
PHP код:
 for (0#LoopCount; i++)
    
{
        if (
i mod 1000 == 0)
        {
              
pBarar.setText(strfmt("Операция № %1"i));
              
pBar.incCount(1000);
        }
        
j++;
    } 
За это сообщение автора поблагодарили: Recoilme (5).
Старый 19.04.2007, 10:42   #7  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от ivas Посмотреть сообщение
X++:
    pBar.updateInterval(10);  // типа ускорение?
Типа да. Только в вашем случае вполне можно поставить и 100.

Цитата:
Сообщение от ivas Посмотреть сообщение
по времени +10 сек
В смысле?
__________________
полезное на axForum, github, vk, coub.
Старый 19.04.2007, 10:47   #8  
Recoilme is offline
Recoilme
злыдень
Аватар для Recoilme
Злыдни
 
895 / 192 (8) ++++++
Регистрация: 18.06.2003
Хоть кто то вменяемый тут есть..Спасибо ivas)
Я решил проблему точно так же, только код вставил в sysoperationprogress, чтоб не возвращаться к этому вопросу в дальнейшем
X++:
            //VKUL -- Quick Progress --
            countIncrement[_idx] +=_progressCountIncrement;
            if (countIncrement[_idx] == updateCount[_idx])
            {
                this.setCount(progressCount[_idx] + countIncrement[_idx],_idx);
                countIncrement[_idx]  =   0;
            }
            //VKUL -- Quick Progress --
            //this.setCount(progressCount[_idx] + _progressCountIncrement,_idx);
__________________
Ибо зло есть лучшая сила человека. "Человек должен становиться все лучше и злее" -- так учу я. /Ф. Ницше/

Последний раз редактировалось Recoilme; 19.04.2007 в 10:55.
Старый 19.04.2007, 10:47   #9  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Сергей, при таком большом количестве вызовов уже вступает в действие общая тормознутость пользовательского кода. На фоне сотни тысяч вызовов методов setText() и incCount() несколько десятков раз обновление формы просто теряется.
updateInterval() тут уже не поможет.

Можно написать дополнительный метод, который объединяет в себе изменение текста и кол-ва шагов - получим выигрышь около 50%.
А можно перенести функциональность метода update() в свой код - т.е. вызывать обновление только по истечение интервала времени - в этом случае торможения практически не будет
__________________
Axapta v.3.0 sp5 kr2
За это сообщение автора поблагодарили: mazzy (5).
Старый 19.04.2007, 10:49   #10  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от AndyD Посмотреть сообщение
Сергей, при таком большом количестве вызовов уже вступает в действие общая тормознутость пользовательского кода.
Понял. Спасибо.

Так каков вывод? этим классом нужно/можно/нельзя пользоваться?
__________________
полезное на axForum, github, vk, coub.
Старый 19.04.2007, 10:51   #11  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Запустил у себя тест:
X++:
#Define.LoopCount(100000)
static void Job6(Args _args)
{
    SysOperationProgress pBar = new SysOperationProgress();
    int time = timeNow();
    int i, j;
    ;
    pBar.setCaption("Обработка");
    pBar.setTotal(#LoopCount);
    //pBar.updateInterval(100);
    for (i = 0; i < #LoopCount; i++)
    {
        pBar.setText(strfmt("Операция № %1", i));
        //pBar.incCount();
        j++;
    }
    info(strfmt("Прошло: %1 сек.", timeNow() - time));
}
Со всеми методами: 14 сек
если выключить один из методов: 6 сек.
если выключить все методы: 0 сек.

В данном случае длительность updateInterval(100) не влияет.
Просто если его устанавливать, то окошко не показывается.
__________________
полезное на axForum, github, vk, coub.
Старый 19.04.2007, 10:52   #12  
ivas is offline
ivas
Участник
Аватар для ivas
 
252 / 68 (3) ++++
Регистрация: 22.12.2005
Цитата:
Так каков вывод? этим классом нужно/можно/нельзя пользоваться?
конечно нужно
а есть варианты?
Старый 19.04.2007, 10:56   #13  
ivas is offline
ivas
Участник
Аватар для ivas
 
252 / 68 (3) ++++
Регистрация: 22.12.2005
Цитата:
В данном случае длительность updateInterval(100) не влияет
имхо она вообще не влияет на скорость работы ну может +-1%
Старый 19.04.2007, 10:56   #14  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от ivas Посмотреть сообщение
конечно нужно
а есть варианты?
Варианты конечно есть.
Хорошо. Нужно. Идем дальше.

Какие у этого класса проблемы (помимо "общей тормознутости пользовательского кода")?

здесь прозвучало очень интересное сообщение о проблемах при переключении между компаниями?
Такое действительно у кого-нибудь было?

Какие еще проблемы есть?
__________________
полезное на axForum, github, vk, coub.
Старый 19.04.2007, 10:57   #15  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,560 / 2479 (88) +++++++++
Регистрация: 20.08.2005
Конечно, можно
Простейшее
X++:
    int tm = timeNow();
    int interval = 1;
...

        if (timeNow()-tm >= interval)
        {
            pBar.incCountText(strfmt("Операция ? %1", i), i-pBar.getCount_RU());
            tm = timeNow();
        }
практически полность уберет негативное влияние вызова методов прогрессбара
incCountText() - добавил метод для одновременного измения текста и прогресса
PS миднайт не учитываю для простоты
__________________
Axapta v.3.0 sp5 kr2

Последний раз редактировалось AndyD; 19.04.2007 в 10:59.
Старый 19.04.2007, 10:58   #16  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от ivas Посмотреть сообщение
имхо она вообще не влияет на скорость работы ну может +-1%
Блин, сделайте нормальную обработку: Изменяйте что нибудь в базе и сравните.
Или сделайте вместо куцего ++j паузу хотя бы на 200 милисекунд sleep(200);
Сравните.
__________________
полезное на axForum, github, vk, coub.
Старый 19.04.2007, 10:59   #17  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от AndyD Посмотреть сообщение
Конечно, можно
Простейшее
Да, но заманаешься такое в код вставлять. Но еще раз спасибо.
__________________
полезное на axForum, github, vk, coub.
Старый 19.04.2007, 11:06   #18  
ivas is offline
ivas
Участник
Аватар для ivas
 
252 / 68 (3) ++++
Регистрация: 22.12.2005
Цитата:
здесь прозвучало очень интересное сообщение о проблемах при переключении между компаниями?
Такое действительно у кого-нибудь было?
этого быть не может по определению чисто графический элемент неможет зависить от структуры бд и тп

Цитата:
Или сделайте вместо куцего ++j паузу хотя бы на 200 милисекунд sleep(200);
Сравните.
j++
это не задержка просто проверял не выкинул ли оптимизатор мой цикл
кстати он вообще есть в аксапте? всмысле оптимизатор
Старый 19.04.2007, 11:14   #19  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от ivas Посмотреть сообщение
всмысле оптимизатор
оптимизатора кода в аксапте нет
__________________
полезное на axForum, github, vk, coub.
Старый 19.04.2007, 15:50   #20  
slava is offline
slava
сибиряк
Самостоятельные клиенты AX
 
468 / 23 (1) +++
Регистрация: 28.12.2001
Адрес: Москва
Цитата:
Сообщение от mazzy Посмотреть сообщение
здесь прозвучало очень интересное сообщение о проблемах при переключении между компаниями?
Мое предположение, у меня и было. Ситуация: создание нескольких сотен заказов, создание закупки по ним (это все в компании 1), и создание продажи по ним (в компании 2). Обработка по продажам и закупкам счетов на оплату. Для перехода между компаниями - changecompany. Дык вот через раз Аксапта "путалась" в какой компании она разносит. Причем путалась на ровном месте (то есть в различных частях кода). Пока не "отключил" прогресс в классах обработки именно для этой операции. После этого - ни одной ошибки. Так что претензии не к самому прогрессу, а к связке его работы в рамках нескольких компаний.
__________________
С уважением, Вячеслав.
Теги
progress bar, sysoperationprogress, баг, бегунок, законченный пример, полезное, смена компании

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Проблемы с Exists Join Logger DAX: Программирование 28 28.04.2010 02:54
Enterprise Portal: какие могут быть проблемы? sminex_ax DAX: Администрирование 0 16.05.2008 12:37
Проблемы быстродействия Axapta 3.0 Alexandr A. Osipkin DAX: Администрирование 37 16.02.2007 22:43
Проблемы работы ERP в многофилиальной и территориально разнесённой компании СНГ. SlavaK DAX: Прочие вопросы 18 02.03.2004 15:25

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 20:03.