【问题标题】:Create a dynamic rescheduling GSource in JavaScript在 JavaScript 中创建动态重新调度 GSource
【发布时间】:2016-12-04 12:15:40
【问题描述】:

GLib's main loop 支持为周期性间隔调度回调函数,使用g_timemout_source_new 和相关函数。回调将在预定的时间间隔后重复调用,直到返回false

我现在想用动态间隔修改这个过程。回调不仅仅是truefalse,还应该能够返回一个时间值,该时间值应该一直持续到下一次调用。

在 C 中执行此操作非常简单:可以创建一个新的 GSource 类型,它与 dispatch function 中的超时源不同,然后将返回值 when setting the next expiration 考虑在内。

不幸的是,我正在为 GNOME Shell 编写一个扩展程序,所以我坚持使用 JavaScript。将上述策略移植到 JavaScript 的主要关键点似乎相当于the g_source_new functionnew GLib.Source。首先,它需要初始化结构类型的长度,这将由 C 中的sizeof 运算符计算。我不知道如何在 JavaScript 中获取这个值。此外,尝试创建此构造函数的第二个参数a GSourceFuncs Struct 是错误的,它是保存调度函数所必需的。

gjs> new imports.gi.GLib.SourceFuncs()
Error: Unable to construct struct type SourceFuncs since it has no default constructor and cannot be allocated directly

如何在 JavaScript 中创建新的 GSource?

【问题讨论】:

标签: javascript glib gnome-shell-extensions gjs


【解决方案1】:

g_source_new() 并不是真正为语言绑定而设计的,在为 JS 或 Python 生成绑定时应该将其标记为跳过。

正如您在其他问题中所建议的那样,包括您自己的私有 C 库,通过 GObject 自省访问,这是我通常在应用程序中所做的。但是,我不知道你是否可以为 shell 扩展做这件事。

不过,您应该可以很容易地在 JS 中实现您想要的。这是我从记忆中写的一个简单示例,它似乎可以满足您的要求:

const Scheduler = new Lang.Class({
    Name: 'Scheduler',
    schedule: function (timeMs, callback, priority=GLib.PRIORITY_DEFAULT) {
        this._callback = callback;
        this._priority = priority;
        GLib.timeout_add(priority, timeMs, this._onTimeout.bind(this));
    },
    _onTimeout: function (
        let nextTimeoutMs = this._callback();
        this.schedule(nextTimeoutMs, this._callback, this._priority);
        return GLib.SOURCE_REMOVE;
    },
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-02
    • 2021-07-30
    • 2021-07-23
    • 2012-09-26
    • 2021-08-05
    • 2017-09-28
    • 2011-12-22
    相关资源
    最近更新 更多