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


Класс CWorkerThread

Замечание

Библиотека активных шаблонов (ATL) продолжает поддерживаться. Однако мы больше не добавляем функции или обновляем документацию.

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

Внимание

Этот класс и его члены нельзя использовать в приложениях, выполняемых в среде выполнения Windows.

Синтаксис

template <class ThreadTraits = DefaultThreadTraits>
class CWorkerThread

Параметры

ThreadTraits
Класс, предоставляющий функцию создания потока, например CRTThreadTraits или Win32ThreadTraits.

Участники

Защищенные структуры

Имя Описание
WorkerClientEntry

Открытые конструкторы

Имя Описание
CWorkerThread::CWorkerThread Конструктор для рабочего потока.
CWorkerThread::~CWorkerThread Деструктор для рабочего потока.

Открытые методы

Имя Описание
CWorkerThread::AddHandle Вызовите этот метод, чтобы добавить дескриптор объекта ожидания в список, поддерживаемый рабочим потоком.
CWorkerThread::AddTimer Вызовите этот метод, чтобы добавить периодический таймер ожидания в список, поддерживаемый рабочим потоком.
CWorkerThread::GetThreadHandle Вызовите этот метод, чтобы получить дескриптор потока рабочей роли.
CWorkerThread::GetThreadId Вызовите этот метод, чтобы получить идентификатор потока рабочего потока.
CWorkerThread::Initialize Вызовите этот метод для инициализации рабочего потока.
CWorkerThread::RemoveHandle Вызовите этот метод, чтобы удалить дескриптор из списка ожидающих объектов.
CWorkerThread::Shutdown Вызовите этот метод, чтобы завершить работу рабочего потока.

Замечания

Использование CWorkerThread

  1. Создайте экземпляр этого класса.

  2. Вызовите CWorkerThread::Initialize.

  3. Вызовите CWorkerThread::AddHandle с дескриптором объекта ядра и указателем на реализацию IWorkerThreadClient.

    - или -

    Вызовите CWorkerThread::AddTimer указателем на реализацию IWorkerThreadClient.

  4. Реализуйте IWorkerThreadClient::Execute , чтобы выполнить некоторые действия при сигнале дескриптора или таймера.

  5. Чтобы удалить объект из списка ожидающих объектов, вызовите CWorkerThread::RemoveHandle.

  6. Чтобы завершить поток, вызовите CWorkerThread::Shutdown.

Требования

Заголовок: atlutil.h

CWorkerThread::AddHandle

Вызовите этот метод, чтобы добавить дескриптор объекта ожидания в список, поддерживаемый рабочим потоком.

HRESULT AddHandle(
    HANDLE hObject,
    IWorkerThreadClient* pClient,
    DWORD_PTR dwParam) throw();

Параметры

hObject
Дескриптор для ожидаемого объекта.

pClient
Указатель на интерфейс IWorkerThreadClient объекта, вызываемый при сигнале дескриптора.

dwParam
Параметр, передаваемый в IWorkerThreadClient::Execute при сигнале дескриптора .

Возвращаемое значение

Возвращает S_OK при успешном выполнении или ошибку HRESULT при сбое.

Замечания

IWorkerThreadClient::Execute будет вызываться через pClient при сигнале дескриптора, hObject.

CWorkerThread::AddTimer

Вызовите этот метод, чтобы добавить периодический таймер ожидания в список, поддерживаемый рабочим потоком.

HRESULT AddTimer(
    DWORD dwInterval,
    IWorkerThreadClient* pClient,
    DWORD_PTR dwParam,
    HANDLE* phTimer) throw();

Параметры

dwInterval
Указывает период таймера в миллисекундах.

pClient
Указатель на интерфейс IWorkerThreadClient объекта, вызываемый при сигнале дескриптора.

dwParam
Параметр, передаваемый в IWorkerThreadClient::Execute при сигнале дескриптора .

phTimer
[out] Адрес переменной HANDLE, которая при успешном выполнении получает дескриптор только что созданному таймеру.

Возвращаемое значение

Возвращает S_OK при успешном выполнении или ошибку HRESULT при сбое.

Замечания

IWorkerThreadClient::Execute будет вызываться через pClient , когда таймер сигнализирует.

Передайте дескриптор таймера из phTimer в CWorkerThread::RemoveHandle, чтобы закрыть таймер.

CWorkerThread::CWorkerThread

Конструктор.

CWorkerThread() throw();

CWorkerThread::~CWorkerThread

Деструктор

~CWorkerThread() throw();

Замечания

Вызывает CWorkerThread::Shutdown.

CWorkerThread::GetThreadHandle

Вызовите этот метод, чтобы получить дескриптор потока рабочей роли.

HANDLE GetThreadHandle() throw();

Возвращаемое значение

Возвращает дескриптор потока или NULL, если рабочий поток не инициализирован.

CWorkerThread::GetThreadId

Вызовите этот метод, чтобы получить идентификатор потока рабочего потока.

DWORD GetThreadId() throw();

Возвращаемое значение

Возвращает идентификатор потока или ЗНАЧЕНИЕ NULL, если рабочий поток не инициализирован.

CWorkerThread::Initialize

Вызовите этот метод для инициализации рабочего потока.

HRESULT Initialize() throw();

HRESULT Initialize(CWorkerThread<ThreadTraits>* pThread) throw();

Параметры

pThread
Существующий рабочий поток.

Возвращаемое значение

Возвращает S_OK при успешном выполнении или ошибку HRESULT при сбое.

Замечания

Этот метод должен вызываться для инициализации объекта после создания или после вызова CWorkerThread::Shutdown.

Чтобы использовать один или несколько CWorkerThread объектов, инициализировать один из них, не передавая аргументы, передайте указатель на этот объект Initialize в методы других. Объекты, инициализированные с помощью указателя, должны быть закрыты перед тем, как объект использовался для их инициализации.

Сведения о том, как поведение этого метода изменяется при инициализации с помощью указателя на существующий объект, см. в разделе CWorkerThread::Shutdown .

CWorkerThread::RemoveHandle

Вызовите этот метод, чтобы удалить дескриптор из списка ожидающих объектов.

HRESULT RemoveHandle(HANDLE hObject) throw();

Параметры

hObject
Дескриптор для удаления.

Возвращаемое значение

Возвращает S_OK при успешном выполнении или ошибку HRESULT при сбое.

Замечания

При удалении дескриптора IWorkerThreadClient::CloseHandle будет вызываться для связанного объекта, переданного в AddHandle. Если этот вызов завершается ошибкой, CWorkerThread вызовет функцию Windows CloseHandle в дескрипторе.

CWorkerThread::Shutdown

Вызовите этот метод, чтобы завершить работу рабочего потока.

HRESULT Shutdown(DWORD dwWait = ATL_WORKER_THREAD_WAIT) throw();

Параметры

dwWait
Время в миллисекундах, чтобы дождаться завершения работы рабочего потока. ATL_WORKER_THREAD_WAIT по умолчанию — 10 секунд. При необходимости можно определить собственное значение для этого символа, прежде чем включать atlutil.h.

Возвращаемое значение

Возвращает S_OK об успешном выполнении или ошибке HRESULT при сбое, например, если превышено значение времени ожидания, dwWait.

Замечания

Чтобы повторно использовать объект, вызовите CWorkerThread::Initialize после вызова этого метода.

Обратите внимание, что вызов Shutdown объекта, инициализированного указателем на другой CWorkerThread объект, не влияет и всегда возвращает S_OK.

См. также

DefaultThreadTraits
Классы
Многопоточность. Создание рабочих потоков
Интерфейс IWorkerThreadClient