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?
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
.