- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
所以我正在为现有的 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/
我是一名优秀的程序员,十分优秀!