Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Создание рабочего потока




Методические указания

 

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

 

Рассмотрим пример создания двух потоков для однодокументного приложения Example при обработке сообщения о выборе пользователем пункта меню “Start Thread” меню “Thread”. В качестве родительского потока выступает главный поток приложения. Поток 1 после запуска осуществляет 100-кратный вывод некоторой строки в окно приложения с задержкой 650 миллисекунд, поток 2 каждые две секунды 50 раз выдает звуковой сигнал и сообщение.

Для создания приложения Example выполните следующие действия:

1. Запустите AppWizard и укажите ему на необходимость создания нового проекта класса MFC AppWizard(exe) с именем Example.

2. Задайте для нового проекта параметры настройки AppWizard: шаг 1-SDI, остальные по умолчанию.

3. Используя редактор ресурсов, добавьте в меню приложения IDR_MAINFRAME новое меню Thread. Поместите в него команду с названием Start Thread и идентификатором ID_STARTTHREAD.

4. С помощью ClassWizard свяжите команду ID_STARTTHREAD с функцией обработки сообщения OnStartthread(). Перед добавлением этой функции убедитесь, что в поле Class Name выбрано значение CExampleView.

5. Щелкните на кнопке Edit Code и введите приведенные ниже операторы в новую функцию OnStartthread().

AfxBeginThread(MyThread1,this); AfxBeginThread(MyThread2,this);

В этом фрагменте текста программы последовательно вызываются функции MyThread1() и MyThread2(), каждая из них будет работать в своем собственном потоке. Далее в файл ExampleView.cpp добавьте функции MyThread1() и MyThread2(), текст которых представлен ниже. Поместите перед функцией OnStartthread() объявления функций MyThread1() и MyThread2(). Обратите внимание, что эти функции являются глобальными функциями, а не методами класса CExampleView, несмотря на то, что они находятся в файле, в котором реализован этот класс.

Окончательный фрагмент кода в файле ExampleView.cpp представлен ниже.

 

UINT MyThread1(LPVOID pParam); // объявление функции потока 1UINT MyThread2(LPVOID pParam); // объявление функции потока 2 void CExampleView::OnStartthread() //обработка сообщения от меню{//Создать два новых потока. Функция потока 1 имеет имя //MyThread1, Функция потока 2 имеет имя MyThread2.// в качестве параметра функциям потоков передается указатель// на текущее окно просмотра для вывода в него изображения AfxBeginThread(MyThread1,this); AfxBeginThread(MyThread2,this);}// определение функции потока 1UINT MyThread1(LPVOID pParam){// через параметр передается указатель на окно просмотра CExampleView *ptrView=(CExampleView *)pParam; for(int i=0; i<100; i++) { CDC *dc=ptrView->GetDC();// получить контекст отображения Sleep(650); // Задержка на 650 миллисекунд CRect r; ptrView->GetClientRect(&r); //получить клиентскую область //окнаdc->TextOut(rand()%r.Width(),rand()%r.Height(),"*",1); // вывод } return 0;} // определение функции потока 2UINT MyThread2(LPVOID pParam){for(int i=0; i<50; i++){ Sleep(2000); // Задержка на 2000 миллисекунд AfxMessageBox("MyThread2"); // Вывод сообщения MessageBeep(0); // Подача звукового сигнала}return 0;}

 

 
 

Откомпилируйте и запустите приложение. Не забудьте при компиляции установить в Project/Settings опцию многопотокового приложения, как это показано на рис. 3.1.

 

Рис 3.1.Пример выбора многопотокового приложения

 

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

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




Поделиться с друзьями:


Дата добавления: 2014-11-29; Просмотров: 461; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.007 сек.