CAMThread 클래스

[이 페이지와 연결된 기능인 DirectShow는 레거시 기능입니다. MediaPlayer, IMFMediaEngine 및 Media Foundation의 오디오/비디오 캡처로 대체되었습니다. 이러한 기능은 Windows 10 및 Windows 11 최적화되었습니다. 가능한 경우 새 코드가 DirectShow 대신 Media Foundation에서 MediaPlayer, IMFMediaEngine오디오/비디오 캡처를 사용하는 것이 좋습니다. 가능한 경우 레거시 API를 사용하는 기존 코드를 다시 작성하여 새 API를 사용하도록 제안합니다.]

클래스는 CAMThread 작업자 스레드를 관리하기 위한 추상 클래스입니다.

보호된 멤버 변수 Description
m_hThread 스레드에 대한 핸들입니다.
공용 멤버 변수 Description
m_AccessLock 다른 스레드에서 스레드에 액세스하지 못하도록 잠그는 중요한 섹션입니다.
m_WorkerLock 스레드 간에 공유되는 데이터를 잠그는 중요한 섹션입니다.
Public 메서드 Description
CAMThread 생성자 메서드입니다.
~ CAMThread 소멸자 메서드입니다. 가상.
InitialThreadProc 스레드를 만들 때 ThreadProc 메서드를 호출합니다.
만들기 스레드를 만듭니다.
CallWorker 요청으로 스레드에 신호를 보냅니다.
닫기 스레드가 종료될 때까지 기다린 다음, 해당 리소스를 해제합니다.
ThreadExists 스레드가 있는지 여부를 쿼리합니다.
GetRequest 다음 요청을 기다립니다.
CheckRequest 차단 없이 요청이 있는지 확인합니다.
회신 요청에 회신합니다.
GetRequestHandle CallWorker 메서드에서 신호를 받은 이벤트에 대한 핸들을 검색합니다.
GetRequestParam 최신 요청을 검색합니다.
CoInitializeHelper 스레드 시작 시 CoInitializeEx를 호출합니다.
순수 가상 메서드 Description
ThreadProc 스레드 프로시저.

설명

이 클래스는 작업자 스레드를 만들고, 스레드에 요청을 전달하고, 스레드가 종료하기를 기다리는 메서드를 제공합니다. 이 클래스를 사용하려면 다음을 수행합니다.

  • 에서 CAMThread 클래스를 파생하고 순수 가상 메서드 CAMThread::ThreadProc을 재정의합니다. 이 메서드는 스레드 시작 시 호출되는 스레드 프로시저입니다.
  • 애플리케이션에서 파생 클래스의 instance 만듭니다. 개체를 만들면 스레드가 만들어지지 않습니다. 스레드를 만들려면 CAMThread::Create 메서드를 호출합니다.
  • 스레드에 요청을 보내려면 CAMThread::CallWorker 메서드를 호출합니다. 이 메서드는 클래스에서 의미를 정의하는 DWORD 매개 변수를 사용합니다. 메서드는 스레드가 응답할 때까지 차단합니다(아래 참조).
  • 스레드 프로시저에서 CAMThread::GetRequest 또는 CAMThread::CheckRequest를 호출하여 요청에 응답합니다. GetRequest 메서드는 다른 스레드가 CallWorker를 호출할 때까지 차단합니다. CheckRequest 메서드는 비차단이므로 비동기적으로 작업하는 동안 스레드가 새 요청에 대해 검사 수 있습니다.
  • 스레드가 요청을 받으면 CAMThread::Reply 를 호출하여 호출 스레드의 차단을 해제합니다. Reply 메서드는 호출 스레드에 CallWorker의 반환 값으로 전달되는 DWORD 매개 변수를 사용합니다.

스레드를 완료하면 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(디버그 빌드)