DirectShow DirectShow 레퍼런스 DirectShow base class base class 레퍼런스 CAMThread [목차열람] [주소복사] [슬롯비우기] |
Microsoft DirectX 9.0 |
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를 잠근다. 예를 들어,Create 와 CallWorker 메서드는 이 잠금을 보관 유지해, thread의 조작을 계속한다. CAMThread::m_WorkerLock 를 사용해, thread간에 공유되고 있는 데이터를 잠근다.