主循环后的GTK

时间:2016-02-10 13:21:53

标签: c gtk gtk3

我有一个问题,因为我无法找到适当的解决方案,因为在gtk_main()之后发生了一些事情。这是我的一个简单的机器人的功能,它解决了游戏,但它不会运行,因为它甚至没有启动。如果我在僵尸程序完成后放置gtk_main(),我将得到一个解决的游戏,所以它的工作原理。 gtk中是否有一个函数可以让我在gtk主循环中按需操作?这是代码:

void RunBot(struct Packet *packet){
gtk_main();
while(LookForWin(packet)==0){
    packet->data->color_number=ColorPredictor(packet);
    CheckColors(packet);
    RefreshBoard(packet->essentials,board,colors,BoardButtons,Board);
    printf("Running..\n");
}   }

提前致谢:)

2 个答案:

答案 0 :(得分:1)

正如andlabs和mame98指出的那样,GUI工具包期望你的逻辑从执行少量工作的回调执行,并迅速放弃对主循环的控制。主循环"之后没有"工作,因为主循环的结束通常与应用程序的退出重合。

使用大型遗留代码库时,将现有代码重构为事件驱动的样式可能非常困难。幸运的是,还有另一种选择。

您可以启动一个线程(using glib以便移植)并在该线程中运行您的游戏逻辑,与GUI线程分开。在游戏线程中,使用gdk_threads_add_idle()偶尔会向GUI通知更改。这应该允许游戏代码和GUI思维都运行节目。

答案 1 :(得分:0)

所以在GTK中你有事件,信号和超时。

因此,如果你想每x毫秒调用一个函数,你应该使用

g_timeout_add (guint interval,
               GSourceFunc function,
               gpointer data);

请查看official documentation以了解有关此功能的更多详情。

gtk_main将一直运行,直到您致电gtk_main_quit();,但您应该只在申请结束时执行此操作。