2010-12-14 53 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