gpt4 book ai didi

javascript - 在 JavaScript 中创建动态重新调度 GSource

转载 作者:行者123 更新时间:2023-11-28 05:16:47 25 4
gpt4 key购买 nike

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 function新的 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?

最佳答案

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

正如您在其他问题中所建议的那样,包括您自己的私有(private) C 库(通过 GObject 自省(introspection)访问)是我通常在应用程序中执行的操作。但是,我不知道您是否可以为 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;
},
});

关于javascript - 在 JavaScript 中创建动态重新调度 GSource,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40919435/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com