[英]Why does putting [STAThread] on Program.Main in XNA game with slow FPS prevents restoring on minimize?
我要解決的症狀是,將XNA應用程序最小化后的某些時間將無法恢復。 我單擊最小化按鈕,但是當我單擊任務欄中的應用程序條目時,該應用程序不會繼續運行-仍保持最小化。 此外,我聽到了Windows“叮”聲效果的播放。
如果我反復單擊該應用程序,則有時會恢復。 我發現,如果我的應用程序在每幀Update調用中的處理時間更少,那么問題就更難重現了。 如果我添加此:
System.Threading.Thread.Sleep(100);
那么恢復應用程序幾乎是不可能的。
我發現,如果我刪除Program.Main上的[STAThread],它總是可以完美恢復; 但是,我使用winforms OpenFileDialog,它要求在Main方法上設置STAThread,所以我無法擺脫該屬性。
是否對為什么會發生這種想法有任何想法,是否有辦法同時使用STAThread和使應用程序正確恢復?
編輯:內部我的應用程序正在使用ThreadPool.QueueUserWorkItem,而這的存在是導致此問題的原因。 這是否意味着不應在STAThread應用程序中使用ThreadPool.QueueUserWorkItem?
您是說STAThreadAttribute嗎? 如果不是,則將其放在main方法上。
我使用STAThreadAttribute和ThreadPool.QueueUserWorkItem,並且沒有此問題。 請注意,Sleep()專門阻止窗口響應,因為它阻塞了線程。 理想情況下,您不應該在游戲的主線程上使用睡眠。
我使用了另一種方法來解決此問題。 為了防止對話框和表單阻塞主線程,我將代碼放在單獨的子例程中並啟動一個新線程:
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#。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.