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

GTK+ call function every x second

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

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

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

有没有办法 'hack' 定时函数或回调进入 GTK 主循环?这样我的函数每秒或类似的东西被调用一次。当然我的函数是非阻塞的。

我正在用 c.

了解 GTK main loop which is above Glib main loop. You'll need g_timeout_add and perhaps g_idle_add 等...

您可能还需要学习 Gio。我们无法猜测新信息是如何进入您的应用程序的。

如果您有一个多线程应用程序,请注意只有主线程可以执行 GTK 调用。

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