Многопоточность. Создание потоков пользовательского интерфейса
Потоки пользовательского интерфейса обычно используются для обработки введенных пользователем данных и ответа на пользовательские события независимо от потоков, в которых выполняется остальная часть приложения.Основной поток приложения (предоставляемый классом, производным от класса 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