Pergunta

Como todo desenvolvedor Haxe sabe, você poderia usar haxe.Timer.delayed() a chamada função de atraso por algum tempo. Mas essa função não existe para Neko em tudo. Existe uma maneira para alcançar os mesmos resultados?

Foi útil?

Solução

tem que verificar isso primeiro, mas

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

pode ser a coisa mais próxima possível. O único contras é que a aplicação se torna multi threaded que poderia levar a sérios problemas.

Outras dicas

Eu pensei sobre o seu problema e eu acho que a melhor maneira é criar sua própria classe Timer para Neko. Fiz uma classe Timer para você:

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;
    }
}

chamá-lo assim:

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();
    }
}

Espero que ajude.

Nota: este tem uma precisão de 100ms. Você pode aumentar isso diminuindo a configuração IntervaloDoCronômetro.

Eu usei a classe, bem como, e eu encontrei um problema. Porque não está completamente em tempo real, que acomoda o intervalo, chama a função, e dorme o intervalo novamente. Então, dependendo de quanto tempo a função que está sendo executado leva, ele carrapatos mais lento ou mais rápido.

Eu resolvi-lo substituindo linha 39 assim:

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

Sim, eu não sei nada, exceto para o que você menciona em sua primeira resposta. No Linux, você pode usar SIGALARM - mas isso não parece trivial, 100% código C puro, e precisa ser tratado com muito cuidado para evitar bater o VM

.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top