2010-09-07 2 views
2

В моем приложении я разбираю XML-файл и проверяю содержимое с помощью схемы xsd. Когда xml-файл становится больше, требуется некоторое время для анализа файла и проверки содержимого. В этом случае я хочу визуализировать фазы синтаксического анализа и валидации с индикатором выполнения. Как это сделать?Кодирование подсказки о шаге разработки

Примечание: Я использую Qt с C++

+0

См. Также этот вопрос: http://stackoverflow.com/q/3626946/362638 – 2010-09-07 14:48:18

ответ

0

, что является основной перекручивание структура вашего алгоритма?

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

+0

Не могли бы вы объяснить двухпроходную реализацию? – onurozcelik

+0

в основном это означает, что вы разобрали бы весь документ один раз и скопировали бы подсчет количества узлов, которые, как вы знаете, будете обрабатывать, а затем на втором проходе вы фактически выполняете обработку, но теперь вы знаете, сколько будет, так что вы можете представить счетчик. – Randy

3

В основном вы просто создать экземпляр QProgressDialog:

QProgressDialog progress("Parsing...", "Abort", 0, numOperations, this); 
progress.setWindowModality(Qt::WindowModal); 

numOperations, где есть полное число вещей, которые нужно сделать до того, как синтаксический анализ делается. Для этого вам, вероятно, необходимо сделать первый быстрый проход через данные, где вы просто подсчитаете общее количество элементов для синтаксического анализа или что-то подобное, и установите это значение как максимальное значение numOperations в предыдущем примере кода. Затем вы делаете фактическую обработку проход и вызвать SetValue периодически:

progress.setValue(finishedOperations); 

где finishedOperations является количество вещей разобранных до сих пор.

Предполагается, что вам нужно простейшее решение, в котором индикатор выполнения отображается как отдельный модальный диалог. Если вы хотите дать пользователю возможность прервать процесс, вам необходимо реализовать слот, который вы подключаете к canceled() signal.

Если вам не нужен индикатор выполнения в модальном диалоговом окне, вы просто покажите QProgressBar. Он работает аналогичным образом, периодически вызывая setValue().

1

Предполагая, что реализация синтаксического анализа xml вытаскивает свои данные из какого-то буферизованного потока, подключенного к файловому считывателю, - читайте размер файла, а затем каждый раз, когда входной буфер захватывает еще один блок из считывателя файлов, обновите свой прогресс индикатор. Это, вероятно, можно сделать наиболее удобно, выведя новый класс из класса чтения файлов и переопределив функцию блока чтения, чтобы сообщить о прогрессе.

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

Смежные вопросы