웹캠에서 이미지와 비디오를 캡처하기 위해 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에 액세스하는지 여부에 따라 달라집니다.
감사합니다. 객체가 초기화 될 때 초기 오버 헤드가 있지만 그 밖의 경우는 거의 없습니다. 인스턴스와 상호 작용하지 않을 때에도 UI는 여전히 매우 느립니다. 뭔가 'under-the-hood'DLL에서 내가 생각하는 문제를 일으키는 것입니다. 증상을 더 잘 설명하려고 편집했습니다. 다시 건배. –
예, 비디오 구성 요소는 본질적으로 DLL의 기능을 제공합니다. DLL의 코드가 없습니다. 내가 들었던 것은 DirectShow를 사용한다는 것입니다! –