Многопоточность. Создание потоков пользовательского интерфейса
Потоки пользовательского интерфейса обычно используются для обработки введенных пользователем данных и ответа на пользовательские события независимо от потоков, в которых выполняется остальная часть приложения. Основной поток приложения (предоставляемый классом, производным от класса CWinApp) создается и запускается автоматически. В этом разделе описаны действия, необходимые для создания дополнительных потоков пользовательского интерфейса.
Первое, что необходимо сделать при создании потока пользовательского интерфейса, это создать класс, производный от CWinThread. Необходимо объявить и реализовать этот класс с помощью макросов DECLARE_DYNCREATE и IMPLEMENT_DYNCREATE. Этот класс обязательно переопределяет несколько функций и может переопределить некоторые другие. Переопределяемые функции и задачи, которые они выполняют, представлены в следующей таблице.
Переопределяемые функции при создании потока пользовательского интерфейса
Функция |
Назначение |
---|---|
Выполняет очистку при завершении потока. Обычно переопределяется. |
|
Выполняет инициализацию экземпляра для потока. Должна быть переопределена. |
|
Выполняет обработку времени простоя для конкретного потока. Обычно не переопределяется. |
|
Фильтрует сообщения перед их передачей в TranslateMessage и DispatchMessage. Обычно не переопределяется. |
|
Перехватывает необработанные исключения, вызываемые обработчиком команд и сообщений в потоке. Обычно не переопределяется. |
|
Контролирующая функция для потока. Содержит механизм обработки сообщений. Переопределяется редко. |
MFC предоставляет версии 2 AfxBeginThread через перегружать параметра: — это функция, которая может только создать рабочие потоки и одно, может создать потоки или рабочие потоки интерфейса пользователя. Чтобы запустить поток пользовательского интерфейса, вторая вызовите перегруженный метод AfxBeginThread, предоставив следующие сведения:
RUNTIME_CLASS класса, производного от CWinThread.
(Необязательно) Желаемый уровень приоритета потока. По умолчанию используется обычный приоритет. Дополнительные сведения о доступных уровнях приоритета см. в разделе SetThreadPriority в Windows SDK.
Желаемый размер стека для потока. (Необязательно) По умолчанию используется тот же размер стека, что и для создающего потока.
CREATE_SUSPENDED,если необходимо создать поток в состоянии приостановки. (Необязательно) Значением по умолчанию является "0", то есть поток запускается в обычном режиме.
(необязательно) Желаемые атрибуты безопасности. По умолчанию используются те же параметры доступа, что и для родительского потока. Дополнительные сведения о формате информации о безопасности см. в разделе SECURITY_ATTRIBUTES в Windows SDK.
Функция AfxBeginThread выполняет большинство необходимых действий. Она создает новый объект класса, инициализирует его с предоставляемой информацией и вызывает функцию CWinThread::CreateThread для запуска выполнения потока. Для подтверждения того, что в случае возникновения ошибки освобождение выделяемой для всех объектов памяти осуществляется должным образом, во время создания выполняются специальные проверки.
Дополнительные сведения
См. также
Основные понятия
Реализация многопоточности на языке C++ с помощью классов MFC