2013-09-27 163 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,它可能会导致逻辑处理问题。