Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ТРПС- читать.doc
Скачиваний:
1
Добавлен:
01.05.2025
Размер:
142.34 Кб
Скачать

11. Схема создания рабочего потока (трпс)

Процесс – это исполняемый модуль, которому Windows выделяет память и другие системные ресурсы. Поток – это последовательность исполняемых команд. Процесс может состоять из единственного потока, а может содержать их несколько. Окно обязательно принадлежит какому-либо потоку. Однако поток может владеть одним или несколькими окнами или вообще не одним.

Многопоточность приложения обычно включает в себя главный поток программы, который создаётся автоматически при запуске исполняемого модуля. Он создает все окна и соответствующие им оконные процедуры, а также обрабатывает все сообщения для этих окон. Поэтому главный поток имеет цикл обработки сообщений. Все остальные потоки являются рабочими и служат для решения фоновых задач. Они не имеют оконных процедур, и не обрабатывают сообщения ОС. Для создания рабочего потока нужно написать так называемую функцию рабочего потока.: Прототип функции одинаков для всех потоков:

DWORD WINAPI ThreadFunc (LPVOID pData);

Имя функции рабочего потока не имеет значения, так как Windows использует адрес. Все функции рабочего потока имеют только один параметр типа LPVOID. Особенность функции рабочего потока состоит в том, что при выходе из нее поток автоматически завершается. Непосредственное создание рабочего потока происходит в момент вызова функции: HANDLE CreateThread(); функция возвращает дискриптор потока, позволяющий вызывающему процессу проводить манипуляции с потоками.

Рабочий поток взаимодействует с главным потоком путём отправки сообщений WM_USER+100.и теперь используя асинхронный способ передачи сообщений через функцию PostMessage() сообщение уходит в очередь сообщений и рано или поздно будет обработано.

12. Синхронизация потоков, события, критические секции. (трпс)

Главная трудность многопотокового программирования – это организация взаимодействия потоков. Данные должны передаваться как от рабочего потока к процессу, так и в обратном направлении – от процесса в рабочий поток. В первом случае работает посылка сообщений. Главный поток может принимать сообщения от рабочего потока. Для этого используется константа WM_USER+n, где n >0. Следует использовать только асинхронную передачу сообщений через функцию PostMessage(), так как поток может быть прерван в любой момент.

Во втором случае возникает трудность: рабочий поток не может принимать сообщения, так как не имеет функции окна. Для этого случая предусмотрены специальные формы синхронизации. Одна из таких форм – события. Объект события может находиться в двух состояниях: установлено и сброшено. Дискриптор на объект событие возвращает функция:

HANDLE CreateEvent(

SECURITY_ATTRIBUTES* pEventAttr,

BOOL bManualReset,

BOOL bInitialState,LPCTSTR lpName);

Указатель pEventAttr обычно равен 0, bManualReset - режим управления (вручную – TRUE, автоматически - FALSE), bInitialState - стартовое состояние объекта, lpNameуказатель на строку – имя события.

Созданный объект требует закрытия после использования:

CloseHahdle ((HANDLE)hEvent);

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

После инициализации критической секции функция

EnterCriticalSection(&cs) – начинает секцию cs, а функция LeaveCriticalSection(&cs) – завершает ее.