【问题标题】:GTK+ call function every x secondGTK+ 每隔 x 秒调用一次函数
【发布时间】:2015-01-02 10:01:34
【问题描述】:

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

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

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

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

我正在用 c 写。

【问题讨论】:

  • 新信息如何以及从何而来?
  • 轮询链表的变化在 UI 编程技术方面听起来很糟糕。如果您可以控制数据模型中的代码,请考虑在列表中的某些内容发生更改时使用通知回调来更新 UI。
  • 我确实有控制权,但通常我不想通过调用 gui 来“污染”原始代码...

标签: c user-interface gtk


【解决方案1】:

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

【讨论】:

  • 请在使用完整秒的示例中使用g_timeout_add_seconds(),原因在您链接到的文档中提到。
  • 另外,您的链表使用示例已损坏。该问题指定列表将随时间变化:使用 GSList 意味着指向列表头的指针可以更改。所以你不能给 g_timeout_add_seconds() 头指针本身(但你可以给它一个指向当前头指针的指针)。
  • @jku 我不得不再次同意。
【解决方案2】:

阅读GTK main loop 上面的Glib main loop。你需要g_timeout_addg_idle_add 等等...

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-28
    • 2019-04-08
    • 2020-02-20
    • 2012-03-14
    • 2011-11-06
    • 2011-03-09
    • 1970-01-01
    相关资源
    最近更新 更多