سؤال

وكما يعلم كل مطور Haxe، يمكنك استخدام haxe.Timer.delayed() لتأخير استدعاء دالة لبعض الوقت. ولكن هذه الوظيفة لا وجود لنيكو على الإطلاق. هل هناك وسيلة لتحقيق نفس النتائج؟

هل كانت مفيدة؟

المحلول

ويجب أن تحقق لأول مرة ولكن

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

وربما تكون أقرب شيء ممكن. السلبيات الوحيدة هي أن تطبيق يصبح متعددة الخيوط التي يمكن أن تؤدي إلى مشاكل خطيرة.

نصائح أخرى

وفكرت في مشكلتك وأعتقد أن أفضل طريقة هي أن خلق لكم من الدرجة الموقت الخاصة ل نيكو. أنا جعلت فئة الموقت لك:

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.

ولقد استخدمت الطبقة كذلك، ولقد وجدت قضية واحدة. لأن ليس الحقيقي تماما، فإنه ينام هذه الفترة، باستدعاء الدالة، وينام فاصل مرة أخرى. لذلك، تبعا لمدى طويل وظيفة تقوم بتشغيل يأخذ، والقراد أبطأ أو أسرع.

ولقد حلها عن طريق استبدال خط 39 كما يلي:

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

ونعم أنا لا أعرف أي شيء ما عدا ما ذكر في الإجابة الأولى. على لينكس يمكنك استخدام SIGALARM - ولكن هذا لا يبدو تافها، ونقية 100٪ كود C، وتحتاج إلى التعامل معها بحذر شديد لتجنب تحطمها VM

.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top