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

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

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

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

Функция Назначение
ExitInstance Выполните очистку при завершении потока. Обычно переопределяется.
Initinstance Выполнение инициализации экземпляра потока. Необходимо переопределить.
Onidle Выполняйте обработку бездействия для конкретного потока. Обычно не переопределяется.
PreTranslateMessage Фильтрация сообщений перед отправкой TranslateMessage в и DispatchMessage. Обычно не переопределяется.
ProcessWndProcException Перехват необработанных исключений, создаваемых обработчиками сообщений и команд потока. Обычно не переопределяется.
Выполнить Управление функцией для потока. Содержит насос сообщения. Редко переопределяется.

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

  • RUNTIME_CLASS класса, полученного от CWinThread.

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

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

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

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

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

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

См. также

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