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


Класс CAMThread

[Функция, связанная с этой страницей DirectShow, является устаревшей функцией. Он был заменен MediaPlayer, IMFMediaEngine, и аудио/ видео захвата в Media Foundation. Эти функции оптимизированы для Windows 10 и Windows 11. Корпорация Майкрософт настоятельно рекомендует использовать в новом коде MediaPlayer, IMFMediaEngine и аудио/видеозахват в Media Foundation вместо DirectShow, когда это возможно. Корпорация Майкрософт предлагает переписать существующий код, в котором используются устаревшие API, чтобы по возможности использовать новые API.]

Класс CAMThread является абстрактным классом для управления рабочими потоками.

Защищенные переменные-члены Описание
m_hThread Дескриптор потока.
Открытые переменные-члены Описание
m_AccessLock Критический раздел, который блокирует доступ к потоку другими потоками.
m_WorkerLock Критический раздел, который блокирует данные, совместно используемые потоками.
Открытые методы Описание
CAMThread Метод конструктора.
~ CAMThread Метод деструктора. Виртуальной.
InitialThreadProc Вызывает метод ThreadProc при создании потока.
Создать Создает поток.
CallWorker Сигнализирует потоку с помощью запроса.
Закрыть Ожидает выхода потока, а затем освобождает свои ресурсы.
ThreadExists Запрашивает, существует ли поток.
GetRequest Ожидает следующего запроса.
CheckRequest Проверяет наличие запроса без блокировки.
Ответить Отвечает на запрос.
GetRequestHandle Извлекает дескриптор события, сигнализоваемого методом CallWorker.
GetRequestParam Извлекает последний запрос.
CoInitializeHelper Вызывает CoInitializeEx в начале потока.
Чистые виртуальные методы Описание
ThreadProc Процедура потока.

Комментарии

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

  • Наследуйте класс от CAMThread и переопределите чистый виртуальный метод CAMThread::ThreadProc. Этот метод представляет собой процедуру потока, которая вызывается в начале потока.
  • В приложении создайте экземпляр производного класса. При создании объекта поток не создается. Чтобы создать поток, вызовите метод CAMThread::Create .
  • Чтобы отправить запросы в поток, вызовите метод CAMThread::CallWorker . Этот метод принимает параметр DWORD, значение которого определяется классом . Метод блокируется до тех пор, пока поток не ответит (см. ниже).
  • В процедуре потока отвечайте на запросы, вызывая CAMThread::GetRequest или CAMThread::CheckRequest. Метод GetRequest блокируется до тех пор, пока другой поток не вызовет CallWorker. Метод CheckRequest не блокируется, что позволяет потоку проверка для новых запросов во время асинхронной работы.
  • Когда поток получает запрос, вызовите CAMThread::Reply , чтобы разблокировать вызывающий поток. Метод Reply принимает параметр DWORD, который передается в вызывающий поток в качестве возвращаемого значения для CallWorker.

Завершив работу с потоком, вызовите метод CAMThread::Close . Этот метод ожидает выхода потока, а затем закрывает дескриптор потока. Сообщение ThreadProc должно быть гарантированно завершено самостоятельно или в ответ на запрос CallWorker. Метод деструктора также вызывает Close.

В следующем примере показаны эти шаги.

class MyThread : public CAMThread
{
protected:
    DWORD ThreadProc(void);
};

DWORD MyThread::ThreadProc()
{
    BOOL bShutDown = FALSE;
    while (!bShutDown)
    {
        DWORD req = GetRequest();
        printf("Request: %d\n", req);
        bShutDown = (req == 0);
        Reply(bShutDown ? S_FALSE : S_OK);
    }
    printf("Quitting Thread\n");
    return 1;
}

void main()
{
    MyThread thread;
    DWORD reply;
    
    thread.Create();
    reply = thread.CallWorker(3);
    reply = thread.CallWorker(0); // Thread exits.
}

В производном классе можно также определить функции-члены, которые проверяют параметры для CallWorker. В следующем примере показан типичный способ сделать это:

enum Command {CMD_INIT, CMD_RUN, CMD_STOP, CMD_EXIT};

HRESULT Init(void)  { return CallWorker(CMD_INIT); }
HRESULT Run(void)   { return CallWorker(CMD_RUN); }
HRESULT Stop(void)  { return CallWorker(CMD_STOP); }
HRESULT Exit(void)  { return CallWorker(CMD_EXIT); }

Класс CAMThread предоставляет два критически важных раздела в виде открытых переменных-членов. Используйте , CAMThread::m_AccessLock чтобы заблокировать доступ к потоку другими потоками. (Например, методы Create и CallWorker удерживают эту блокировку для сериализации операций в потоке.) Используйте CAMThread::m_WorkerLock для блокировки данных, общих между потоками.

Требования

Требование Значение
Заголовок
Wxutil.h (включая Streams.h)
Библиотека
Strmbase.lib (розничные сборки);
Strmbasd.lib (отладочные сборки)