Вопрос

Как знает каждый разработчик Haxe, вы можете использовать haxe.Timer.delayed () , чтобы отложить вызов функции на некоторое время. Но эта функция не существует для Neko вообще. Есть ли способ добиться таких же результатов?

Это было полезно?

Решение

Сначала нужно проверить, но

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

возможно самая близкая вещь. Единственным недостатком является то, что приложение становится многопоточным, что может привести к серьезным проблемам.

Другие советы

Я подумал о вашей проблеме и думаю, что лучший способ - создать собственный класс Timer для Neko. Я сделал для тебя класс 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();
    }
}

Надеюсь, это поможет.

Примечание. Точность 100 мс. Вы можете увеличить это, уменьшив настройку timerInterval.

Я также использовал класс и обнаружил одну проблему. Поскольку не полностью в реальном времени, он спит интервал, вызывает функцию, и снова спит интервал. Таким образом, в зависимости от того, сколько времени занимает выполняемая вами функция, она работает медленнее или быстрее.

Я решил это, заменив строку 39 следующим образом:

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

Да, я ничего не знаю, кроме того, что вы упоминаете в своем первом ответе. В Linux вы можете использовать SIGALARM - но это не выглядит тривиально, на 100% чистый C-код, и его нужно обрабатывать с большой осторожностью, чтобы избежать сбоя ВМ.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top