26.02.2007, 15:17 | #1 |
Участник
|
Добрый день.
Предположим есть: Repaet Until Для того чтобы увидеть ход выполнения работы внутри цикла, и для того чтобы увидеть когда выборка закончиться - можно использовать строки Dial.OPEN('Выполнение @1@@@@@@@'); I_COUNT := Employee1.COUNT; Repeat I := I + 1; Dial.UPDATE(1,ROUND((I / I_COUNT * 10000),1)); Until ----------------- А, вот если много вложенных : REPEAT REPEAT2 REPEAT3 UNTIL3 UNTIL2 UNTIL как в этом случае написать код - чтобы один прогресс отображал все действия ????? |
|
26.02.2007, 15:24 | #2 |
Участник
|
Видимо так.
Код: Dial.OPEN('Выполнение @1@@@@@@@\' + 'Выполнение @2@@@@@@@\' + ... 'Выполнение @n@@@@@@@'); Код: Dial.UPDATE(1,ROUND((I / I_COUNT * 10000),1)); Dial.UPDATE(2,ROUND((J / J_COUNT * 10000),1)); Dial.UPDATE(n,ROUND((K / K_COUNT * 10000),1)); ПС. Получилось ) |
|
26.02.2007, 15:26 | #3 |
Участник
|
я такой вариант уже делал.
И хотел узнать как можно в одном прогрессе отобразить всё |
|
26.02.2007, 15:33 | #4 |
Участник
|
|
|
26.02.2007, 15:40 | #5 |
Участник
|
Я хотел узнать - как в одном прогрессе @1@@@@@@@@.
А, вы предлагаете вариант с один диалоговым окном , и несколькими прогрессами @1@@@@@@@@ @2@@@@@@@@ |
|
26.02.2007, 15:48 | #6 |
Участник
|
Цитата:
2 Посчитать колво обрабатываемых записей во всех циклах и это считать общим COUNTом. В последнем вложенном цикле наращивать значение счетчика, сдвигая значение прогресса. |
|
26.02.2007, 15:57 | #7 |
Участник
|
Цитата:
Для общего случая - Вариант 1) Если есть возможность быстро вычислить сумарное количество итераций, то Вы сами выше напеисали код. Вариант 2) Остается только неравномерное движение прогрес бара. Например Код: Dial.OPEN('Выполнение @1@@@@@@@'); I_COUNT := Employee1.COUNT; REPEAT I := I + 1; J_COUNT := SomeTable.COUNT; J := 0; REPEAT J := J + 1; Dial.UPDATE(1,ROUND(((I+J / J_COUNT ) / I_COUNT * 10000),1)); UNTIL SomeTable.NEXT = 0; UNTIL Employee1.NEXT = 0; |
|
26.02.2007, 16:03 | #8 |
Участник
|
Код не анализировал, но это J_COUNT := SomeTable.COUNT; нужно вынести из цикла.
|
|
26.02.2007, 16:05 | #9 |
Участник
|
Цитата:
Приведенный код это для сложного случая. PS А код я и сам не анализировал толком Вроде должно работать. |
|
26.02.2007, 16:10 | #10 |
Участник
|
Цитата:
1) если кол-во в первом цикле будет = 1. Тогда , если вся выборка займет например час - то, пользователь увидит 0%, и через час 100% 2) Как я могу посчитать кол-во во всех циклах - если внутренние циклы постоянно имеют разное кол-во записей. Цитата:
Сообщение от randrews
Цитата:
Для общего случая - Вариант 1) Если есть возможность быстро вычислить сумарное количество итераций, то Вы сами выше напеисали код. Вариант 2) Остается только неравномерное движение прогрес бара. Например Код: Dial.OPEN('Выполнение @1@@@@@@@'); I_COUNT := Employee1.COUNT; REPEAT I := I + 1; J_COUNT := SomeTable.COUNT; J := 0; REPEAT J := J + 1; Dial.UPDATE(1,ROUND(((I+J / J_COUNT ) / I_COUNT * 10000),1)); UNTIL SomeTable.NEXT = 0; UNTIL Employee1.NEXT = 0; Получается прогресс будет прыгать , то вперед, то назад ? |
|
26.02.2007, 16:14 | #11 |
Участник
|
[quote=art;357412] Почему? Может я чего-то не вижу. Будет по I равномерно идти, а по J - в зависимости от кода. То есть
1 итерация первого цикла (вложенный цикл большой) 2 итерация первого цикла (вложенный цикл маленький) 3 итерация первого цикла (вложенный цикл большой) Должно - треть прогресс бара идти медленно, вторая треть быстро, третья медленно. Ах, да. I := I + 1 лучше в конец поставить - ошибся. Перед UNTIL Employee1.NEXT = 0; |
|
26.02.2007, 16:31 | #12 |
Участник
|
Но, это случай когда обязательно попадешь в самый последний цикл ?
Возможен ли вариант - приращение прогресса после каждого FIND ? |
|
26.02.2007, 16:40 | #13 |
Участник
|
Цитата:
У вас первый цикл состоит, например из 2х итераций. Каждый внутренний из 5. Результат - равномерно по 10% прогрессбара будет ползти. Вы хотите, перед вторым циклом увеличился прогресс? Тогда у вас сразу прогресс скакнет на 50%. То есть такой вариант есть - его предложил romeo - учитывать только первый цикл. |
|
26.02.2007, 16:44 | #14 |
Участник
|
Вобще перерисовку прогресс бара лучше делать не прик аждой итерации, а раз в какое-то число
нужно делать неравномерно , ведь даже в виндовсе этим не побрезговали |
|
26.02.2007, 16:44 | #15 |
Участник
|
Dial.OPEN('Выполнение @1@@@@@@@');
I_COUNT := Employee1.COUNT; REPEAT I := I + 1; J_COUNT := SomeTable.COUNT; J := 0; REPEAT J := J + 1; Dial.UPDATE(1,ROUND(((I+J / J_COUNT ) / I_COUNT * 10000),1)); UNTIL SomeTable.NEXT = 0; UNTIL Employee1.NEXT = 0; По этому примеру - если я не попаду в цикл REPEAT по SomeTable, то прогесса не будут Правильно ? |
|
26.02.2007, 16:47 | #16 |
Участник
|
Ну и что? Зато при следущей он может будет, это ведь не независимые прогрессы, а подпрогресс. Опять же, помню при установке винды такое где-то было - в 2 или 3 прогресса и последний мог пробегать моментом, а мог бежать плавно
|
|
26.02.2007, 16:47 | #17 |
Участник
|
Цитата:
Если делать перерисовку через определленое кол-во записей - то, если пользователь свернет Nav, потом например через 10 минут развернет окно Nav, он не увидет процент прогресса пока не будет обновленно окно. |
|
26.02.2007, 16:49 | #18 |
Участник
|
Цитата:
Сообщение от art
Dial.OPEN('Выполнение @1@@@@@@@');
I_COUNT := Employee1.COUNT; REPEAT I := I + 1; J_COUNT := SomeTable.COUNT; J := 0; REPEAT J := J + 1; Dial.UPDATE(1,ROUND(((I+J / J_COUNT ) / I_COUNT * 10000),1)); UNTIL SomeTable.NEXT = 0; UNTIL Employee1.NEXT = 0; По этому примеру - если я не попаду в цикл REPEAT по SomeTable, то прогесса не будут Правильно ? И не забудьте I := I + 1 в конец перенести |
|
26.02.2007, 16:49 | #19 |
Участник
|
Ну надо поймать примерно такую частоту итераций, чтоб окно перерисовывалось не по несколько раз в секунуду, но и не раз в пол часа, а то это замедлит обработку.
|
|
26.02.2007, 16:53 | #20 |
Участник
|
Хорошо. Вообще-то пример понятен. Буду пробовать . СПАСИБО всем.
|
|