2013-08-17 10 views
0

내가 해결하려고하는 증상은 XNA 응용 프로그램이 최소화 된 후 시간을 일부 복원하지 않는다는 것입니다. 최소화 버튼을 클릭했지만 작업 표시 줄에서 내 응용 프로그램의 항목을 클릭하면 응용 프로그램이 다시 시작되지 않습니다. 최소화 된 상태로 유지됩니다. 또한 Windows "딩 (ding)"효과음이 들립니다.느린 FPS가있는 XNA 게임의 Program.Main에 [STAThread]를 두는 것이 왜 최소화시 복원을 방해합니까?

응용 프로그램을 반복적으로 클릭하면 때때로 다시 시작됩니다. 내 응용 프로그램이 모든 프레임 업데이트 호출에서 처리 시간이 적 으면 문제를 재현하는 것이 어렵다는 것을 발견했습니다. 추가 할 경우 :

System.Threading.Thread.Sleep(100); 

응용 프로그램을 다시 시작하는 것은 거의 불가능합니다.

Program.Main에서 [STAThread]를 제거하면 항상 완벽하게 재개됩니다. 그러나, WinForm 해당 OpenFileDialog 's 사용할 수 없도록 주 메서드를 설정할 수있는 STAThread 필요합니다.

왜 이런 일이 벌어지고 있는지, 그리고 STAThread를 사용하고 응용 프로그램을 제대로 재개 할 수있는 방법이 있다면 어떻습니까?

편집 : 내부적으로 내 응용 프로그램은 ThreadPool.QueueUserWorkItem을 사용하고 있으며 그 원인은이 문제의 원인입니다. 이것은 ThreadPool.QueueUserWorkItem이 STAThread 어플리케이션에서 사용되어서는 안된다는 것을 의미합니까?

답변

0

STAThreadAttribute를 의미합니까? 그렇지 않다면 대신 main 메소드에 두십시오.

나는 STAThreadAttribute와 ThreadPool.QueueUserWorkItem을 사용하며이 문제가 없습니다. Sleep()은 특히 스레드가 스레드를 차단하기 때문에 응답하지 않도록합니다. 이상적으로 게임의 메인 스레드에서 수면을 사용하면 안됩니다.

0

이 문제를 해결하기 위해 다른 방법을 사용했습니다. 메인 스레드를 차단하는 내 대화 상자와 형태를 유지하기 위해, 나는 별도의 서브 루틴에 내 코드를 배치하고 새 스레드 시작 : 물론

Protected Overrides Sub Update(gametime As GameTime) 
    ... 
    If (Keyboard.GetState().IsKeyDown(Microsoft.Xna.Framework.Input.Keys.O)) Then ' load a new object 
     If loadthreadrunning = False Then 
      loadthreadrunning = True 
      Dim thread As New Thread(AddressOf BackgroundLoader) 
      thread.SetApartmentState(ApartmentState.STA) 
      thread.Start() 
     End If 
    End If 
    ... 
End Sub 

... 
Sub BackgroundLoader() 
    Dim fd As New OpenFileDialog 
    Dim dlgres As DialogResult 
    dlgres = fd.ShowDialog() 
    ... 
    loadthreadrunning = False 
End Sub 

, VB에 내 코드를하지만, 같은 기술은 C#을 위해 작동합니다 .