【问题标题】:About GLib.Idle on Vala关于 Vala 上的 GLib.Idle
【发布时间】:2019-06-16 08:18:47
【问题描述】:

Valadoc 的某些部分没有很好的记录,GLib 中的命名空间 Idle 没有描述它们是做什么的,只有几个函数可以定义空闲事件的优先级!

有人知道这是做什么的吗?

Functions:

public uint add (owned SourceFunc function, int priority = DEFAULT_IDLE)
public uint add_full (int priority, owned SourceFunc function)
public bool remove_by_data (void* data)

【问题讨论】:

    标签: glib vala


    【解决方案1】:

    如有疑问,请参阅 C 文档:

    https://developer.gnome.org/glib/stable/glib-The-Main-Event-Loop.html#g-idle-add

    添加一个在没有更高优先级时调用的函数 挂起到默认主循环的事件。该函数被赋予 默认空闲优先级,G_PRIORITY_DEFAULT_IDLE。如果函数 返回 FALSE 它会自动从事件列表中删除 来源,不会再被调用。

    有关如何处理 数据的返回值和内存管理。

    这在内部使用 g_idle_source_new() 创建一个主循环源 并使用 g_source_attach() 将其附加到全局 GMainContext,所以 回调将在运行该 main 的任何线程中调用 语境。如果您需要更好的控制,您可以手动执行这些步骤 或使用自定义主上下文。

    一般来说,您可能想了解主循环:

    https://developer.gnome.org/glib/stable/glib-The-Main-Event-Loop.html#glib-The-Main-Event-Loop.description

    主事件循环管理所有可用的事件源 GLib 和 GTK+ 应用程序。这些事件可以来自任意数量的 不同类型的源,例如文件描述符(普通文件, 管道或套接字)和超时。新类型的事件源也可以是 使用 g_source_attach() 添加。

    允许处理多个独立的源集 不同的线程,每个源都与一个 GMainContext 相关联。一种 GMainContext 只能在单个线程中运行,但源可以 被添加到它并从其他线程中删除。

    每个事件源都被分配了一个优先级。默认优先级, G_PRIORITY_DEFAULT,为 0。小于 0 的值表示更高的优先级。 大于 0 的值表示较低的优先级。来自高层的事件 优先源总是在来自较低级别的事件之前处理 优先来源。

    还可以添加空闲功能并分配优先级。这些将 每当没有更高优先级的事件准备好时运行 已处理。

    [...]

    【讨论】:

    • main_loop和idle是一回事吗?
    • 我使用 idle 来实现与 main_loop 相同的效果,并且效果也很好!我还认为这是我能找到的最佳参考,Pantheon 是一个 Gnome 分支,所以我想这可能就是答案。
    • Idle 只是将事件添加到主循环的一种简单方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-02
    • 1970-01-01
    • 2010-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多