Поделиться через


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

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

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

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

Функция

Назначение

ExitInstance

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

InitInstance

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

OnIdle

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

PreTranslateMessage

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

ProcessWndProcException

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

Запуск

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

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

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

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

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

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

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

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

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

См. также

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

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