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