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


Класс CWorkerThread

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

Важно!

Этот класс и его члены нельзя использовать в приложениях, выполняемых в среде выполнения 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