强制Qt GUI更新

时间:2010-12-14 20:39:59

标签: c++ multithreading debugging qt thread-safety

我在Qt中编写了一个桌面游戏,玩家在移动后,计算机AI必须暂停并思考一段时间。然而,在思考时,似乎在每行代码执行之前屏幕都不会更新。因此,用户可以点击一个正方形,几秒钟内看不到任何事情,然后突然看到他的移动计算机移动的结果。

为了解决这个问题,我尝试创建一个AI运行其代码的新线程,然后将其片段放在板上。然而,有时(并且这是非常不一致的)游戏在计算机移动后崩溃了。

你们也可以:

  1. 告诉我强制MainWindow如何更新其内容
  2. 帮我尝试调试崩溃问题(我对线程来说是全新的)
  3. 编辑 - 我尝试将断点设置为suszterpatt建议,并且程序似乎在调试器中一致地崩溃(在我设置断点之前不是这样)。

    无论如何,当我逐步完成程序时,它似乎很好地通过run函数,直到它到达结束括号,然后如果我单步执行它跳转到qthread_win.cpp上的第317行,只是说

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

    如果我单步执行该行,调试器会冻结,Qt会在20秒后发出警报。如果我继续,我得到“这个应用程序已经请求运行时以一种不寻常的方式终止它”消息,当我没有调试时,程序偶尔会崩溃。

    我现在该怎么办?

2 个答案:

答案 0 :(得分:5)

崩溃的原因可能有多种原因,但如果我不得不猜测,我会说你可能正在调用GUI对象的方法(标签,文本框,游戏板等)。 AI线程。

线程在Qt中相互通信的方式是通过一个名为signals and slots的机制:AI线程应该暴露一组信号,即'beginThink','endThink',并且UI线程应该注册到那些信号(带槽)并作出相应的反应。这在文档中已经完全记录了。

答案 1 :(得分:0)

尝试将代码移出单独的线程。一旦你有它工作,你可以尝试将其移回,你会知道任何与线程相关的问题。我认为如果全部在同一个帖子上,你的更新问题就会消失。