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


Класс 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", "Многопоточность": создание потоков пользовательского интерфейса, многопоточность: создание рабочих потоков и многопоточность: использование классов синхронизации.

Иерархия наследования

CObject

CCmdTarget

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_hThreadCloseHandle. 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 Класс