2010-12-14 100 views
1

我在Qt中編寫一個桌面遊戲,在玩家進行移動之後,計算機AI必須暫停並思考一段時間。然而,在思考時,似乎只有在每行代碼執行之後屏幕纔會更新。因此,用戶會點擊一個方塊,幾秒鐘內沒有發生任何事情,然後突然看到他的移動結果計算機的移動。強制Qt GUI更新

爲了解決這個問題,我嘗試創建一個AI運行其代碼的新線程,然後將其放在板上。然而,有時(這是非常不一致的)遊戲在計算機移動後崩潰。

所以你們可以兩種:

  1. 告訴我如何迫使主窗口,以更新其內容
  2. 幫我嘗試調試崩潰的問題(我完全新的線程)

編輯 - 我嘗試設置斷點爲suszterpatt建議,程序似乎在調試器中一直崩潰(它不是在我設置斷點之前)。

不管怎麼說,我通過程序步驟,似乎要經過run功能罰款,直到它到達結尾括號,然後如果我通過它一步跳躍到線317上qthread_win.cpp,這只是說

finish(arg); //line 317 
return 0; 

如果我經過那一行,調試器凍結並且Qt在20秒後發出警告。如果我繼續,我會收到「此應用程序請求運行時以非常規方式終止它」的消息,當我不調試時程序偶爾崩潰時,我會收到這條消息。

現在該怎麼辦?

+0

你應該堅持創建一個單獨的AI線程。只有2個線程,調試不應該太「難」,特別是如果你已經知道崩潰發生的位置:你可能只是放下一些斷點,看看哪一個最後被執行,然後從那裏縮小它。 – suszterpatt 2010-12-14 20:51:36

+0

@susz好的確定,但我不太確定哪裏出現崩潰。去谷歌在qt設置斷點... – wrongusername 2010-12-14 20:52:54

回答

5

崩潰的原因可能是各種各樣的原因,但如果我不得不猜測,我會說你可能調用GUI對象的方法(標籤,文本框,你的遊戲板等) AI線程。在Qt中,線程彼此通信的方式是通過一種叫做signals and slots的機制:AI線程應該公開一組信號,即'beginThink','endThink',並且UI線程應該註冊這些信號(與插槽)並相應地作出反應。這在文檔中非常全面。

+0

嗯,我應該丟棄我目前使用的函數指針,並改用信號和插槽來代替? – wrongusername 2010-12-14 21:09:32

+0

@wrong:絕對。 Qt沒有什麼正確的IMO,但信號和插槽絕對是其中之一。 – suszterpatt 2010-12-14 21:30:44

+0

雖然我沒有任何東西在調用任何GUI東西的AI線程中,但我看到'QPainter :: begin:一個繪畫設備一次只能由一個畫家繪製。 QPainter :: setBrush:Painter not active'和'QPainter :: drawRects:Painter not active'在它崩潰前重複。 – wrongusername 2010-12-15 02:38:30

0

嘗試將代碼移出單獨的線程。一旦你有它的工作,你可以嘗試將它移回來,你會知道任何問題都與線程有關。我認爲如果它們全部在同一個線程上,您的更新問題將會消失。

+0

如果我直接調用'run'方法而不是用'start'啓動線程,代碼就可以正常工作。我很確定它是線程相關的,但你想成爲「所有在同一線程中」? – wrongusername 2010-12-14 21:06:34