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

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

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

Цитата:
Сообщение от slava Посмотреть сообщение
Особенно чудные результаты дает этот класс при работе с несколькими компаниями.
Для обсуждения создал новую ветку.
__________________
GitHub, Facebook, mazzy.priot, mazzy.music, coub.
Старый 19.04.2007, 09:04   #2  
Recoilme is offline
Recoilme
злыдень
Аватар для Recoilme
Злыдни
 
895 / 190 (8) ++++++
Регистрация: 18.06.2003
Смотри ветку:
Тормозит ли градусник
30 минут из 40 тратить на перерисовку текста - это ненормально, притом что кода там - 2 строчки поправить
__________________
Ибо зло есть лучшая сила человека. "Человек должен становиться все лучше и злее" -- так учу я. /Ф. Ницше/
Старый 19.04.2007, 09:44   #3  
mazzy is offline
mazzy
Administrator
Аватар для mazzy
Most Valuable Professional
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
28,760 / 3627 (178) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Цитата:
Сообщение от Recoilme Посмотреть сообщение
Смотри ветку:
Тормозит ли градусник
30 минут из 40 тратить на перерисовку текста - это ненормально, притом что кода там - 2 строчки поправить
Вам несколько людей пытались объяснить, что не тратит прогресс-бар столько времени на прорисовку. Но вам "надоело ковыряться".

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

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

Еще проблемы есть?
Я, например, очень хотел бы понять что за проблемы с переключением компании. Прогрусс-бар вообще не должен зависеть от компаний.
А еще?
__________________
GitHub, Facebook, mazzy.priot, mazzy.music, coub.
Старый 19.04.2007, 10:17   #4  
ivas is offline
ivas
Участник
Аватар для ivas
 
248 / 65 (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
Administrator
Аватар для mazzy
Most Valuable Professional
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
28,760 / 3627 (178) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Цитата:
Сообщение от 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(), люди!
__________________
GitHub, Facebook, mazzy.priot, mazzy.music, coub.
За это сообщение автора поблагодарили: alex55 (1).
Старый 19.04.2007, 10:37   #6  
ivas is offline
ivas
Участник
Аватар для ivas
 
248 / 65 (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
Administrator
Аватар для mazzy
Most Valuable Professional
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
28,760 / 3627 (178) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Цитата:
Сообщение от ivas Посмотреть сообщение
X++:
    pBar.updateInterval(10);  // типа ускорение?
Типа да. Только в вашем случае вполне можно поставить и 100.

Цитата:
Сообщение от ivas Посмотреть сообщение
по времени +10 сек
В смысле?
__________________
GitHub, Facebook, mazzy.priot, mazzy.music, coub.
Старый 19.04.2007, 10:47   #8  
Recoilme is offline
Recoilme
злыдень
Аватар для Recoilme
Злыдни
 
895 / 190 (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,555 / 2313 (83) +++++++++
Регистрация: 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
Administrator
Аватар для mazzy
Most Valuable Professional
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
28,760 / 3627 (178) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Цитата:
Сообщение от AndyD Посмотреть сообщение
Сергей, при таком большом количестве вызовов уже вступает в действие общая тормознутость пользовательского кода.
Понял. Спасибо.

Так каков вывод? этим классом нужно/можно/нельзя пользоваться?
__________________
GitHub, Facebook, mazzy.priot, mazzy.music, coub.
Старый 19.04.2007, 10:51   #11  
mazzy is offline
mazzy
Administrator
Аватар для mazzy
Most Valuable Professional
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
28,760 / 3627 (178) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Запустил у себя тест:
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) не влияет.
Просто если его устанавливать, то окошко не показывается.
__________________
GitHub, Facebook, mazzy.priot, mazzy.music, coub.
Старый 19.04.2007, 10:52   #12  
ivas is offline
ivas
Участник
Аватар для ivas
 
248 / 65 (3) ++++
Регистрация: 22.12.2005
Цитата:
Так каков вывод? этим классом нужно/можно/нельзя пользоваться?
конечно нужно
а есть варианты?
Старый 19.04.2007, 10:56   #13  
ivas is offline
ivas
Участник
Аватар для ivas
 
248 / 65 (3) ++++
Регистрация: 22.12.2005
Цитата:
В данном случае длительность updateInterval(100) не влияет
имхо она вообще не влияет на скорость работы ну может +-1%
Старый 19.04.2007, 10:56   #14  
mazzy is offline
mazzy
Administrator
Аватар для mazzy
Most Valuable Professional
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
28,760 / 3627 (178) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Цитата:
Сообщение от ivas Посмотреть сообщение
конечно нужно
а есть варианты?
Варианты конечно есть.
Хорошо. Нужно. Идем дальше.

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

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

Какие еще проблемы есть?
__________________
GitHub, Facebook, mazzy.priot, mazzy.music, coub.
Старый 19.04.2007, 10:57   #15  
AndyD is offline
AndyD
Участник
КОРУС Консалтинг
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
 
2,555 / 2313 (83) +++++++++
Регистрация: 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
Administrator
Аватар для mazzy
Most Valuable Professional
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
28,760 / 3627 (178) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Цитата:
Сообщение от ivas Посмотреть сообщение
имхо она вообще не влияет на скорость работы ну может +-1%
Блин, сделайте нормальную обработку: Изменяйте что нибудь в базе и сравните.
Или сделайте вместо куцего ++j паузу хотя бы на 200 милисекунд sleep(200);
Сравните.
__________________
GitHub, Facebook, mazzy.priot, mazzy.music, coub.
Старый 19.04.2007, 10:59   #17  
mazzy is offline
mazzy
Administrator
Аватар для mazzy
Most Valuable Professional
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
28,760 / 3627 (178) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Цитата:
Сообщение от AndyD Посмотреть сообщение
Конечно, можно
Простейшее
Да, но заманаешься такое в код вставлять. Но еще раз спасибо.
__________________
GitHub, Facebook, mazzy.priot, mazzy.music, coub.
Старый 19.04.2007, 11:06   #18  
ivas is offline
ivas
Участник
Аватар для ivas
 
248 / 65 (3) ++++
Регистрация: 22.12.2005
Цитата:
здесь прозвучало очень интересное сообщение о проблемах при переключении между компаниями?
Такое действительно у кого-нибудь было?
этого быть не может по определению чисто графический элемент неможет зависить от структуры бд и тп

Цитата:
Или сделайте вместо куцего ++j паузу хотя бы на 200 милисекунд sleep(200);
Сравните.
j++
это не задержка просто проверял не выкинул ли оптимизатор мой цикл
кстати он вообще есть в аксапте? всмысле оптимизатор
Старый 19.04.2007, 11:14   #19  
mazzy is offline
mazzy
Administrator
Аватар для mazzy
Most Valuable Professional
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
28,760 / 3627 (178) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Цитата:
Сообщение от ivas Посмотреть сообщение
всмысле оптимизатор
оптимизатора кода в аксапте нет
__________________
GitHub, Facebook, mazzy.priot, mazzy.music, coub.
Старый 19.04.2007, 15:50   #20  
slava is offline
slava
сибиряк
Самостоятельные клиенты AX
 
466 / 22 (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, время: 06:43.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.