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