2012-01-18 2 views
1

Мне нужно реализовать индикатор прогресса, который показывает прогресс генерации отчета, проблема в том, что я должен представлять процент прогрессии отчета на основе события, генерируемого генератором, но без предварительного знания общее количество событий, поэтому, например, генерация отчета отправляет следующие события (фаза):Вычислить процентную прогрессию на основе событий

- Starting Report generation 
- Start Query execution 
- End Query execution 
- Start Report Rendering 
- End Report Rendering 
- End Report Generation 

в этом примере есть в общей сложности 3 задачи и 6 событий, я не знаю, общее количество задач но я знаю, что общее количество событий в два раза превышает количество задач.

Я не знаю, какие события присутствуют и сколько их, но я должен представлять прогрессию с индикатором выполнения, поэтому с числом от 0 до 100.

Как это можно вычислить? Каков наилучший способ представления прогрессии?

+2

Значит, вы ничего не знаете и хотите получить процент прогресса. Вы действительно понимаете использование индикатора прогресса?Это означает, что вы уже знаете что-то. –

+0

Возможно, с некоторой математической формулой вы можете представить прогрессию, я знаю, что это не просто, но если бы это было легко, я бы не спросил здесь о StackOverflow ... :) – aleroot

+0

Вы не можете. что, если у вас 10 событий? что, если у вас есть 12 событий? Чтобы использовать индикатор выполнения, вам нужно детерминированное число, а не произвольное. –

ответ

3

Возможно, самое лучшее, что вы можете сделать, это отказаться от идеи фактического шага прогресса в целом и подать в суд на некоторый неопределенный индикатор прогресса. В этом сценарии на настольных системах обычно используется индикатор выполнения «шатер» или «отскок».

Другой вариант - если вы действительно хотите показать что-то вроде прогресса - это использовать некоторые эвристики и просто (частично) подделать его. У вас на самом деле нет много информации, поэтому это должно быть довольно умно и требует много тестирования на реальные случаи. Вот несколько советов:

  • Увеличить прогресс, основанный на уровне вложенности выполняемой в настоящее время задачи. В принципе, идея состоит в том, что чем более тонко сформулирована задача, тем меньше она способствует общему прогрессу. По заданию вложенности я подразумеваю, конечно, иерархию, подразумеваемую из брекетинга ваших сообщений Start и End.

  • Получите разумную оценку максимального количества задач, которые вы можете ожидать, и скорректируйте скорость увеличения прогресса в зависимости от того, насколько близко вы можете закончить. Например, если вы ожидаете не более 500 задач, и вы обработали 300, но уже показываете прогресс на 80%, вы должны серьезно замедлить дальнейшее увеличение. Аналогичным образом, если вы отстаете, вы должны соответствующим образом увеличить количество шагов вашего продвижения.

  • Избегайте больших прыжков. Даже если вам нужно быстро догнать, как описано в предыдущем пункте, делать это постепенно и со временем. Чтобы привести конкретный пример: вместо того, чтобы увеличивать один раз на 10%, а затем стоять на месте в течение 10 секунд, сделайте 10 приращений по 1% каждый в течение 10 секунд.

Возможно, есть много методов, которые вы могли бы попробовать использовать. На самом деле, это довольно интересная проблема, связанная с UX и математикой, но вы должны подумать о том, стоит ли тратить на нее когнитивные усилия. Я ожидаю, что в большинстве случаев неопределенный прогресс будет абсолютно прекрасен.

1

То, что вам требуется, невозможно с нормальным индикатором выполнения, поскольку вы в принципе не знаете, какой прогресс вы пытаетесь отследить. То, что вы можете сделать, - это сделать индикатор выполнения marquee (индикатор выполнения, который продолжается бесконечно), чтобы показать пользователю, что ваше приложение все еще идет и выше или ниже него, имеет текстовое поле без редактирования, в котором указаны задачи, упомянутые выше ,

+0

Итак, вы говорите, что невозможно рассчитать процент прогрессии, если вы не знаете сначала общее количество задач? – aleroot

+2

@aleroot То, как я его вижу, да ... это похоже на то, что вы хотите сделать что-то вроде 100/x = какое-то конкретное значение, а x не знаю ... Я не думаю, что это можно сделать. Возможно, вы можете придумать какой-то худший сценарий, когда количество задач не может быть выше, и вы всегда это делаете. Поэтому, если в вашем худшем случае количество заданий равно 8, и вы уверены, что он никогда не может превысить 8, вы можете использовать это значение для отслеживания общего прогресса. – npinti