Frage

Wie jede Haxe Entwickler weiß, Sie haxe.Timer.delayed() nutzen könnte Funktionsaufruf für einige Zeit zu verzögern. Aber diese Funktion gibt es gar nicht für Neko. Gibt es eine Möglichkeit die gleichen Ergebnisse?

zu erreichen
War es hilfreich?

Lösung

Haben Sie es zu überprüfen, zuerst aber

function delayed(f, time) {
   neko.vm.Thread.create(function() {
       neko.Sys.sleep(time);
       f();
   });
}

könnte die nächste Sache möglich sein. Der einzige Nachteil ist, dass die Anwendung multi-threaded wird, die zu ernsthaften Problemen führen könnte.

Andere Tipps

Ich dachte über das Problem und ich denke, der beste Weg, um Ihre eigene Timer-Klasse für Neko zu erstellen. Ich habe eine Timer-Klasse für Sie:

NekoTimer.hx

package;
import neko.Sys;

    class NekoTimer 
    {
    private static var threadActive:Bool = false;
    private static var timersList:Array<TimerInfo> = new Array<TimerInfo>();
    private static var timerInterval:Float = 0.1;

    public static function addTimer(interval:Int, callMethod:Void->Void):Int
    {
        //setup timer thread if not yet active
        if (!threadActive) setupTimerThread();

        //add the given timer
        return timersList.push(new TimerInfo(interval, callMethod, Sys.time() * 1000)) - 1;
    }

    public static function delTimer(id:Int):Void
    {
        timersList.splice(id, 1);
    }

    private static function setupTimerThread():Void
    {
        threadActive = true;
        neko.vm.Thread.create(function() {
            while (true) {
                Sys.sleep(timerInterval);
                for (timer in timersList) {
                    if (Sys.time() * 1000 - timer.lastCallTimestamp >= timer.interval) {
                        timer.callMethod();
                        timer.lastCallTimestamp = Sys.time() * 1000;
                    }
                }
            }
        });
    }
}

private class TimerInfo
{
    public var interval:Int;
    public var callMethod:Void->Void;
    public var lastCallTimestamp:Float;

    public function new(interval:Int, callMethod:Void->Void, lastCallTimestamp:Float) {
        this.interval = interval;
        this.callMethod = callMethod;
        this.lastCallTimestamp = lastCallTimestamp;
    }
}

Nennen Sie es wie folgt aus:

package ;

import neko.Lib;

class Main 
{
    private var timerId:Int;

    public function new()
    {
        trace("setting up timer...");
        timerId = NekoTimer.addTimer(5000, timerCallback);
        trace(timerId);

        //idle main app
        while (true) { }
    }

    private function timerCallback():Void
    {
        trace("it's now 5 seconds later");
        NekoTimer.delTimer(timerId);
        trace("removed timer");
    }

    //neko constructor
    static function main() 
    {
        new Main();
    }
}

Ich hoffe, das hilft.

Hinweis: dieses eine Genauigkeit von 100 ms hat. Sie können dies durch Erhöhung der TimerInterval Einstellung zu verringern.

ich verwenden, um die Klasse als gut, und ich fand ein Problem. Da nicht vollständig in Echtzeit ist, schläft es das Intervall, ruft die Funktion und schläft wieder das Intervall. Also, je nachdem, wie lange die Funktion, die Sie dauerte laufen, es tickt langsamer oder schneller.

ich gelöst habe es durch die Linie ersetzt 39 wie folgt:

//timer.lastCallTimestamp = Sys.time() * 1000;
timer.lastCallTimestamp = timer.lastCallTimestamp + timer.interval;

Ja, ich weiß nichts außer dem, was Sie in Ihrer ersten Antwort erwähnen. Unter Linux können Sie SIGALARM verwenden - aber das ist nicht trivial, 100% reinen C-Code sieht, und muss mit großer Sorgfalt behandelt werden, um die VM zu vermeiden Absturz

.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top