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 后恢复控制的主要内容,如果未能解决你的问题,请参考以下文章

状态恢复后,dismissViewControllerAnimated 没有使用相同的动画

大话RAC介质恢复---只有备份文件的恢复

delphi 控制服务程序,让服务启动失败后总是恢复。

对备份恢复有重要意义的控制文件记录项

H2 数据库 - 在控制台中恢复配置

如何备份系统,如何恢复系统。