Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
[Функция, связанная с этой страницей 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 для блокировки данных, общих между потоками.
Требования
| Требование | Значение |
|---|---|
| Заголовок |
|
| Библиотека |
|