Многопоточность. Создание потоков пользовательского интерфейса

Обновлен: Ноябрь 2007

Потоки пользовательского интерфейса обычно используются для обработки введенных пользователем данных и ответа на пользовательские события независимо от потоков, в которых выполняется остальная часть приложения. Основной поток приложения (предоставляемый классом, производным от класса CWinApp) создается и запускается автоматически. В этом разделе описаны действия, необходимые для создания дополнительных потоков пользовательского интерфейса.

Первое, что необходимо сделать при создании потока пользовательского интерфейса, это создать класс, производный от CWinThread. Необходимо объявить и реализовать этот класс с помощью макросов DECLARE_DYNCREATE и IMPLEMENT_DYNCREATE. Этот класс обязательно переопределяет несколько функций и может переопределить некоторые другие. Переопределяемые функции и задачи, которые они выполняют, представлены в следующей таблице.

Переопределяемые функции при создании потока пользовательского интерфейса

Функция

Назначение

ExitInstance

Выполняет очистку при завершении потока. Обычно переопределяется.

InitInstance

Выполняет инициализацию экземпляра для потока. Должна быть переопределена.

OnIdle

Выполняет обработку времени простоя для конкретного потока. Обычно не переопределяется.

PreTranslateMessage

Фильтрует сообщения перед их передачей в TranslateMessage и DispatchMessage. Обычно не переопределяется.

ProcessWndProcException

Перехватывает необработанные исключения, вызываемые обработчиком команд и сообщений в потоке. Обычно не переопределяется.

Run

Контролирующая функция для потока. Содержит механизм обработки сообщений. Переопределяется редко.

MFC предоставляет две версии функции AfxBeginThread с помощью перегрузки параметров: одну для потоков пользовательского интерфейса, вторую — для рабочих потоков. Чтобы запустить поток пользовательского интерфейса, следует вызвать AfxBeginThread, предоставив следующую информацию:

  • RUNTIME_CLASS класса, производного от CWinThread.

  • (Необязательно) Желаемый уровень приоритета потока. По умолчанию используется обычный приоритет. Дополнительные сведения о доступных уровнях приоритета см. в разделе SetThreadPriority в SDK для Windows.

  • (Необязательно) Желаемый размер стека для потока. По умолчанию используется тот же размер стека, что и для создающего потока.

  • (Необязательно) CREATE_SUSPENDED, если необходимо создать поток в состоянии приостановки. Значением по умолчанию является "0", то есть поток запускается в обычном режиме.

  • (Необязательно) Желаемые атрибуты безопасности. По умолчанию используются те же параметры доступа, что и для родительского потока. Дополнительные сведения о формате информации о безопасности см. в разделе SECURITY_ATTRIBUTES в SDK для Windows.

Функция AfxBeginThread выполняет большинство необходимых действий. Она создает новый объект класса, инициализирует его с предоставляемой информацией и вызывает функцию CWinThread::CreateThread для запуска выполнения потока. Чтобы убедиться, что в случае возникновения ошибки при создании освобождение выделяемой для всех объектов памяти осуществляется должным образом, во время этого процесса выполняются проверки.

Дополнительные сведения

См. также

Основные понятия

Реализация многопоточности на языке C++ с помощью классов MFC