2011-12-24 2 views
0

저는 DSPACK 컴포넌트 라이브러리를 사용하는 Delphi 6 DirectShow 푸시 소스 비디오 필터를 가지고 있습니다. 특정 작업을 수행하기 전에 필터의 어떤 측면에서 필터 상태를 잠그는 것이 필요합니까? 예를 들어, 내 필터의 FillBuffer() 메소드에서 비트 맵 캔버스를 작성하기 전에 필터의 공유 상태를 잠글 필요가 있습니까? 또는 필터 핀 연결/연결 해제 이벤트 또는 미디어 형식 협상 등과 같이 공유 상태가 잠겨야만하는 작업입니까?DirectShow 필터의 공유 상태를 잠그는 것에 대해 언제 걱정해야합니까?

답변

2

원자 적 조작을 보장하기 위해 필터를 잠글 수 있습니다 (필터 특정 적이 지 않으며 다중 스레드 환경의 모든 오브젝트에 적용됩니다). 일반적으로 데이터 액세스 또는 작업의 일련 화입니다.

예를 들어, CTransformFilter 클래스에는 두 개의 중요한 섹션 인 m_csFilterm_csReceive이 있습니다.

m_csFilter은 한 스레드가 무언가를 변경하는 동안 다른 스레드가 동일한 데이터를 동시에 만지지 않도록 데이터 상태를 보호합니다. 다른 하나 인 m_csReceive은 수신 및 스트림 끝 이벤트를 직렬화하는 데 사용됩니다.

동시 스레드의 작업으로 작업이 중단되지 않도록 필터 상태를 잠글 필요가 있습니다. 자물쇠가 다른 스레드를 지연시킬 수 있으므로 다른 스레드에서 실행 가능한 최소한의 시간에만 자물쇠를 잠그는 것이 좋습니다.

+0

감사합니다. 내 코드 외부의 레이어에있는 DirectShow가 특정 작업이 진행 중임을 알릴 필요가있는 "특수한"세마포어라고 생각했습니다. 귀하의 설명에서와 같이 그것은 표준 동기화 시나리오 일뿐입니다. –

관련 문제