Индикатор выполнения не отображается до завершения задания - PullRequest
3 голосов
/ 01 апреля 2009

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

Единственный способ, которым я смог получить эту работу, был с фоновым работником, а затем иметь

Do Цикл до условия, которое выполняется в главной форме, пока операция не будет завершена, после чего появится окно с моим сообщением.

Это похоже на хитрый способ сделать это, и thread.start, за которым следует thread.join, кажется гораздо более хорошим способом исправить это. Однако я не смог заставить это работать.

Я включил небольшую демонстрационную программу, если кому-то интересно. http://www.filedropper.com/progressbar

Спасибо

Ответы [ 4 ]

6 голосов
/ 01 апреля 2009

Thread.Start и Thread.Join - это , а не способ сделать это - это в основном блокирует ваш поток пользовательского интерфейса снова. Application.DoEvents тоже не лучший способ - вам действительно нужен отдельный поток.

Вы могли бы , а затем использовать Control.Invoke / Control.BeginInvoke для маршалинга обратно в поток пользовательского интерфейса, но BackgroundWorker делает все это намного проще. Поиск по «Справочнику по BackgroundWorker» дает множество результатов.

РЕДАКТИРОВАТЬ: Чтобы показать сообщение, когда работник закончил, используйте событие RunWorkerCompleted. Метод ReportProgress и событие ProgressChanged используются для обработки обновления индикатора выполнения. (Пользовательский интерфейс подписывается на ProgressChanged, и задача периодически вызывает ReportProgress.)

3 голосов
/ 01 апреля 2009

Это не кладжа. Это правильный способ сделать это; что происходит с подходом BackgroundWorker? Хитрость заключается в том, чтобы использовать метод ReportProgress для возврата изменения в пользовательский интерфейс (не обновлять ProgressBar с рабочего).

1 голос
/ 01 апреля 2009

В дополнение к ответу, заданному Марком Грэйвеллом, BackbroundWorker имеет логическое свойство WorkerReportsProgress. Если для него установлено значение false, при вызове ReportProgress программа вызовет исключение InvalidOperationException

1 голос
/ 01 апреля 2009

Время от времени используйте Application.DoEvents () в своей функции, чтобы у вашего процесса было время для обработки его событий, включая перерисовку формы.

Кроме того, вы можете использовать рабочий поток (например, BackgroundWorker) для обработки вашего лечения, пока поток пользовательского интерфейса отображает ваш индикатор выполнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...