모든 Haxe 개발자가 알고 있듯이 haxe.Timer.delayed()
을 사용하면 얼마 동안 함수 호출을 지연시킬 수 있습니다. 그러나이 기능은 Neko에게는 전혀 존재하지 않습니다. 동일한 결과를 얻을 수있는 방법이 있습니까?Neko와 haxe.Timer.delayed()
3
A
답변
4
는 먼저 확인해야하지만
function delayed(f, time) {
neko.vm.Thread.create(function() {
neko.Sys.sleep(time);
f();
});
}
가능한 가장 가까운 일이 될 수 있습니다. 유일한 단점은 응용 프로그램이 심각한 문제로 이어질 수있는 다중 스레드가된다는 것입니다.
0
예 첫 번째 대답에서 언급 한 것을 제외하고는 아무것도 알지 못합니다. Linux에서는 SIGALARM을 사용할 수 있습니다. 그러나 이것은 100 % 순수한 C 코드가 아닌 것으로 보이며 VM을 손상시키지 않도록 세심한주의를 기울여야합니다.
1
나는 당신의 문제에 대해 생각했고 가장 좋은 방법은 Neko를위한 자신의 Timer 클래스를 만드는 것이라고 생각합니다.
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;
}
}
이처럼 전화
NekoTimer.hx : 도움이
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 설정을 줄이면이 값을 늘릴 수 있습니다.
1
클래스도 사용했는데 하나의 문제가있었습니다. 완전 실시간이 아니기 때문에 간격을 잠자고 함수를 호출하고 간격을 다시 잠자 게됩니다. 따라서 실행중인 기능의 소요 시간에 따라 속도가 느려지거나 빨라집니다.
그래서 같은 라인 (39)을 대체하여 그것을 해결했습니다
//timer.lastCallTimestamp = Sys.time() * 1000;
timer.lastCallTimestamp = timer.lastCallTimestamp + timer.interval;
어떤 종류의 문제 만이 목적을 위해 스레드를 생성하는 경우? – Tom
@Tom, 함수 f()는 다른 스레드의 컨텍스트에서 실행될 것입니다. 공유 자원을 사용하거나 공유 자원을 사용하는 다른 기능을 호출 할 수 있습니다. 이 경우에 특별한 것은 없으며, 보통의 멀티 스레드 응용 프로그램입니다. – vava
그럴 경우 haXe로 Neko 응용 프로그램을 만드는 것이 가장 좋습니다. 왜 그렇게하지 않니? – Tom