2011-11-19 4 views
0

나는 작동하지만 뭔가 문제가있는 것이 확실하다.다른 스레드의 Win32 Dll에서 C# Panel의 HWND를 사용 하시겠습니까?

일부 비디오 처리를 수행하고 Direct3D를 디스플레이 (내 코드 아님)로 사용하는 Win32 C++ 응용 프로그램이 있습니다. 내 작업은 GUI를 C# GUI로 대체합니다.

나는 C++ 코드를 dll로 만들었습니다. C#으로 GUI를 만들고 비디오 디스플레이 용 패널이 있습니다. 이 패널의 HWND를 dll에 전달하면 모든 것이 잘 작동하는 것 같습니다.

하지만이 패널은 작성된 스레드가 아닌 다른 스레드가 액세스하고 있기 때문에 수행하지 않아야합니다.
"나 혼자만 잘 나가고 싶다"고 생각하는 부분은 잘못되었지만 문제가 생길 수 있습니다. 예를 들어, 패널에서 클릭 이벤트를 잡아 내고 싶을 때, 패널을 생성 한 메인 또는 UI 스레드 ...에있을 것입니다.

내가 어떻게해야하는지에 대한 제안 사항은 무엇입니까? 감사합니다. 감사합니다.

+0

괜찮습니다. SetParent()를 사용하십시오. –

+0

아마도 C++ 코드에 Panel HWND를 직접 사용하지 않고 Panel의 하위 노드 인 자체 HWND를 생성해야합니다. 그러면 원하는대로 할 수 있습니다. (패널의 수명이 다하면 패널의 크기가 바뀌면 C# 코드 P/Invoke to C++를 사용하여 적절하게 크기를 조정해야한다는 것을 알 필요가 있습니다. 간단하지만 스레드 간 SetWindowPos를 사용할 수 있습니다.) – BrendanMcK

답변

0

이 기술로 보아온 주된 문제점은 UI가 깜박일 수 있다는 것입니다. WPF를 사용하는 과정에서 초기 단계 인 경우 D3DImage을보고 싶을 수도 있습니다. 현재 수행중인 작업이 대부분 작동하지 않으면.

+0

다시 실행하지 않습니다. 비디오 프로세싱은 수년간 기능적이었습니다. 순수한 C++ 버전에서 "다른 스레드의 창에 액세스하지 마십시오"규칙을 위반합니다. 그 부분은 DLL에 머무르고 있습니다 – KateToo

2

나는이 문제에 대한 답을 이미 알고 있다고 생각합니다. Windows 스레드 선호도가 있습니다. 창에 대한 모든 작업은 창을 만든 스레드에서 수행해야합니다.

이 규칙이 주어지면, DLL이 윈도우 액세스를 다른 스레드로 옮기고 그 코드가 당신의 코드라고 가정한다고 상상할 수 없습니다. 이 솔루션은 DLL을 호출하는 동일한 스레드에서 창을 만들고 액세스 할 수 있도록 해줍니다.

+0

비디오 프로세싱을 위해 C++ 측에는 많은 양의 데이터가 있습니다 - 그래서 저는 C# 측에 가져 오지 않을 것입니다. C++ 측에서 이렇게하려면 component.InvokeRequired와 Invoke가 동일한가요? – KateToo

+0

C# 코드에서 Invoke를 사용하는 것이 가장 쉽습니다. –

관련 문제