簡體   English   中英

為什么在XNA游戲中以緩慢的FPS將[STAThread]放在Program.Main上會阻止還原到最小化?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM