2010-12-27 10 views
7

Başladığından beri zaman aralıklarında aralıklı aralıkların sayısını veren bir işlemin nasıl gerçekleştirileceğini düşünüyordum. Burada doğruluk kaybediyor muyum? Bir süre sonra ve ağır müşteri istismarı sonrasında doğruluğu kaybetmeden bunu nasıl uygularım. Erlang'da nasıl yapılacağına şaşırdım.Erlang'de doğru saat

Doğal olarak, şimdi() gibi bir sistem çağrısı kullanmak istemiyorum. Eğer yapıyoruz gibi sayma

-module(clock). 
-compile([export_all]). 

start(Time) -> 
    register(clock, spawn(fun() -> tick(Time, 0) end)). 

stop() -> clock ! stop. 

tick(Time, Count) -> 
    receive 
     nticks -> 
      io:format("~p ticks have passed since start~n", [Count]) 
    after 0 -> true 
    end, 
    receive 
     stop -> 
      void 
    after Time -> 
      tick(Time, Count + 1) 
    end. 

cevap

10

Manuel kene nedeniyle hafif zamanlama dalgalanmalar yanı sıra fonksiyon icra yükü için doğru olması için gitmiyor.

Ne yapmak istediğiniz, işlem başlatıldığında ve her bir yinelemeli çağrıda bu işleve iletildiğinde bir timestamp yakalamanızdır. Daha sonra, işlemi başlattığınızdan bu yana geçen kene sayısını (mikro saniye cinsinden) almak istediğinizde, yeni bir zaman damgası alın ve ikisini de now_diff'a aktarın.

Kendi "ticks" kavramını kullanıyorsunuz, bu nedenle "tick" inizde kaç tane mikrosaniye olduğunu bulup sonuç sonucunu bölebilirsiniz.

+0

Evet, bunun en kolay yol olduğunu düşünüyorum. Yapılmakta olan özyinelemeli çağrıların sayısını azaltmak için, "kene çözünürlüğü" kavramını "sonra .." zaman aşımı ile kullanmaya devam edebilirim. – buddhabrot