每x秒调用GTK +函数

row*_*n.G 3 c gtk user-interface

所以我正在为现有的c应用程序编写一个gui.

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

现在我不想使用另一个线程手动运行该功能来执行此操作.

有没有办法'破解'定时函数或回调到GTK主循环?这样我的函数每秒调用一次或类似的东西.当然我的功能是非阻塞的.

我在写c.

het*_*fan 7

GTK包括glib.glib是gtk和许多其他gobject库使用的核心算法和数据结构库.glib提供将从mainloop调用的函数.包含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
}
Run Code Online (Sandbox Code Playgroud)

在其他地方你必须注册该功能:

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

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

编辑 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以获取更多信息.