Класс CWinThread
Класс, представляющий поток исполнения в приложении.
Синтаксис
class CWinThread : public CCmdTarget
Участники
Открытые конструкторы
Имя | Описание |
---|---|
CWinThread::CWinThread |
Формирует объект CWinThread . |
Открытые методы
Имя | Описание |
---|---|
CWinThread::CreateThread |
Запускает выполнение CWinThread объекта. |
CWinThread::ExitInstance |
Переопределите, чтобы очистить при завершении потока. |
CWinThread::GetMainWnd |
Извлекает указатель на главное окно для потока. |
CWinThread::GetThreadPriority |
Возвращает приоритет текущего потока. |
CWinThread::InitInstance |
Переопределите для выполнения инициализации экземпляра потока. |
CWinThread::IsIdleMessage |
Проверяет наличие специальных сообщений. |
CWinThread::OnIdle |
Переопределите для выполнения обработки времени простоя для потока. |
CWinThread::PostThreadMessage |
Отправляет сообщение другому объекту CWinThread . |
CWinThread::PreTranslateMessage |
Фильтрует сообщения перед отправкой в функции TranslateMessage Windows и DispatchMessage . |
CWinThread::ProcessMessageFilter |
Перехватывает некоторые сообщения, прежде чем они достигают приложения. |
CWinThread::ProcessWndProcException |
Перехватывает все необработанные исключения, создаваемые обработчиками сообщений и команд потока. |
CWinThread::PumpMessage |
Содержит цикл сообщений потока. |
CWinThread::ResumeThread |
Уменьшает количество приостановки потока. |
CWinThread::Run |
Управление функцией для потоков с помощью насоса сообщений. Переопределите, чтобы настроить цикл сообщений по умолчанию. |
CWinThread::SetThreadPriority |
Задает приоритет текущего потока. |
CWinThread::SuspendThread |
Увеличивает число приостановки потока. |
Открытые операторы
Имя | Описание |
---|---|
CWinThread::operator HANDLE |
Извлекает дескриптор CWinThread объекта. |
Открытые члены данных
Имя | Описание |
---|---|
CWinThread::m_bAutoDelete |
Указывает, следует ли уничтожить объект при завершении потока. |
CWinThread::m_hThread |
Обработка текущего потока. |
CWinThread::m_nThreadID |
Идентификатор текущего потока. |
CWinThread::m_pActiveWnd |
Указатель на главное окно приложения контейнера при активном сервере OLE. |
CWinThread::m_pMainWnd |
Содержит указатель на главное окно приложения. |
Замечания
Основной поток выполнения обычно предоставляется объектом, производным от CWinApp
; CWinApp
является производным от CWinThread
. Дополнительные CWinThread
объекты позволяют нескольким потокам в данном приложении.
Существует два общих типа потоков, которые CWinThread
поддерживают: рабочие потоки и потоки пользовательского интерфейса. Рабочие потоки не имеют насоса сообщений: например, поток, выполняющий фоновые вычисления в приложении электронной таблицы. Потоки пользовательского интерфейса имеют насос сообщений и обрабатывают сообщения, полученные из системы. CWinApp
и классы, производные от него, являются примерами потоков пользовательского интерфейса. Другие потоки пользовательского интерфейса также могут быть производными непосредственно от CWinThread
.
Объекты класса CWinThread
обычно существуют в течение длительности потока. Если вы хотите изменить это поведение, задайте для m_bAutoDelete
FALSE
параметра .
Класс CWinThread
необходим, чтобы сделать код полностью потокобезопасной и MFC. Локальные потоки данные, используемые платформой для поддержания сведений, относящихся к потоку, управляются объектами CWinThread
. Из-за этой зависимости CWinThread
от обработки локальных данных потока любой поток, использующий MFC, должен быть создан MFC. Например, поток, созданный функцией _beginthread
времени выполнения, _beginthreadex
не может использовать api MFC.
Чтобы создать поток, вызовите AfxBeginThread
. Существует две формы в зависимости от того, требуется ли рабочий или пользовательский интерфейс. Если требуется поток пользовательского CWinThread
интерфейса, передайте указатель на AfxBeginThread
CRuntimeClass
производный класс. Если вы хотите создать рабочий поток, передайте AfxBeginThread
указатель на управляющую функцию и параметр в управляющую функцию. Для рабочих потоков и потоков пользовательского интерфейса можно указать необязательные параметры, которые изменяют приоритет, размер стека, флаги создания и атрибуты безопасности. AfxBeginThread
возвращает указатель на новый CWinThread
объект.
Вместо вызова AfxBeginThread
можно создать производный CWinThread
объект, а затем вызвать CreateThread
. Этот двухэтапный метод построения полезен, если вы хотите повторно использовать CWinThread
объект между последовательным созданием и завершением выполнения потоков.
Дополнительные сведения CWinThread
см. в статьях "Многопоточность с помощью C++ и MFC", "Многопоточность": создание потоков пользовательского интерфейса, многопоточность: создание рабочих потоков и многопоточность: использование классов синхронизации.
Иерархия наследования
CWinThread
Требования
Заголовок: afxwin.h
CWinThread::CreateThread
Создает поток для выполнения в адресном пространстве вызывающего процесса.
BOOL CreateThread(
DWORD dwCreateFlags = 0,
UINT nStackSize = 0,
LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL);
Параметры
dwCreateFlags
Указывает дополнительный флаг, который управляет созданием потока. Этот флаг может содержать одно из двух значений:
CREATE_SUSPENDED
Запустите поток с числом приостановки одного. Используйте,CREATE_SUSPENDED
если вы хотите инициализировать все данные-членыCWinThread
объекта, такие какm_bAutoDelete
или любые члены производного класса, перед запуском потока. После завершения инициализации используйтеCWinThread::ResumeThread
его для запуска потока. Поток не будет выполняться доCWinThread::ResumeThread
вызова.0 Запустите поток сразу после создания.
nStackSize
Задает размер в байтах стека для нового потока. Если значение равно 0, размер стека по умолчанию совпадает с размером основного потока процесса.
lpSecurityAttrs
Указывает на структуру SECURITY_ATTRIBUTES
, указывающую атрибуты безопасности для потока.
Возвращаемое значение
Ненулевое значение, если поток успешно создан; в противном случае — 0.
Замечания
Используется AfxBeginThread
для создания объекта потока и его выполнения на одном шаге. Используйте CreateThread
, если вы хотите повторно использовать объект потока между последовательным созданием и завершением выполнения потоков.
CWinThread::CWinThread
Формирует объект CWinThread
.
CWinThread();
Замечания
Чтобы начать выполнение потока, вызовите CreateThread
функцию-член. Обычно вы создаете потоки, вызывая AfxBeginThread
этот конструктор и CreateThread
.
CWinThread::ExitInstance
Вызывается платформой из редко переопределенной Run
функции-член, чтобы выйти из этого экземпляра потока или если вызов завершится InitInstance
сбоем.
virtual int ExitInstance();
Возвращаемое значение
Код выхода потока; Значение 0 указывает на отсутствие ошибок и значения, превышающие 0, указывают на ошибку. Это значение можно получить путем вызова GetExitCodeThread
.
Замечания
Не вызывайте эту функцию-член из любого места, но в функции-члене Run
. Эта функция-член используется только в потоках пользовательского интерфейса.
Реализация этой функции по умолчанию удаляет CWinThread
объект, если m_bAutoDelete
есть TRUE
. Переопределите эту функцию, если вы хотите выполнить дополнительную очистку при завершении потока. ExitInstance
Реализация должна вызывать версию базового класса после выполнения кода.
CWinThread::GetMainWnd
Если приложение является сервером OLE, вызовите эту функцию, чтобы получить указатель на активное главное окно приложения, а не напрямую ссылаться на m_pMainWnd
член объекта приложения.
virtual CWnd* GetMainWnd();
Возвращаемое значение
Эта функция возвращает указатель на один из двух типов окон. Если поток является частью сервера OLE и имеет объект, активный на месте внутри активного контейнера, эта функция возвращает CWinApp::m_pActiveWnd
элемент CWinThread
данных объекта.
Если в контейнере нет объекта, активного на месте, или приложение не является сервером OLE, эта функция возвращает m_pMainWnd
элемент данных объекта потока.
Замечания
Для потоков пользовательского интерфейса это эквивалентно непосредственно ссылке на m_pActiveWnd
член объекта приложения.
Если приложение не является сервером OLE, вызов этой функции эквивалентен непосредственно ссылке на m_pMainWnd
член объекта приложения.
Переопределите эту функцию, чтобы изменить поведение по умолчанию.
CWinThread::GetThreadPriority
Возвращает текущий уровень приоритета потока данного потока.
int GetThreadPriority();
Возвращаемое значение
Текущий уровень приоритета потока в своем классе приоритета. Возвращаемое значение будет одним из следующих значений, перечисленных в списке с наивысшим приоритетом до наименьшего:
THREAD_PRIORITY_TIME_CRITICAL
THREAD_PRIORITY_HIGHEST
THREAD_PRIORITY_ABOVE_NORMAL
THREAD_PRIORITY_NORMAL
THREAD_PRIORITY_BELOW_NORMAL
THREAD_PRIORITY_LOWEST
THREAD_PRIORITY_IDLE
Дополнительные сведения об этих приоритетах см SetThreadPriority
. в пакете SDK для Windows.
CWinThread::InitInstance
InitInstance
Необходимо переопределить для инициализации каждого нового экземпляра потока пользовательского интерфейса.
virtual BOOL InitInstance();
Возвращаемое значение
Ненулевое значение, если инициализация выполнена успешно; в противном случае — 0.
Замечания
Как правило, вы переопределяете InitInstance
выполнение задач, которые необходимо выполнить при первом создании потока.
Эта функция-член используется только в потоках пользовательского интерфейса. Инициализация рабочих потоков в управляемой функции, переданной AfxBeginThread
в .
CWinThread::IsIdleMessage
Переопределите эту функцию, чтобы не OnIdle
вызываться после создания определенных сообщений.
virtual BOOL IsIdleMessage(MSG* pMsg);
Параметры
pMsg
Указывает на текущее обработанное сообщение.
Возвращаемое значение
Ненулевое значение, если OnIdle
должно вызываться после обработки сообщения; в противном случае — значение 0.
Замечания
Реализация по умолчанию не вызывается OnIdle
после избыточных сообщений мыши и сообщений, созданных за счет мигания.
Если приложение создало короткий таймер, OnIdle
будет вызываться часто, вызывая проблемы с производительностью. Чтобы повысить производительность такого приложения, переопределите IsIdleMessage
в производном классе приложения CWinApp
, чтобы проверить наличие WM_TIMER
сообщений следующим образом:
BOOL CMyWinApp::IsIdleMessage(MSG* pMsg)
{
if (!CWinApp::IsIdleMessage(pMsg) || pMsg->message == WM_TIMER)
return FALSE;
else
return TRUE;
}
Обработка WM_TIMER
в этом режиме повышает производительность приложений, использующих короткие таймеры.
CWinThread::m_bAutoDelete
Указывает, следует ли CWinThread
автоматически удалять объект при завершении потока.
BOOL m_bAutoDelete;
Замечания
Элемент m_bAutoDelete
данных — это общедоступная переменная типа BOOL.
Значение m_bAutoDelete
не влияет на то, как закрывается базовый дескриптор потока, но влияет на время закрытия дескриптора. Дескриптор потока всегда закрывается при CWinThread
уничтожении объекта.
CWinThread::m_hThread
Дескриптор к потоку, подключенному к этому CWinThread
.
HANDLE m_hThread;
Замечания
Элемент m_hThread
данных — это общедоступная переменная типа HANDLE
. Это допустимо только в том случае, если базовый объект потока ядра в настоящее время существует, и дескриптор еще не закрыт.
Деструктор CWinThread
вызываетсяm_hThread
CloseHandle
. TRUE
Если m_bAutoDelete
поток завершается, CWinThread
объект уничтожается, что делает недействительными любые указатели на CWinThread
объект и его переменные-члены. Может потребоваться m_hThread
элемент для проверки значения выхода потока или ожидания сигнала. Чтобы сохранить CWinThread
объект и его m_hThread
член во время выполнения потока и после его завершения, установите значение m_bAutoDelete
FALSE
перед продолжением выполнения потока. В противном случае поток может завершиться, уничтожить CWinThread
объект и закрыть дескриптор перед его использованием. При использовании этого метода вы несете ответственность за удаление CWinThread
объекта.
CWinThread::m_nThreadID
Идентификатор потока, подключенного к этому CWinThread
.
DWORD m_nThreadID;
Замечания
Элемент m_nThreadID
данных — это общедоступная переменная типа DWORD
. Это допустимо только в том случае, если в настоящее время существует базовый объект потока ядра.
Также см. замечания о m_hThread
времени существования.
Пример
Пример см. в примере AfxGetThread
.
CWinThread::m_pActiveWnd
Используйте этот элемент данных для хранения указателя на активный объект окна потока.
CWnd* m_pActiveWnd;
Замечания
Библиотека классов Microsoft Foundation автоматически завершает поток при закрытии окна m_pActiveWnd
. Если этот поток является основным потоком для приложения, приложение также будет завершено. Если этот элемент данных является NULL
, активное окно для объекта приложения CWinApp
будет унаследовано. m_pActiveWnd
— общедоступная переменная типа CWnd*
.
Как правило, эта переменная-член устанавливается при переопределении InitInstance
. В рабочем потоке значение этого элемента данных наследуется от родительского потока.
CWinThread::m_pMainWnd
Используйте этот элемент данных для хранения указателя на главный объект окна потока.
CWnd* m_pMainWnd;
Замечания
Библиотека классов Microsoft Foundation автоматически завершает поток при закрытии окна m_pMainWnd
. Если этот поток является основным потоком для приложения, приложение также будет завершено. Если этот элемент данных является NULL
, главное окно объекта приложения CWinApp
будет использоваться для определения момента завершения потока. m_pMainWnd
— общедоступная переменная типа CWnd*
.
Как правило, эта переменная-член устанавливается при переопределении InitInstance
. В рабочем потоке значение этого элемента данных наследуется от родительского потока.
CWinThread::OnIdle
Переопределите эту функцию-член для выполнения обработки бездействия.
virtual BOOL OnIdle(LONG lCount);
Параметры
lCount
Счетчик увеличивается каждый раз, OnIdle
когда очередь сообщений потока пуста. Это число сбрасывается до 0 при каждом обработке нового сообщения. Параметр можно использовать lCount
для определения относительной продолжительности времени простоя потока без обработки сообщения.
Возвращаемое значение
Ненулевое значение для получения больше времени простоя обработки; Значение 0, если больше времени бездействия не требуется.
Замечания
OnIdle
вызывается в цикле сообщений по умолчанию, когда очередь сообщений потока пуста. Используйте переопределение для вызова собственных фоновых задач бездействия обработчика.
OnIdle
должен возвращать значение 0, чтобы указать, что не требуется дополнительное время простоя. Параметр lCount
увеличивается каждый раз OnIdle
, когда очередь сообщений пуста и сбрасывается до 0 при каждом обработке нового сообщения. Вы можете вызывать различные подпрограммы простоя в зависимости от этого количества.
Реализация этой функции-члена по умолчанию освобождает временные объекты и неиспользуемые библиотеки динамического канала из памяти.
Эта функция-член используется только в потоках пользовательского интерфейса.
Так как приложение не может обрабатывать сообщения, пока OnIdle
не возвращается, не выполняйте длительные задачи в этой функции.
CWinThread::operator HANDLE
Извлекает дескриптор CWinThread
объекта.
operator HANDLE() const;
Возвращаемое значение
В случае успешного выполнения дескриптор объекта потока; NULL
в противном случае .
Замечания
Используйте дескриптор для прямого вызова API Windows.
CWinThread::PostThreadMessage
Вызывается для публикации определяемого пользователем сообщения другому CWinThread
объекту.
BOOL PostThreadMessage(
UINT message,
WPARAM wParam,
LPARAM lParam);
Параметры
message
Идентификатор определяемого пользователем сообщения.
wParam
Первый параметр сообщения.
lParam
Второй параметр сообщения.
Возвращаемое значение
Имеет ненулевое значение в случае успешного выполнения, иначе — 0.
Замечания
Размещенное сообщение сопоставляется с соответствующим обработчиком сообщений макросом ON_THREAD_MESSAGE
карты сообщений.
Примечание.
При вызове PostThreadMessage
сообщение помещается в очередь сообщений потока. Тем не менее, поскольку сообщения, опубликованные таким образом, не связаны с окном, MFC не отправляет их в обработчики сообщений или команд. Чтобы обрабатывать эти сообщения, переопределите PreTranslateMessage()
функцию производного CWinApp
класса и обработайте сообщения вручную.
CWinThread::PreTranslateMessage
Переопределите эту функцию, чтобы фильтровать сообщения окна перед отправкой в функции TranslateMessage
Windows и DispatchMessage
.
virtual BOOL PreTranslateMessage(MSG* pMsg);
Параметры
pMsg
Указывает на структуруMSG
, содержащую сообщение для обработки.
Возвращаемое значение
Ненулевое значение, если сообщение было полностью обработано PreTranslateMessage
и не должно обрабатываться дальше. Ноль, если сообщение должно обрабатываться обычным образом.
Замечания
Эта функция-член используется только в потоках пользовательского интерфейса.
CWinThread::ProcessMessageFilter
Функция перехватчика платформы вызывает эту функцию-член для фильтрации и реагирования на определенные сообщения Windows.
virtual BOOL ProcessMessageFilter(
int code,
LPMSG lpMsg);
Параметры
code
Задает код перехватчика. Эта функция-член использует код для определения способа обработки lpMsg
.
lpMsg
Указатель на структуру WindowsMSG
.
Возвращаемое значение
Ненулевое значение, если сообщение обрабатывается; в противном случае — 0.
Замечания
Функция перехватчика обрабатывает события перед отправкой в обычную обработку сообщений приложения.
Если переопределить эту расширенную функцию, обязательно вызовите версию базового класса для поддержания обработки перехватчика платформы.
CWinThread::ProcessWndProcException
Платформа вызывает эту функцию-член всякий раз, когда обработчик не перехватывает исключение, возникающее в одном из сообщений или обработчиков команд потока.
virtual LRESULT ProcessWndProcException(
CException* e,
const MSG* pMsg);
Параметры
e
Указывает на необработанное исключение.
pMsg
Указывает на MSG
структуру , содержащую сведения о сообщении Windows, которое привело к возникновению исключения платформы.
Возвращаемое значение
-1, если WM_CREATE
создается исключение; в противном случае — 0.
Замечания
Не вызывайте эту функцию-член напрямую.
Реализация этой функции-члена по умолчанию обрабатывает только исключения, созданные из следующих сообщений:
Команда | Действие |
---|---|
WM_CREATE |
Провалить. |
WM_PAINT |
Проверьте затронутую окно, чтобы предотвратить создание другого WM_PAINT сообщения. |
Переопределите эту функцию-член, чтобы обеспечить глобальную обработку исключений. Вызовите базовую функциональность, только если вы хотите отобразить поведение по умолчанию.
Эта функция-член используется только в потоках с насосом сообщений.
CWinThread::PumpMessage
Содержит цикл сообщений потока.
virtual BOOL PumpMessage();
Замечания
PumpMessage
содержит цикл сообщений потока. PumpMessage
вызывается CWinThread
для перекачки сообщений потока. Можно вызвать PumpMessage
непосредственно для принудительной обработки сообщений или переопределить PumpMessage
его поведение по умолчанию.
Для PumpMessage
расширенных пользователей рекомендуется вызывать напрямую и переопределять его поведение по умолчанию.
CWinThread::ResumeThread
Вызывается для возобновления выполнения потока, приостановленного SuspendThread
функцией-членом или потоком, созданным с помощью флага CREATE_SUSPENDED
.
DWORD ResumeThread();
Возвращаемое значение
Предыдущее число приостановки потока в случае успешного выполнения; 0xFFFFFFFF
иначе. Если возвращаемое значение равно нулю, текущий поток не был приостановлен. Если возвращаемое значение равно одному, поток был приостановлен, но теперь перезапущен. Любое возвращаемое значение больше одного означает, что поток остается приостановленным.
Замечания
Количество приостановки текущего потока уменьшается на один. Если число приостановки уменьшается до нуля, поток возобновляет выполнение; в противном случае поток остается приостановленным.
CWinThread::Run
Предоставляет цикл сообщений по умолчанию для потоков пользовательского интерфейса.
virtual int Run();
Возвращаемое значение
Значение int
, возвращаемое потоком. Это значение можно получить путем вызова GetExitCodeThread
.
Замечания
Run
получает и отправляет сообщения Windows, пока приложение не получит WM_QUIT
сообщение. Если в настоящее время очередь сообщений потока не содержит сообщений, Run
вызовы OnIdle
для выполнения обработки бездействия. Входящие сообщения переходят в PreTranslateMessage
функцию-член для специальной обработки, а затем в функцию TranslateMessage
Windows для стандартного перевода клавиатуры. Наконец, DispatchMessage
вызывается функция Windows.
Run
редко переопределяется, но его можно переопределить для реализации специального поведения.
Эта функция-член используется только в потоках пользовательского интерфейса.
CWinThread::SetThreadPriority
Эта функция задает уровень приоритета текущего потока в своем классе приоритета.
BOOL SetThreadPriority(int nPriority);
Параметры
nPriority
Задает новый уровень приоритета потока в своем классе приоритета. Этот параметр должен быть одним из следующих значений, перечисленных в списке с наивысшим приоритетом до наименьшего:
THREAD_PRIORITY_TIME_CRITICAL
THREAD_PRIORITY_HIGHEST
THREAD_PRIORITY_ABOVE_NORMAL
THREAD_PRIORITY_NORMAL
THREAD_PRIORITY_BELOW_NORMAL
THREAD_PRIORITY_LOWEST
THREAD_PRIORITY_IDLE
Дополнительные сведения об этих приоритетах см SetThreadPriority
. в пакете SDK для Windows.
Возвращаемое значение
Ненулевое значение, если функция выполнена успешно; в противном случае — 0.
Замечания
Его можно вызывать только после CreateThread
успешного возвращения.
CWinThread::SuspendThread
Увеличивает число приостановки текущего потока.
DWORD SuspendThread();
Возвращаемое значение
Предыдущее число приостановки потока в случае успешного выполнения; 0xFFFFFFFF
иначе.
Замечания
Если любой поток имеет число приостановки выше нуля, этот поток не выполняется. Поток можно возобновить, вызвав функцию-член ResumeThread
.
См. также
CCmdTarget
Класс
Диаграмма иерархии
CWinApp
Класс
CCmdTarget
Класс