所以,就像介绍一样,我就像孩子们说的那样,是一个菜鸟。我在大学时拿到了CS 1和2(如果我没记错的话),我们得到了递归,链表,二叉树等等。没有关于GUI编程或多线程的内容。
所以,现在我正在努力学习C,我有这个想法,我想写一个平台式游戏作为目标。我有办法去,但是,嘿,有东西可以拍摄。
所以,问题基本上是这样的:我的理解是GTK是事件驱动的,它位于gtk_main()中并等待用户执行操作,然后使用回调函数处理事件(可能这是一个简单的理解,但它在我的头脑中是有道理的,我已经能够用图形界面编写几个简单的程序,并以此方式思考它。无论如何,在平台式游戏中,即使用户没有按下按键或鼠标按钮,也需要进行操作。所以我的想法是你仍然可以让gtk_main()坐在那里等待输入事件并处理它们,然后另一个线程让程序在GTK等待用户时进行视频游戏。换句话说,无论马里奥是否在四处走动,大金刚仍然需要扔桶。
本网站上的一个类似问题向我指出this tutorial多线程,但我想知道是否有任何特定的信息应用于GTK。我的谷歌可能很弱,但似乎互联网上没有多少,我发现的信息很少听起来像混合线程,GTK可能有点危险。
感谢您的帮助!
答案 0 :(得分:2)
我相信你误解了需要多线程的情况。 GTK的事件循环可以完美地为平台游戏提供服务,因为您的回调不仅会在输入事件上调用,还会调用also on timeouts。此功能允许实现动画,因为无论用户是否按下按键,您都可以安排Mario每秒移动几次。
换句话说,只要您的回调在绘制下一帧的时间之前返回,您的游戏将永远不会错过任何一个节拍,所有这些都不使用线程。许多看起来完全响应的应用程序和游戏都是它们的核心单线程,或仅用于专门任务的线程。
多线程与GUI工具包相结合,需要经验丰富的专业程序员才能做到正确。由于各种技术原因,您必须从同一个线程访问该工具包。这是explained in the documentation以及其他一些血腥细节。如果是这样的话,为什么这么多程序都吹嘘多线程,什么时候需要呢?有几种情况需要GUI应用程序中的多线程:
充分利用多核CPU的强大功能。单线程模型总共只能使用一个CPU,而当前系统往往拥有越来越多的CPU。
理想情况下,您的线程池的线程数与系统中的核心数一样多。当需要CPU绑定计算时,请求被推送到与线程池关联的队列,由池中的第一个空闲线程拾取。无论何时完成计算,都会通知GUI事件循环,以便它可以显示结果。
为防止“缓慢的GUI”综合症,执行缓慢的回调会导致GUI无响应。
许多回调设计用于在“立即”返回主循环之前执行“快速任务”,由于程序员无法预料的原因,最终会花费比预期更长的时间。例如,最初由十几条记录组成的数据集增长到十万。或者,需要解析的小型XML文件最终会在永久访问的网络磁盘上结束。
防止GUI缓慢的体系结构与第1点中描述的体系结构非常相似,除了此处线程数可以超过核心数,并且所有非平凡任务被认为是值得的交给一个单独的线程。具体来说,事件调度线程不会进行非平凡的处理 - 它只执行接收事件所需的最少量代码,并将它们分派给执行实际工作的其他线程。
答案 1 :(得分:1)
你应该看一下GThread,因为它是GLib的一部分),GLib和GTK +的独立于平台的多线程模块。基本上,您只需使用指向要并行运行的函数的指针调用g_thread_create
以及指向要传递给该函数的数据的指针。但是,您必须注意不要在gdk_threads_enter
和gdk_threads_leave
之间包含所有与GTK +相关的调用来更新用户界面。