2013-09-27 215 views
1


有誰知道是否有可能使在二郎一個高分辨率計時器?
根據文檔記錄,所有定時器和超時以毫秒爲單位進行測量。
需要延遲幾微秒。例如,而不是
timer:apply_after(MilliSec, Module, Function, Arguments).

timer:apply_after(MicroSec, Module, Function, Arguments).高分辨率定時器

回答

3

事實上,所有的計時器和超時基元以毫秒爲單位,包括:

兩種方法可以考慮,實現了亞毫秒計時:

  • 使用Erlang的原語等待的毫秒數截斷,然後用一個繁忙的循環調整。請注意,erlang:now()不是一個實時函數,因爲它保證是單調的(而且這非常昂貴)。您應該使用os:timestamp()來代替;
  • 寫本地代碼,產生一個線程,當定時器觸發時將發送消息。這可以很容易地實施爲NIF。
0
  1. 在實踐中,如果你需要一個計時器,你應該使用eralng:send_after/3或二郎:START_TIMER/3,而不是定時器模塊。定時器模塊使用定時器進程來實現定時器,如果應用程序有太多的定時器,它將阻止定時器進程,這會減慢你的應用程序。
  2. erlang:send_after/3和erlang:start_timer/3有一個區別。
    • 的erlang:START_TIMER/3將發送消息{超時,TimerRef,消息}到目的地後時間毫秒。 erlang:send_after/3將在時間毫秒後僅發送消息給Dest。
    • 問題是,當你需要取消計時器,以及消息被髮送,如果您使用二郎:send_after/3,它可能會導致邏輯處理問題。