所以,作为介绍,正如孩子们所说,我是个菜鸟。我在大学里学过CS1和CS2,(如果我没记错的话)我们学到了递归、链表、二叉树等,没有涉及GUI编程或多线程。
所以,现在我正在尝试学习C语言,我有了一个想法,我想写一个平台风格的游戏作为目标。我还有很长的路要走,但是,嘿,有目标是很好的。
所以,问题基本上是这样的:我的理解是GTK是事件驱动的,它位于gtk_main()中,等待用户做一些事情,然后使用回调函数处理事件(也许这是一个简单的理解,但在我的头脑中它是有意义的,我已经能够用这种方式编写几个具有图形界面的简单程序)。无论如何,在平台风格的游戏中,即使用户没有按键或鼠标按钮,也需要发生一些事情。所以我的想法是,您仍然可以让gtk_main()坐在那里等待输入事件并处理它们,然后在GTK等待用户时使用另一个线程让程序执行视频游戏之类的事情。换句话说,不管Mario是否在移动,Donkey Kong仍然需要扔桶。
这个网站上的一个类似的问题让我想到了多线程方面的this tutorial,但我想知道是否有任何关于将其应用于GTK的具体信息。我的Google-fu可能很弱,但似乎互联网上没有太多东西,而且我找到的很少的信息让它听起来像是把线程和GTK混在一起可能有点危险。
谢谢你的帮忙!
发布于 2013-04-15 20:20:58
我相信你误解了一个人需要多线程的情况。GTK的事件循环可以很好地服务于平台游戏,因为您的回调不仅在输入事件上被调用,而且在also on timeouts上被调用。此功能允许实现动画,因为无论用户是否按下某个键,您都可以安排Mario每秒移动几次。
换句话说,只要您的回调在绘制下一帧之前返回,您的游戏就不会错过任何节拍,所有这些都不会使用线程。许多看起来响应性很好的应用程序和游戏的核心都是单线程的,或者只将线程用于专门的任务。
多线程使用GUI工具包很复杂,需要经验丰富的专业程序员才能正确使用。由于各种技术原因,您必须从同一线程访问该工具包。这是explained in the documentation,还有其他一些血淋淋的细节。如果是这样的话,为什么这么多程序都吹嘘多线程,什么时候需要它呢?在GUI应用程序中需要多线程时,有几种情况:
理想情况下,您应该有一个线程池,其线程数与系统上的核心数一样多。当需要CPU绑定计算时,请求被推送到与线程池相关联的队列中,由池中的第一个空闲线程拾取。每当计算完成时,图形用户界面事件循环都会收到通知,以便它可以显示结果。
由于程序员无法预料到的原因,许多在“立即”返回主循环之前执行“快速任务”的回调最终花费了比预期更长的时间。例如,最初由十几条记录组成的数据集增长到十万条。或者,需要解析的小XML文件最终保存在网络磁盘上,永远无法访问。
防止GUI迟滞的体系结构与第1点中描述的体系结构非常相似,不同之处在于线程的数量可以超过内核的数量,并且所有重要的任务都被认为值得将其移交给单独的线程。具体地说,事件分派线程不做任何重要的处理-它只执行接收事件并将它们分派到执行实际工作的其他线程所需的最少量代码。
发布于 2013-04-15 14:50:08
您应该了解一下GThread,因为它是GLib的一部分),它是GLib和GTK+的独立于平台的多线程模块。基本上,您只需使用一个指向将要并行运行的函数的指针以及一个指向要传递给该函数的数据的指针来调用g_thread_create。但是您必须小心,不要因为封闭了gdk_threads_enter和gdk_threads_leave之间所有与GTK+相关的调用而影响UI的更新。
https://stackoverflow.com/questions/16009004
复制相似问题