2015-01-02 106 views
1

所以我正在为现有的c应用程序编写一个gui。GTK +每x秒调用函数

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

现在我不想使用另一个线程手动运行功能来做到这一点。

是否有一种方法可以将定时函数或回调函数'进行破解'到GTK主循环中?所以我的功能每秒调用一次或类似的东西。当然,我的功能是非阻塞的。

我写在c。

+0

如何以及从哪里来的新信息? –

+0

在UI编程技术方面,轮询链接列表以改变听起来很糟糕。如果您可以控制数据模型中的代码,请查看在列表中的某些内容发生更改时使用通知回调来更新UI。 –

+0

我确实有控制权但通常我不想'调用'原始代码与调用gui ... –

回答

5

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(回调函数)的指针,第三个参数是指向要传递给回调函数的数据的指针。

编辑 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了解更多信息。

+0

请在使用完整秒数的示例中使用'g_timeout_add_seconds()',因为您链接到的文档中提到的原因。 – jku

+0

@jku你是对的,使awnser更好一点。 – hetepeperfan

+0

此外,您的链接列表用法的示例已损坏。该问题指定列表将随时间变化:使用GSList表示指向列表头的指针可以更改。所以你不能给'g_timeout_add_seconds()'自己的头指针(但你可以给它一个指向当前头指针的指针)。 – jku

4

阅读关于GTK main loop这是Glib main loop以上。你需要g_timeout_add,也许g_idle_add等...

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

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