Visual Studio C++ 2010 Express: BackgroundWorker Class |
Добавил(а) microsin |
Класс BackgroundWorker может запустить отдельный поток, которому обычно поручают какую-нибудь фоновую продолжительную работу. Эта возможность позволяет сохранить работоспособность интерфейса пользователя (основной поток программы не блокируется), когда программа производит некоторые действия, требующие блокировки на ожидание какого-то события. Цикл потока BackgroundWorker запускается в обработчике события DoWork, (OnDoWork). Внимание: из этого обработчика нельзя менять пользовательский интерфейс, иначе возникнет конфликт с основным потоком программы! Общение с пользовательским интерфейсом внутри потока DoWork возможно только через вызовы метода ReportProgress, что генерирует события ProgressChanged, которые можно обработать в потоке класса формы (свойство WorkerReportsProgress должно быть установлено при этом в true). Как начать работать с BackgroundWorker: 1. Бросаем на форму компонент BackgroundWorker (BackgroundWorker1). 2. В Form1_Load инициализируем BackgroundWorker:
3. Заходим в события BackgroundWorker1, и добавляем обработчики DoWork, ProgressChanged, RunWorkerCompleted. 4. Пишем в теле DoWork алгоритм работы BackgroundWorker наподобие следующего:
Здесь вызовы ReportProgress будут генерить события прогресса ProgressChanged. 5. Пишем тело обработчика события ProgressChanged наподобие такого:
Здесь e->ProgressPercentage получает значение переменной i, через которую вызовом ReportProgress было передано значение прогресса. 6. Можно останавливать BackgroundWorker, если вызвать его метод CancelAsync():
Чтобы остановка сработала, нужно чтобы свойство WorkerSupportsCancellation было установлено в true. Кроме того, в теле цикла DoWork экземпляра BackgroundWorker нужно организовать проверку свойства CancellationPending, и если оно true, то прерывать выполнение цикла. Пример:
Примечание: имейте в виду, что при наличии длительно выполняющегося цикла в потоке BackgroundWorker необходимо освобождать процессорное время для основной формы (с помощью вызова Sleep), иначе приложение "заморозится" и не будет отвечать на интерфейс пользователя, пока цикл BackgroundWorker не завершится. 7. При завершении работы BackgroundWorker будет автоматически срабатывать событие RunWorkerCompleted. Оно срабатывает и при вызове CancelAsync(), если обработчик DoWork был завершен. Пример обработчика события завершения:
|