- •1. Windows-как объектно-ориентированная операционная система (трпс)
- •2. Общая схема взаимодействия приложения и ядра Windows. (трпс)
- •3. Общая схема Windows приложения. Цикл обработки сообщения, функция окна, ресурсы. (трпс)
- •4. Синхронные и асинхронные Windows сообщения. Сходства и отличия. Области применения. (трпс)
- •5. Классы и стили окон. Иерархия окон. (трпс)
- •6. Особенности отрисовки для Windows приложения. Контекст устройства, недействительная область, обработка сообщений. (трпс)
- •7. Типы клавиатурных сообщений. Особенности обработки. (трпс)
- •8. Типы сообщений от манипулятора мышь. Особенности обработки. (трпс)
- •9. Реализация корпоративной и вытесняющей многозадачности на Windows платформах. (трпс)
- •10. Основные понятия процесса, потока, фибера (трпс)
- •11. Схема создания рабочего потока (трпс)
- •12. Синхронизация потоков, события, критические секции. (трпс)
- •13. Особенности использования памяти на Windows платформах. Проблема ipc (трпс)
- •14. Общая схема печати документов приложением на Windows платформах. (трпс)
- •2 Создание немодального диалога для отмены печати.
- •16. Типы и области применимости dll. Особенности программной реализации. (трпс)
- •17. Наборы символов для Windows платформ. Сходства и отличия. Области применимости. (трпс)
- •18. Типы диалогов для Windows платформ. Сходства и отличия. Особенности реализации. (трпс)
- •Int DialogBox(hinstance hInst,lpctstr pTemplate, hwnd hWndParent, dlgproc pDlgFunc)
- •Int MessageBox(hwnd hWnd, lpctstr szText, lpctstr szCaption, uint uType);
- •If (!IsDialogMessage(hDlgModaless,&msg)){
- •19. Элементы управления. Общая характеристика и области применимости. (трпс)
- •20. Функции crt и функции ядра Windows для работы с файлами. Особенности применения. (трпс)
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) – завершает ее.
