2013-03-08 1 views
1

웹캠에서 이미지와 비디오를 캡처하기 위해 C++ DLL을 사용하는 VideoObject 클래스가 있습니다. 나는 DLL이 이것을하기 위해 DirectShow를 사용한다고 들었다. 그것은 또한 내가 통제 할 수없는 몇 가지 자체 스레드를 시작하는 것으로 보인다.DLL로 인해 특정 시나리오에서 Winforms UI가 느리게 실행됩니다.

VideoObject 클래스는 그 자체로 정상적으로 작동하는 것 같습니다. 이미지와 비디오를 캡처 할 수 있습니다. 그러나이 기능을 사용하면 기본 UI의 성능에 부정적인 영향을줍니다. 매우 느려집니다.

내가 인스턴스화하면 내이

public partial class ParentForm : Form 

    private VideoObject videoObject; 

    public ParentForm() 
    { 
     videoObject = new VideoObject(); 
    } 
} 

같은 VideoObject 다음 UI는 매우 랙이된다. 내 생각 엔 VideoObject의 기본 DLL이 무엇이든지 내 응용 프로그램의 UI 스레드에 영향을 미치고 있습니다.

지금은 자체의 MTA 스레드에서 VideoObject 인스턴스를 시작하여 이러한 지연을 완화 할 수 있습니다. (전 C#에 완전히 새로운 해요, 그래서 다음을 추측하고있어 매우 영리하지 않을 수 있습니다.)

public partial class ParentForm : Form 

    private VideoObject videoObject; 
    private Thread videoObjectThread; 

    public ParentForm() 
    { 
     videoObjectThread = new Thread(new ThreadStart(() => videoObject = new VideoObject())); 
     videoObjectThread.SetApartmentState(ApartmentState.MTA); 
     videoObjectThread.Start(); 
    } 
} 

하지만 난 한 경우에만, 내가 지금 videoObject 인스턴스와 상호 작용할 수 있으며, UI가 지연되지 않습니다 Form의 생성자에있는 인스턴스에 대한 추가 참조가 없습니다.

어떤 식 으로든 Form의 생성자에서이 스레드 인스턴스와 상호 작용하면 UI가 다시 지연됩니다. 그것은 내 양식의 생성자에서 VideoObject의 인스턴스와의 직접적인 상호 작용이 UI의 느린 동작을 유도하는 것과 같습니다.

아무도 내가 보는 행동에 대한 통찰력을 갖고 있지 않습니까?

편집 : 내가 'laggy'로 무엇을 의미하는지 분명히 밝혀야합니다. 메인 패널의 UI가 영구적으로 느려지고 느려집니다. 그밖에 영향을받는 것은 없습니다. VideoObject의 모든 작업은 예상대로 작동하며 어떤 식 으로든 느리게 실행되거나 지연되지 않습니다.

Form의 생성자에서 VideoObject를 '누르지'않으면 UI가 완벽하게 작동합니다. 이후에 VideoObject의 메서드를 호출해도 UI가 느리게 실행되지 않습니다.

주 양식의 생성자에서 VideoObject에 액세스하는지 여부에 따라 달라집니다.

답변

1

비디오 객체의 메서드를 호출 할 때마다 비디오 객체와 상호 작용하는 데 사용하는 스레드를 일시적으로 차단하는 오버 헤드가 있어야합니다. 비디오 구성 요소는 메서드가 호출되거나 객체가 인스턴스화 될 때 큰 객체를 메모리에로드해야 할 수도 있습니다.

비디오 객체의 메서드에 대한 비동기 호출을 시도 했습니까? 비디오 객체가 무엇이든간에 반환되기를 기다리는 동안 효과적으로 차단하지 않습니다.

비디오 구성 요소의 특성을 모른 채 추측하기 어렵습니다.

당신이 생각할 수있는 한 가지는 WCF 서비스에서 비디오 개체를 랩핑하고 자체 프로세스로 호스팅 한 다음 NetTcpBinding을 사용하여 구성 요소와 상호 작용하는 것입니다.답장을

http://msdn.microsoft.com/en-us/library/bb332338.aspx

http://msdn.microsoft.com/en-us/library/system.servicemodel.nettcpbinding.aspx

+0

감사합니다. 객체가 초기화 될 때 초기 오버 헤드가 있지만 그 밖의 경우는 거의 없습니다. 인스턴스와 상호 작용하지 않을 때에도 UI는 여전히 매우 느립니다. 뭔가 'under-the-hood'DLL에서 내가 생각하는 문제를 일으키는 것입니다. 증상을 더 잘 설명하려고 편집했습니다. 다시 건배. –

+0

예, 비디오 구성 요소는 본질적으로 DLL의 기능을 제공합니다. DLL의 코드가 없습니다. 내가 들었던 것은 DirectShow를 사용한다는 것입니다! –

관련 문제