Как сделать прогресс бар в c

Добавил пользователь Skiper
Обновлено: 05.10.2024

Теперь кроется проблема. Я не могу просто выполнить цикл 0-100 for, поскольку код, который я хочу выполнить и отслеживать, находится в цикле while, который выполняется в течение произвольного времени (размер проблемы зависит от ввода пользователя, поэтому не является постоянным).

Любая помощь приветствуется.

3 ответа

Так что я завернул код из ранее, и вот что я закончил.

Я использовал немного концепции oop и симулировал класс ProgressBar . Вот как я разработал код для ProgressBar :

Прежде чем перейти к определениям InitProgressBar() и DrawProgressBar() , вот как вы должны использовать то, что я сделал. Вот пример:

А теперь определение функции, которая печатает индикатор выполнения:

Я также использовал эту функцию, чтобы сделать мой код в основном более компактным:

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

Я также сделал это, но, похоже, очень зависит от количества предметов.

Предполагая, что вы знаете количество предметов, по которым вы рассчитываете (например, сортируете список, вычисляете разные вещи и т. Д.), Это должно пригодиться :).

После проб и ошибок я, возможно, нашел решение, но хотел бы проверить кого-то.

Предполагая эти переменные (все типа int):

num_iterations = 0, MAX_PROGRESS = 100, BAR_LENGTH = 50, num_items = N

В этом примере показано, как использовать ProgressBar, чтобы показать ход выполнения долгого задания. Это очень простой пример, который выполняет синхронную задачу.

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

Этот код читает номер, введенный в текстовое поле, и делит его на 10. Затем он выполняет 9 циклов. Во время каждого цикла программа обновляет ProgressBar, чтобы отобразить объем выполняемой задачи, а затем подсчитывает до 1/10 значения, которое вы ввели.

После завершения 9 циклов программа подсчитывает все оставшиеся числа, которые вы указали. Если общее число равномерно делится на 10, то это последний 1/10 числа. Если сумма не делится на 10, то это все, что осталось после 9 циклов.

Все эти петли просто моделируют длительную задачу. В реальной программе вы бы сделали что-то более полезное, как обработка записей в базе данных.

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

Чтобы этого избежать, программа включает Timer с именем tmrHideProgressBar. В следующем коде показан обработчик события Tick таймера.

Компонент ProgressBar предназначен для индикации процесса выполнения какой-либо задачи.

Работа с компонентом

Для работы компонента необходимо в свойствах Min и Max задать минимальное и максимальное значения, которым будет соответствовать шкала индикатора. В свойстве Position задается текущее значение, отображаемое на индикаторе. Различные дополнительные свойства позволяют настроить внешний вид компонента.

Особенности использования

При работе в операционной системе Windows 7, использующей тему оформления Aero, используется плавная отрисовка полосы индикатора процесса. Если значения меняются довольно быстро (в течение нескольких секунд), то создается эффект "запаздывания" отрисовки индикатора. Данное поведение не является ошибкой компонента ProgressBar , а является результатом работы системного компонента, который лежит в основе работы ProgressBar . Если процесс, индицируемый компонентом ProgressBar , выполняется в течение небольшого времени и требуется своевременная отрисовка индикатора, то существует следующий путь обхода: перед установкой в свойстве Position значения, отображаемого на индикаторе, данному свойству устанавливается немного увеличенное значение. Это приведет к моментальной отрисовке индикатора процесса. Для корректной отрисовки в конечной точке (при достижении значения Max ) следует также увеличить максимальный допустимый диапазон компонента на небольшое значение, затем установить значение индикатора и после этого вернуть исходное максимальное допустимое значение.

Если изменение значения индикатора производится по таймеру, то для корректной отрисовки по описанному выше алгоритму, можно использовать следующий код на Fore :

Class TESTForm: Form
Button1: Button;
Timer1: Timer;
ProgressBar1: ProgressBar;
Pos: Integer;

Sub Button1OnClick(Sender: Object; Args: IMouseEventArgs);
Begin
Pos := 0 ;
Timer1.Enabled := True ;
End Sub Button1OnClick;

Sub Timer1OnTimer(Sender: Object; Args: IEventArgs);
Begin
Pos := Pos + 1 ;
If (Pos Then
ProgressBar1.Position := Pos + 1 ;
ProgressBar1.Position := Pos;
Else
ProgressBar1.Max := ProgressBar1.Max + 1 ;
ProgressBar1.Position := ProgressBar1.Max;
ProgressBar1.Max := ProgressBar1.Max - 1 ;
Timer1.Enabled := False ;
End If ;
End Sub Timer1OnTimer;

End Class TESTForm;

Также рекомендуется рассмотреть возможность отказа от использования компонента ProgressBar в пользу компонента PPProgressBar. PPProgressBar не зависит от какого-либо системного компонента, поэтому в нем отсутствует подобный эффект "запаздывания".

Запись была обновлена

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

Основные свойства компонентов:

ProgressBar CGauge Описание
Max MaxValue Максимальное значение позиции (Position, Progress), которое соответствует завершению отображаемого процесса. По умолчанию задается в процентах - 100.
Min Min Value Начальное значение позиции (Position, Progress), которое соответствует началу отображаемого процесса.
Position Progress Позиция, которую можно задавать по мере протекания процесса, начиная со значения Min или Min Value в начале процесса, и кончая значением Мах или MaxValue в конце. Если минимальное и максимальное значения выражены в процентах, то позиция - это процент завершенной части процесса.
Smooth Непрерывное (при значении true) или дискретное отображение процесса.
Step Шаг приращения позиции, используемый в методе Steplt. Значение по умолчанию - 10.
Orientation Ориентация шкалы компонента: pbHorizontal - горизонтальная, pbVertical - вертикальная. Если задана ориентация pbVertical, то компонент надо вытянуть по вертикали.
ForeColor Цвет заполнения.
ShowText Текстовое отображение процента выполнения на фоне диаграммы.
Kind Тип диаграммы: gkHorizontalBar - горизонтальная полоса, gkVerticalBar - вертикальная полоса, gkPie - круговая диаграмма, gkNeedle - секторная диаграмма, gkText - отображение текстом.

Отображение хода процесса можно осуществлять, задавая значение позиции - Position в ProgressBar или Progress в CGauge. Например, если полная длительность процесса характеризуется значением целой переменной Count (объем всех копируемых файлов, число настроек, количество циклов какого-то процесса), а выполненная часть - целой переменной Current, то задавать позицию диаграммы в случае, если используются значения минимальной и максимальной позиции по умолчанию (т.е. 0 и 100), можно операторами:

Можно поступать иначе, задать сначала значение максимальной величины равным Count, а затем в ходе процесса задавать позицию равной Current:

Компонент ProgressBar имеет два метода, которыми тоже можно воспользоваться для отображения процесса: StepBy (DeIta: Integer) - увеличение позиции на заданную величину Delta, и Steplt - увеличение позиции на один шаг, величина которого задается свойством Step. Например с использованием метода Steplt:

Читайте также: