gtk_main 后恢复控制
Posted
技术标签:
【中文标题】gtk_main 后恢复控制【英文标题】:Resuming control after gtk_main 【发布时间】:2013-02-09 03:09:34 【问题描述】:我正在使用 C 语言中的 MVC 设计模式创建一个 GUI 应用程序。它是一个连接 4 的游戏。
我希望我的控制器能够向 GUI 发送数据。我的 GUI 中有一个方法来绘制起始元素,例如用于选择将检查器放入哪一列的板和按钮。
在此方法结束时,我必须调用 gtk_main() 以使 GUI 显示在屏幕上。我希望能够在视图和控制器类之间发送数据,但是在调用此方法后,控制权不会返回给控制器类。
需要明确的是,main 方法在我的控制器类中,它在我的视图类中调用“setup”方法,gtk_main() 调用在“setup”方法的末尾。
我该如何解决这个问题?
另外,比如我认为有这个方法:
无效 drop_checker(GtkWidget *widget, cairo_t *cr, gint col, gint row, int r, int g, int b)
使用 GTK 回调很容易调用它,因为我可以访问小部件和 cr 变量,但是我不知道如何从我的控制器类中调用它。
这是应用程序设计的错误还是技术上的误解?
【问题讨论】:
【参考方案1】:我认为这是一种技术上的误解,导致您的应用程序设计不正确。对于 GUI 应用程序,您希望主循环始终运行,并且您的程序流程应该是这样的
int main (int argc, char **argv)
<do setup>
<do UI setup>
gtk_main ();
return 0;
主循环仅在您调用gtk_main_quit();
时才会退出,并且通常仅在通过窗口控件或菜单选项退出游戏时才会退出。游戏中发生的所有其他事情都必须由于主循环中的事件而发生。您可以将回调附加到小部件上的信号,例如 GtkButton 上的“clicked”信号,或者如果您需要独立发生某些事情,您可以使用 g_timeout_add 或在主循环空闲时使用 g_idle_add 设置要在特定时间调用的回调。
(请注意,有时您确实想在第一个循环中运行第二个循环,但这些循环很少而且与您当前的情况无关,通常 GTK+ 会在您不需要了解细节的情况下处理它们)
【讨论】:
+1 OP 可能想要浏览一本 GTK+ 书籍和/或通过一些示例程序来了解 GTK+ 中的工作原理。以上是关于gtk_main 后恢复控制的主要内容,如果未能解决你的问题,请参考以下文章