3

haxe.Timer.delayed()すべての Haxe 開発者が知っているように、関数呼び出しをしばらく遅らせるために使用できます。しかしねこちゃんにはこの機能が全くありません。同じ結果を達成する方法はありますか?

4

4 に答える 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クラスを作りました:

ネコタイマー.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();
    }
}

それが役立つことを願っています。

注: これの精度は 100 ミリ秒です。これを増やすには、timerInterval 設定を減らします。

于 2010-05-18T21:05:11.903 に答える
1

クラスも使用しましたが、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 に答える