Визуальное программирование и MFC



         

Создание рабочего потока - часть 2


Рассмотрим пример создания рабочего потока для однодокументного приложения example при обработке сообщения о выборе пользователем пункта меню “Start”. В качестве родительского потока выступает главный поток приложения. Рабочий поток после запуска осуществляет 100-кратный вывод некоторого изображения в окно приложения:

UINT MyThread(LPVOID pParam); // объявление функции потока // реализация метода класса CExampleView (класса обликов), // наследованного от базового CView из MFC. void CExampleView::OnStart() // обработка сообщения от меню { //Создать новый поток. Функция потока имеет имя MyThread, // в качестве параметра функции потока передается указатель // на текущее окно просмотра для вывода в него изображения AfxBeginThread(MyThread,this); } // определение функции потока UINT MyThread(LPVOID pParam) { // через параметр передается указатель на окно просмотра CExampleView *ptrView=(CExampleView *)pParam;

for(int i=0; i<100; i++) { CDC *dc=ptrView->GetDC(); // получить контекст отображения CRect r; ptrView->GetClientRect(&r); // получить клиентскую область окна dc->TextOut(rand()%r.Width(),rand()%r.Height(),"*",1); // вывод } return 0; }

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

Иногда бывает необходимо приостановить поток на заданное количество миллисекунд. Это можно сделать, вызвав API-функцию Sleep.




Содержание  Назад  Вперед