每个 Haxe 开发人员都知道,您可以使用haxe.Timer.delayed()
延迟函数调用一段时间。但是对于 Neko 来说,这个功能根本不存在。有没有办法达到相同的结果?
Vadim
问问题
1580 次
4 回答
4
必须先检查它,但是
function delayed(f, time) {
neko.vm.Thread.create(function() {
neko.Sys.sleep(time);
f();
});
}
可能是最接近的事情。唯一的缺点是应用程序变成了多线程的,这可能会导致严重的问题。
于 2008-10-22T16:06:19.853 回答
1
我考虑了你的问题,我认为最好的方法是为 Neko 创建你自己的 Timer 类。我为你做了一个 Timer 类:
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;
}
}
像这样称呼它:
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();
}
}
希望有帮助。
注意:这个精度为 100ms。您可以通过减少 timerInterval 设置来增加它。
于 2010-05-18T21:05:11.903 回答
1
我也使用了这个类,我发现了一个问题。因为不是完全实时的,所以休眠间隔,调用函数,再次休眠间隔。因此,根据您运行的功能需要多长时间,它会变慢或变快。
我已经通过像这样替换第 39 行来解决它:
//timer.lastCallTimestamp = Sys.time() * 1000;
timer.lastCallTimestamp = timer.lastCallTimestamp + timer.interval;
于 2013-12-19T17:37:26.087 回答
0
是的,除了您在第一个答案中提到的内容外,我什么都不知道。在 Linux 上,您可以使用 SIGALARM - 但这看起来并不简单,100% 纯 C 代码,需要非常小心地处理以避免 VM 崩溃。
于 2008-11-06T17:58:48.640 回答