Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Общие вопросы по программированию, компьютерный форум
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.10.2013, 00:57   #1
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
Вопрос Деревья, рекурсия и прогресс.

Доброго времени суток!

Вопрос в целом общий.

Есть некое дерево объектов, бездонной глубины:
Папки могут содержать в себе другие файлы и папки.

У меня удачно получилось сохранять и загружать это в/из XML файла.
Даже удалось подсчитать количество элементов в дереве, во всех папках и вложенных папках, включая их самих.

Я читаю/записываю из/в файла, рекурсивно. Собственно, как к этому привить прогресс(отображение сохранения/загрузки, визуально)?

ЯП не имеет значения, главное мыслю правильную найти...
Человек_Борща вне форума Ответить с цитированием
Старый 08.10.2013, 01:29   #2
Кащей
Форумчанин
 
Аватар для Кащей
 
Регистрация: 09.07.2013
Сообщений: 249
По умолчанию

Функцию обратного вызова всунь, делай туда +1 после записи каждого объекта и получи проценты прогресса по формуле.
% = количество записаных объектов / (количество объектов всего / 100)
Неподсчитав заранее количество объектов ты не получиш точных процентов и максимум что сможеш, это получить количество остающихся в процессе обработки объектов с погрешностью, деля размер файла с вычтеным суммарным размером обработанных объектов на средний арифметический размер этих объектов.

a - приблизительное количество оставшихся объектов
b - размер файла
c - сумма размеров обработанных объектов
d - количество обработанных объектов

a = (b - c) / (c / d)
do not use your brain

Последний раз редактировалось Кащей; 08.10.2013 в 02:14.
Кащей вне форума Ответить с цитированием
Старый 08.10.2013, 06:08   #3
Utkin
Старожил
 
Аватар для Utkin
 
Регистрация: 04.02.2009
Сообщений: 17,351
По умолчанию

Я с деревьями передаю некоторую служебную информацию. Например, родительский узел знает сколько всего узлов ему подчинено. Все узлы находятся в едином хранилище (динамическом массиве), так примеру я знаю сколько всего узлов вообще, сколько из них являются корневыми и еще некоторые плюшки. Вам же для процентного вычисления достаточно знать общее количество сохраняемых/читаемых узлов.
Маньяк-самоучка
Utkin появился в результате деления на нуль.
Осторожно! Альтернативная логика
Utkin вне форума Ответить с цитированием
Старый 08.10.2013, 08:16   #4
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,774
По умолчанию

Мне кажется, что в общем случае есть два способа, уже упомянутые выше:
  • Если процент загрузки нужно считать в прикладных объектах, разбираемый XML должен хранить количество вложенных объектов в контейнере в виде параметра, чтобы его можно было получить при разборе открывающего тега. Само собой, нужна возможность влиять на формат XML.
  • Если же входные файлы генерируются сторонним ПО и возможности влиять на формат нет, остается считать пробег в символах или байтах разобранного исходника, для чего механизм подсчета должен быть включен в разборщик, а сам разбор должен быть однопроходным, как в SAX.
Vapaamies вне форума Ответить с цитированием
Старый 08.10.2013, 10:29   #5
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Не совсем все с файлом делается, файл кстати мой. Обёртка для XML, само умеет отображать прогресс загрузки/сброса.

Прогресс нужен уже в run-time, когда дерево живет в масииве.
Объект-контейнер знает сколько в нем объектов(внутренний цикл). Переделаю по совету Utkin'а.

Цитата:
Функцию обратного вызова всунь, делай туда +1 после записи каждого объекта и получи проценты прогресса по формуле.
Попробую сегодня.

Последний раз редактировалось Человек_Борща; 08.10.2013 в 10:36.
Человек_Борща вне форума Ответить с цитированием
Старый 08.10.2013, 11:20   #6
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Прогресс бар просто не нужен, вот и всё.
pu4koff на форуме Ответить с цитированием
Старый 08.10.2013, 11:56   #7
the_deer_one
Участник клуба
 
Аватар для the_deer_one
 
Регистрация: 04.04.2010
Сообщений: 1,554
По умолчанию

или можно сделать прогресс бар без указания процента выполнения.
the_deer_one вне форума Ответить с цитированием
Старый 08.10.2013, 12:14   #8
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

pu4koff, нужен=) Есть очень длительный процесс: экспорт/импорт данных из программы. В эти моменты работу с ПО надо заблокировать юзеру. Повесить "Пожалуймта подождите 100500 часов?"? Нет, лучше индикация прогресса работы. Вот и думаю, как бы это привить.
Человек_Борща вне форума Ответить с цитированием
Старый 08.10.2013, 14:56   #9
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
Нет, лучше индикация прогресса работы.
Чем "песочные часы" не устраивают?
Далее, можно блокировать диалогом типа "Ща работаем" с кнопкой "забей" для остановки процесса - тогда никакой индикации не надо.
waleri вне форума Ответить с цитированием
Старый 08.10.2013, 15:17   #10
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
pu4koff, нужен=) Есть очень длительный процесс: экспорт/импорт данных из программы. В эти моменты работу с ПО надо заблокировать юзеру. Повесить "Пожалуймта подождите 100500 часов?"? Нет, лучше индикация прогресса работы. Вот и думаю, как бы это привить.
Прогрессбар хороший сделать в большинстве случаев очень сложно. Это при копировании файла можно всё легко реализовать и оно будет близко к реальности, но такие задачи редко в реальности бывают. Никакого толку от прогрессбара, который за минуту на 90% проскочил, а потом полчаса висит на оставшихся 10%. "Ленивая" инициализация или асинхронная загрузка сюда не ложится нормально? Типа подгружаем быстро верхний уровень, показываем пользователю, потом в фоне дерево грузим, пока пользователь тупит или вообще читаем следующий уровень только когда пользователь раскрывает соответствующий элемент.
pu4koff на форуме Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Прогресс бар Gudzik11 Общие вопросы Delphi 41 15.05.2013 10:03
Запуск ракеты Прогресс Alter Свободное общение 13 18.09.2010 14:04
Многопоточность и прогресс Horus92 Работа с сетью в Delphi 5 23.05.2010 16:42
Прогресс закачки mish666 Работа с сетью в Delphi 7 21.01.2008 15:50