Совет индикатора выполнения кодирования

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

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


person onurozcelik    schedule 07.09.2010    source источник
comment
См. также этот вопрос: stackoverflow.com/q/3626946/362638   -  person    schedule 07.09.2010


Ответы (3)


По сути, вы просто создаете экземпляр QProgressDialog:

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

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

progress.setValue(finishedOperations);

где finishOperations — это количество вещей, проанализированных на данный момент.

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

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

person teukkam    schedule 07.09.2010

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

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

person Ben Voigt    schedule 07.09.2010

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

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

person Randy    schedule 07.09.2010
comment
Не могли бы вы объяснить двухпроходную реализацию? - person onurozcelik; 07.09.2010
comment
в основном это означает, что вы должны разобрать весь документ один раз и накопить количество узлов, которые, как вы знаете, вы будете обрабатывать, затем на втором проходе вы фактически выполняете обработку, но теперь вы знаете, сколько их будет, поэтому вы могу предъявить счетчик. - person Randy; 07.09.2010