所以我正在为现有的c应用程序编写一个gui。
gui只是一个简单的界面,它只会显示并且不会真正将任何信息反馈到应用程序中。但是如果有一些新信息,我需要检查一个链表。
现在我不想使用另一个线程手动运行该功能来执行此操作。
有没有办法去攻击'定时函数或回调到GTK主循环?这样我的函数每秒调用一次或类似的东西。当然我的功能是非阻塞的。
我正在写c。
答案 0 :(得分: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
}
在其他地方你必须注册这个功能:
GSList* List; //This is a singly linked list provided by glib as well.
g_timeout_add_seconds(1, YourCallBack, List);
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了解详情。
答案 1 :(得分:4)
了解GTK main loop以上的Glib main loop。您需要g_timeout_add,也许g_idle_add等......
您可能还需要学习Gio。我们无法猜测新信息是如何进入您的应用程序的。
如果你有一个多线程应用程序,请注意只有主线程可以执行GTK调用。