Книги
чёрным по белому
Главное меню
Главная О нас Добавить материал Поиск по сайту Карта книг Карта сайта
Книги
Археология Архитектура Бизнес Биология Ветеринария Военная промышленность География Геология Гороскоп Дизайн Журналы Инженерия Информационные ресурсы Искусство История Компьютерная литература Криптология Кулинария Культура Лингвистика Математика Медицина Менеджмент Металлургия Минералогия Музыка Научная литература Нумизматика Образование Охота Педагогика Политика Промышленные производства Психология Путеводители Религия Рыбалка Садоводство Саморазвитие Семиотика Социология Спорт Столярное дело Строительство Техника Туризм Фантастика Физика Футурология Химия Художественная литература Экология Экономика Электроника Энергетика Этика Юриспруденция
Новые книги
Цуканов Б.И. "Время в психике человека" (Медицина)

Суворов С. "Танк Т-64. Первенец танков 2-го поколения " (Военная промышленность)

Нестеров В.А. "Основы проэктирования ракет класса воздух- воздух и авиационных катапульных установок для них" (Военная промышленность)

Фогль Б. "101 вопрос, который задала бы ваша кошка своему ветеринару если бы умела говорить" (Ветеринария)

Яблоков Н.П. "Криминалистика" (Юриспруденция)
Реклама

C++. Энциклопедия пользователя - Либерти Дж.

Либерти Дж. C++. Энциклопедия пользователя — Москва, 2001. — 581 c.
Скачать (прямая ссылка): enciklopediyapolzovatelya2001.djvu
Предыдущая << 1 .. 54 55 56 57 58 59 < 60 > 61 62 63 64 65 66 .. 280 >> Следующая

¦ Объект CWinThread
¦ Сам поток
¦ Окно, которым управляет CWinThread
Помните, что при создании объекта CWinThread поток не создается. Поток создается путем обращения к CreateThread(). Подобно этому, когда поток разрушается, то объект CWinThread продолжает жить. Такое положение вещей можно изменить, установив переменную-член m_bAutoDelete в значение true (по умолчанию — false). Такая установка указывает Windows разрушить объект CWinThread при разрушении его потока.
Альтернатива: рабочие потоки
Если вы просто хотите, чтобы метод одного из классов работал в фоновом режиме, т.е. в собственном потоке, то можете создать рабочий поток. Для этого используйте функцию AfxBeginThread(), которая на самом деле перегружена так, чтобы ее можно было использовать для этой цели. Кроме того, ее можно использовать для управления потоками с классами, порожденными от CWinThread. В этом случае нас интересует только первая перегрузка AfxBeginThread():
CWinThread * AfxBeginThread()
Поскольку наибольшее значение имеют первые два параметра, то они будут рассматриваться в последнюю очередь. nPriority является целым значением, которое определяет начальный приоритет потока и которое можно установить в THREAD_PRIORITY_HIGHEST или THREAD_PRIORITY BELOW NORMAL для управления относительным приоритетом каждого из потоков. Как показано, приоритетом, установленным по умолчанию, является THREAD_PR10R1TY_N0RMAL.
Четвертый параметр nStackSize является UINT (беззнаковое целое). Этот параметр устанавливает начальный размер стека потока (каждый поток имеет собственный стек). Значение, принятое по умолчанию, 0, указывает Windows распределить стек для нового потока такого же размера, как и для порождающего потока.
Пятый параметр dwCreateFlags — это DWORD (двойное слово). Он указывает 32-разрядное беззнаковое целое. Флаги создания можно установить в 0 (по умолчанию) или в CREATE_SUSPENDED. Данные флаги позволяют создавать поток, но не выполнять его до вызова ::ResumeThread().
Шестой параметр является структурой атрибутов безопасности. Его можно без проблем игнорировать и оставить значение, принятое по умолчанию, — NULL. Если нужна безопасность Windows NT, то можно создать и инициализировать свою структуру безопасности и затем вставить ее, используя данный параметр.
Вернемся к двум первым параметрам. Первый параметр представляет собой функцию, которую вы хотите выполнить в собственном потоке (это функция управления потоком). Второй параметр является структурой, содержащей все параметры, которые нужно передать управляющей функции.
Вот что можно узнать из файла справки MFC о функции управления потоком:
Управляющая функция определяет поток. Когда происходит вход в данную функцию, то поток запускается, а когда функция теряет управление, поток прекращается. Эта функция должна иметь следующий прототип:
UINT MyControllingFunction( LPVOID pParam );
Уточним терминологию. Новая управляющая функция будет вызываться какой-то другой функцией, на которую мы будем ссылаться как на вызывающую. Вызывающая функция взаимодействует с управляющей функцией через единственный параметр LPVOID. Что бы ни требовалось передать управляющей функции, это должно упаковываться в один параметр. Это не так тяжело, как звучит: просто создайте структуру, загрузите ее значениями, которые хотите передать, приведите ее к LPVOID и передайте всю структуру в управляющую функцию, используя AfxBeginThread().
AFX_THREADPROC
LPVOID
int
UINT
DWORD
pSomeThreadFunction, pParamter,
nPriority = THREAD_PRIORITY_NORMAL nStackSize = 0, dwCreateFlags = 0,
LPSECURITY_ATTRIBUTES IpSecurityAttributes = NOLL
128
Вопросы реализации
Часть И
В некоторых книгах советуют сделать управляющую функцию глобальной. Автор не согласен с этим. Вы достигнете лучшей инкапсуляции (и тем самым более просто поддерживаемого кода), если сделаете данную функцию статической функцией-членом конкретного класса.
Обратите внимание, что в статической функции-члене нет указателя this, поэтому необходимо передавать указатель this как параметр. Например, можно объявить такой метод-член:
class myClass
<
public:
static UINT myThreadFunc(LPVOID pMe);
// ...
} ;
И написать реализацию, подобную следующей:
UINT myClass:: myThreadFunc (LPVOID ptheThisPointer)
{
myClass * pmyThis = (CClientManager *) pMyThisPointer;
ASSERT (pmyThis);
pmyThis->SomeClassMethod();
return 0 ;
)
Затем используется AfxBeginThread(), а указатель класса this передается в качестве второго параметра:
AfxBeginThread(myClass:: myThreadFunc,(LPVOID) this );
Альтернативно функцию можно сделать дружественной классу.
Синхронизация
Теперь, когда поток "проснулся" и выполняется, возникает проблема синхронизации потоков. MFC предоставляет несколько объектов, помогающих решить эту задачу: критические разделы, семафоры, мю-тексы и события.
Поток может проверять каждый из этих объектов (кроме критических разделов), для того чтобы установить, сигналит ли объект или нет (часто говорят о том, чист объект или нет). Когда объект синхронизации сигналит, это указывает на то, что поток может иметь доступ. До тех пор пока объект сигналит, поток ждет. Когда поток ждет, он ничего не делает и блокирован.
Предыдущая << 1 .. 54 55 56 57 58 59 < 60 > 61 62 63 64 65 66 .. 280 >> Следующая