Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Янг Майкл Дж. -> "Visual С++ 6. Полное руководство: В 2 т.(том2)" -> 114

Visual С++ 6. Полное руководство: В 2 т.(том2) - Янг Майкл Дж.

Янг Майкл Дж. Visual С++ 6. Полное руководство: В 2 т.(том2) — Бином, 2006. — 530 c.
Скачать (прямая ссылка): vicualcc2006t2.djvu
Предыдущая << 1 .. 108 109 110 111 112 113 < 114 > 115 116 117 118 119 120 .. 173 >> Следующая

В этой главе мы покажем, как создавать вторичные потоки и управлять ими. Узнаете, как использовать механизмы, предоставляемые Win32 API для синхронизации работы отдельных потоков. Наконец, будет создана многопотоковая версия программы Mandel (см. гл. 19). Следующая глава посвящена распределению задач между отдельными процессами и организации связей между ними (процессы запускаются при выполнении программы).
Создание и
управление вторичными потоками_
Многопотоковая обработка особенно полезна в программах с графическим интерфейсом, когда первичный поток выделяется для обработки сообщений, что позволяет программе быстро реагировать на поступающие команды и другие события. Вторичный поток обычно используется для выполнения любой длительной задачи, которая блокировала бы обработку сообщений программы при ее выполнении первичным потоком, например, при рисовании сложных графических изображений, пересчете электронных таблиц, выполнении дисковых операций или связи с последовательным портом. Запуск отдельного потока происходит относительно быстро и занимает небольшой объем памяти по сравнению с запуском отдельного процесса, описанным в следующей главе. Кроме того, все потоки
программы выполняются в одной области памяти и используют общий набор ресурсов Windows, следовательно, могут совместно использовать переменные и объекты Windows (окна, перья, распределения памяти, контексты устройств и т.д.). Далее вы увидите, что существует несколько ограничений на совместное использование объектов MFC различными потоками и процессами.
Примечание
Многие приемы, рассмотренные в этой главе, проиллюстрированы в программе MandelMT, приведенной в конце главы.
Многопотоковый режим обработки используется в программе при условии, что запуск и управление новыми потоками осуществляется с применением техники, описанной в данной главе. Сначала убедитесь, что установка проекта Use Run-Time Library имеет значение, соответствующее многопотоковому режиму. Новый проект имеет стандартные установки, но если их требуется изменить, переустановите их следующим образом: выберите команду Settings... в меню Project и имя проекта в иерархическом списке, откройте вкладку C/C++ и выберите пункт Code Generation в списке Category. Для задания выходной конфигурации проекта в списке Use Run-Time Library выберите параметр Multithreaded или Multithreaded DLL, а для отладочной конфигурации проекта - Debug Multithreaded или Debug Multithreaded DLL. Вспомните: конфигурация выбирается в списке Setting for диалогового окна Project Settings.
Для запуска нового потока вызовите глобальную MFC-функцию AfxBeginThread, которая имеет следующие аргументы.
CWinThread* AfxBeginThread
(AFXJTHREADPROC pfnThreadProc, LPVOID pParam,
int nPriority = THREAD_PRIORITY_NORMAL, UINT nStackSize = 0, DWORD dwCreateFlags = 0,
LPSECURITY_ATTRIBUTES IpSecurityAttrs = NULL);
Примечание
Функция AfxBeginThread инициализирует библиотеку MFC для использования в многопотоковой программе. Затем она вызывает функцию beginthreadex библиотеки периода выполнения, инициализирующую библиотеку программы с несколькими потоками, а затем для запуска потока вызывает функцию Win32 API : :CreateThread. Если функцию AfxBeginThread использовать для запуска вторичного потока программы MFC, то можно без проблем использовать классы MFC, функции библиотеки периода выполнения и Win32 API. В программах MFC нельзя запускать новый поток, непосредственно вызывая библиотечные функции _beginthread и beginthreadex или функцию : : CreateThread интерфейса Win32 API.
Функция AfxBeginThread запускает новый поток и сразу возвращает управление. С этого момента оба потока (новый и вызвавший функцию AfxBeginThread) работают одновременно. Первый параметр pfnThreadProc задает функцию потока, и новый поток начинает ее выполнять. Функция потока может вызывать другие функции, а при выходе из нее новый поток завершается. Параметр pParam задает значение, передаваемое в эту функцию. Функция потока определяется следующим образом.
UINT ThreadFunction (LPVOID pParam);
Заметим: функция потока возвращает значение типа UINT, называющееся кодом возврата. Ниже показано, как код возврата читается другими потоками. При нормальном завершении функция потока возвращает значение 0. Хотя при желании можно использовать любое возвращаемое значение, потому что оно читается и интерпретируется только вашей собственной программой. (Нельзя возвращать специальное значение STILLACTIVE, равное ОхОООООЮЗЬ, показывающее, что поток продолжает выполняться.)
Совет
Информация для нового потока задается указателем pParam, передаваемым в функцию потока, который может содержать адрес простого значения (типа int) или структуры, включающей произвольное количество информации. Новый поток передает информацию в начальный поток (в дополнение к коду возврата), присваивая значения переменным, на которые указывает параметр pParam. Для выполнения описанной процедуры работа потоков должна быть синхронизирована (см. далее в этой главе).
Четыре последних параметра функции AfxBeginThread имеют стандартные значения. Параметр nPriority задает приоритет нового потока, который определяет, как часто поток будет выполняться при переключении управления от одного потока к другому. Если задачу необходимо выполнить быстро и эффективно, то потоку присваивается относительно высокий приоритет. При выполнении менее важной задачи (которую можно отложить до того момента, когда другие потоки будут неактивны) присвойте потоку относительно низкий приоритет. В большинстве случаев потоку присваивается стандартное значение thread_priority_normal — средний приоритет. Описание различных значений приоритетов приведено в следующих разделах справочной системы: Platform SDK, Windows Base Services, Exexcutables, Processes and Threads, Process and Thread Reference, Process and Thread Functions, Set Thread'Priority.
Предыдущая << 1 .. 108 109 110 111 112 113 < 114 > 115 116 117 118 119 120 .. 173 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100