Неко и haxe.Timer.delayed () - PullRequest
       38

Неко и haxe.Timer.delayed ()

3 голосов
/ 22 октября 2008

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

Ответы [ 4 ]

4 голосов
/ 22 октября 2008

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

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

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

1 голос
/ 19 декабря 2013

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

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

//timer.lastCallTimestamp = Sys.time() * 1000;
timer.lastCallTimestamp = timer.lastCallTimestamp + timer.interval;
1 голос
/ 19 мая 2010

Я подумал о вашей проблеме и думаю, что лучший способ - создать свой собственный класс Timer для Neko. Я сделал для тебя класс Таймера:

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.

0 голосов
/ 06 ноября 2008

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

...