2012-09-26 3 views
0

나는 프로그램을 어떻게 구조화해야하는지 알아 내는데 어려움을 겪고있다. 먼저 내 프로그램에 대한 일반적인 설명을 기술 한 다음 내가 시도한 사항과 내가 겪은 문제로 들어갑니다. 나는 게임을 개발하는 것이 아니라 인간의 시력을 테스트하기위한 컴퓨터 화 된 테스트의 모음입니다. 나는 포스트가 조금 길다는 것을 알고 있지만, 나는 가지고있는 문제에 대해 가능한 한 명확하고 싶다. 미리 감사드립니다!이벤트를 안전하게 스레드로 전달하는 방법. SlimDX/DX9

디자인 : 프로그램은 다양한 유형의 테스트를 선택하고 테스트를위한 다양한 옵션을 구성 할 수있는 많은 옵션이있는 "기본 메뉴"VB.Net 양식을 시작합니다. 사용자가 특정 테스트에 대한 RunTest 단추를 클릭하면 해당 테스트를 나타내는 TestObject가 만들어집니다. TestObject 생성자는 SlimDX RenderForm 클래스에서 파생 된 StimulusDisplayObject (SDO)를 만듭니다. SDO 클래스의 일은 SlimDX 장치 객체를 관리하고 화면에 다른 자극을 렌더링하는 것입니다. 본질적으로 .bmp 이미지에서로드 된 DX 표면 인 StimulusObjects (SO) 목록과 화면에서 표면을 그리는 위치를 SDO 클래스에 알리는 위치 정보가 포함되어 있습니다. SDO가 생성 된 후 관찰자에게 여러 번의 시도를 보여주는 루프 인 TestObject.BeginTest() 메소드가 호출됩니다. 루프는 일부 SO 오브젝트를 작성하고이를 표시 할 SDO 클래스의 SO 오브젝트 목록에 추가합니다.

문제점 : 테스트를 위해 미리 설정 한 자극이 상당히 정적이어서 보통 초당 2 ~ 3 회씩 화면에 표시된 이미지를 변경해야하기 때문에 계속해서 장면 렌더링을하지는 않았습니다. 가능한 한 높은 FPS를 유지해야합니다. SDO.RenderScene()은 단순히 화면에서 뭔가를 변경해야 할 때마다 TestObject에서 호출됩니다. 이것은 DeviceLostExceptions 및 사용자 ALT-TABs, CTRL-ALT-Delete, 창을 창 모드 (창 모드 일 때) 등에서 발생하는 유사한 문제를 처리하기 전까지는 꽤 잘 작동했습니다.) 효과적인 방법을 찾지 못했습니다. 장면을 계속 렌더링하지 않고도 이러한 유형의 오류를 처리 할 수 ​​있습니다.

그래서 SlimDXs MessagePump.Run() 기능을 사용하여 장면을 지속적으로 렌더링하려고 시도했지만 SDO MessagePump.Run()이 "Main Menu"의 MessagePump와 충돌하므로 예외가 발생합니다. WinForm (적어도이 오류 메시지는 다음과 같은 의미입니다. "추가 정보 : 단일 스레드에서 두 번째 메시지 루프를 시작하는 것이 유효한 작업이 아닙니다."). 새로운 스레드에서 SDO 객체를 만들려고했지만 그 후에 TestObject와 SDO 객체 사이에서 통신하여 SO 객체를 추가/제거/변경하지 못했습니다. 멀티 스레드 응용 프로그램을 만드는 것이 최선의 방법이라는 것을 100 % 확신하지는 않습니다. 왜냐하면 DX와 스레딩이 악몽을 꾸미는 것으로 이어지지 만 다른 솔루션은 보이지 않기 때문입니다. 나는 어떤 종류의 스레드 동기화를 사용하는 법을 배워야한다고 생각하지만, 스레딩에 아주 새롭다. 그리고 동기화를 배우는데 오랜 시간을 투자하기 전에 실패 할 운명의 길로 향하고 있지 않은지 확인하고 싶다. 스레드. 다중 스레드 응용 프로그램을 만드는 것이 최선의 선택이라면 내가 알아야 할 DX/SlimDX 스레드 문제가 있습니까? 스레드간에 데이터를 동기화하는 간단한 SlimDX 스레드 프로그램의 예는 무엇입니까? 이 게시물을 읽을 시간을내어 주셔서 감사 드리며 제공 할 수있는 조언에 대해 매우 감사드립니다.

+0

더 간결한 경우 잠재 고객이 늘어납니다. –

+1

예 ... 그건 나쁜 습관입니다. 미래를 생각해 보겠습니다. –

+0

너무 재미있어 : 당신이 책을 쓴, 누군가가 회신에 책을 게시 :-) –

답변

1

vanattab, 왜이 온라인 (무료) 책에서 .net 플랫폼의 멀티 스레딩에 대해 알아야 할 모든 것이 있는지 찾아보십시오. C# 지향이지만 VB와 동일한 기술이 적용됩니다.

http://www.albahari.com/threading/

+0

링크를 가져 주셔서 감사합니다. 제가 확인하겠습니다. –

관련 문제