2016-12-01 4 views
1

GLib's main loop unterstützt die Planung von Callback-Funktionen für periodische Intervalle unter Verwendung von g_timemout_source_new und zugehörigen Funktionen. Der Rückruf wird nach dem geplanten Intervall wiederholt aufgerufen, bis false zurückgegeben wird.Erstellen einer dynamischen Umterminierungs-GSource in JavaScript

Ich möchte diesen Prozess jetzt mit einem dynamischen Intervall ändern. Anstatt nur true oder false sollte der Rückruf in der Lage sein, einen Zeitwert zurückzugeben, der bis zu seinem nächsten Aufruf übergeben werden sollte.

In C ist das ganz einfach: Es kann ein neuer GSource Type erstellt werden, der sich nur von der Timeout-Quelle in dispatch function unterscheidet, die dann den Rückgabewert when setting the next expiration berücksichtigt.

Leider programmiere ich eine Erweiterung für die GNOME-Shell, also bin ich auf JavaScript fest. Der wichtigste kritische Punkt für die Portierung der oben genannten Strategie auf JavaScript scheint das Äquivalent zu the g_source_new function, new GLib.Source zu sein. Zuerst muss die Länge des Strukturtyps initialisiert werden, der vom Operator sizeof in C berechnet wird. Ich weiß nicht, wie man diesen Wert in JavaScript erhält. Darüber hinaus ist es ein Fehler, die Erstellung von a GSourceFuncs Struct, das zweite Argument für diesen Konstruktor zu versuchen, das die Dispatch-Funktion enthalten muss.

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

Wie kann ich eine neue GSource in JavaScript erstellen?

+0

Ich bin auch offen für andere Lösungen, an denen die Anpassung eines bestehenden Quelltypen oder [die Aufnahme von binären Komponenten] (http : //stackoverflow.com/questions/40919457/including-binary-components-in-a-gnome-shell-extension). – XZS

Antwort

0

g_source_new() war nicht wirklich für Sprachbindungen vorgesehen und sollte beim Generieren von Bindungen für JS oder Python wahrscheinlich übersprungen werden.

Eine eigene private C-Bibliothek, die über GObject introspection aufgerufen wird, wie Sie es in Ihrer anderen Frage vorschlagen, ist das, was ich normalerweise in einer App tun würde. Ich habe jedoch keine Ahnung, ob Sie es für eine Shell-Erweiterung tun können.

Sie sollten jedoch ziemlich einfach in der Lage sein zu implementieren, was Sie in JS wollen, obwohl. Hier ist ein einfaches Beispiel, das ich aus dem Gedächtnis geschrieben, die wie es scheint, könnte das tun, was Sie wollen:

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; 
    }, 
}); 
Verwandte Themen