Класс 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 для блокировки данных, общих между потоками.
Требования
Требование | Значение |
---|---|
Заголовок |
|
Библиотека |
|