DirectShow DirectShow 레퍼런스 DirectShow base class base class 레퍼런스 CAMThread   [목차열람] [주소복사] [슬롯비우기]
CAMThread 클래스
 
Microsoft DirectX 9.0

CAMThread 클래스

CAMThread 클래스는, 워커 thread를 관리하는 추상 클래스이다.

요건

헤더: Wxutil.h 로 선언해, Streams.h 를 인클루드 한다.

라이브러리: Strmbase.lib (리테일 빌드) 또는 Strmbasd.lib (디버그 빌드).

프로텍트 멤버 변수  
m_hThread thread의 핸들.
퍼블릭 멤버 변수  
m_AccessLock 다른 thread로부터 액세스 되지 않게 thread를 잠그는 크리티컬 섹션.
m_WorkerLock thread간에 공유되고 있는 데이터를 잠그는 크리티컬 섹션.
퍼블릭 메서드  
CAMThread 생성자 메서드.
~CAMThread 소멸자 메서드. 가상.
InitialThreadProc thread가 생성 되었을 때,ThreadProc 메서드를 호출한다.
Create thread를 생성 한다.
CallWorker thread에 요구를 통지한다.
Close thread의 종료를 기다려, 그 리소스를 릴리즈 한다.
ThreadExists thread가 있을지 어떨지를 문의한다.
GetRequest 다음의 요구를 기다린다.
CheckRequest 요구가 있는 경우는, 블록 하지 않고 체크한다.
Reply 요구에 응답한다.
GetRequestHandle CallWorker 메서드로 통지필의 이벤트의 핸들을 얻어온다.
GetRequestParam 최신의 요구를 얻어온다.
CoInitializeHelper thread의 시작시에 CoInitializeEx 를 호출한다.
순수 가상 메서드  
ThreadProc thread 프로시저.

주의

이 클래스는 워커 thread의 생성, 그 thread에의 요구의 송신, 그 thread의 종료 대기를 위한 메서드를 제공한다. 이 클래스의 사용법은 다음과 같다.

thread에서의 처리가 종료하면CAMThread::Close 메서드를 호출한다. 이 메서드는 thread의 종료를 대기해, thread 핸들을 닫는다. 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 종료.
}

파생한 클래스에서,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 클래스는 퍼블릭 멤버 변수로서 2 개의 크리티컬 섹션을 제공한다. CAMThread::m_AccessLock 를 사용해, 다른 thread로부터 액세스 되지 않게 thread를 잠근다. 예를 들어,CreateCallWorker 메서드는 이 잠금을 보관 유지해, thread의 조작을 계속한다. CAMThread::m_WorkerLock 를 사용해, thread간에 공유되고 있는 데이터를 잠근다.

↑TOP