c - GTK+ 每隔 x 秒调用一次函数

标签 c user-interface gtk

所以我正在为现有的 c 应用程序编写一个图形用户界面。

gui 只是一个简单的界面,它只会显示而不会真正向应用程序反馈任何信息。但是如果有一些新信息可用,我需要检查一个链表。

现在我不想使用另一个线程来手动运行函数来执行此操作。

有没有办法将定时函数或回调“破解”到 GTK 主循环中?这样我的函数每秒或类似的东西被调用一次。当然我的函数是非阻塞的。

我正在用 c 语言编写。

最佳答案

GTK 包含 glib。 glib 是 gtk 和许多其他 gobject 库使用的核心算法和数据结构库。 glib 提供将从主循环调用的函数。当您包含 gtk 时,glib 也包含在内。

您需要有一个 GSourceFunc 作为回调 GSourceFunc 的签名是gboolean (*GSourceFunc) (gpointer user_data);

gboolean YourCallBack(void* data)
{
    GSList list = (GSList*) data;
    // Check your list
    return TRUE; // return FALSE to remove the timeout
}

你必须在其他地方注册函数:

GSList* List; //This is a singly linked list provided by glib as well.
g_timeout_add_seconds(1, YourCallBack, List);

g_timeout_add 的第一个参数是回调函数每次调用之间的秒数,第二个是指向 GSourceFunc(回调函数)的指针,第三个参数是指向要传递给回调函数的数据的指针.

edit GSlist 通常是指向列表中的一个节点(第一个)的指针,因为列表可以更改,节点可以添加到列表中或从列表中删除,这是危险的。尽管此示例显示了如何使用 g_timeout_add_seconds,但您需要一种更安全的方式来访问您的列表,然后我将在此处介绍。然而,这确实展示了如何使用 g_timeout_add_x 系列函数的机制。

编辑:您可以使用 g_timeout_add 为比秒更小的间隔指定回调,但如果您不需要这样的精度,g_timeout_add_seconds 会消耗更少的资源。

参见:https://developer.gnome.org/glib/2.42/glib-The-Main-Event-Loop.html#g-timeout-add获取更多信息。

关于c - GTK+ 每隔 x 秒调用一次函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27740337/

相关文章:

java - 使用 SwingWorker java 在线程池中等待任务

gtk - 哪个是 GTK 应用程序的最佳 GUI 设计器?

c++ - 如何在 gtk+ 中创建图形

reference - 未定义对 `gtk_menu_bar_append'的引用

c - 如何使用 ioctl 将负整数作为有效结果返回?

c++ - C/C++ 巨大的头文件/源代码

c - 如何在C中添加unsigned char类型的二进制?

c - 在 C 中将数字从文件保存到数组

android - 复选框和其他组件中的辅助文本?

java - 单击鼠标移动一个圆圈