in reply to Reasonably accurate timing

I'm doing data sampling on several channels, and found that Event was the best way to go. You can have timed watchers, and mix them if you need with watchers that wait for IO, or do stuff in the background.

Use the hard setting to make sure that the period is constant.

It can use Time:HiRes if you have it.

Replies are listed 'Best First'.
Re: Re: Reasonably accurate timing
by traveler (Parson) on Jul 23, 2001 at 21:38 UTC
    Thanks. This seems to mostly work (useful module). I did set hard to 1, but I am still seeing timer events "creep" forward at about .5 seconds/minute. Any ideas?

    Update: The documentation says that the interval attribute is added to the time-to-execute (called at) after the callback returns. That means that the interval really is interval+time_taken_by_callback. So, the question really is, how do I make the interval just interval?

      That's what hard is supposed to be for (not adding interval after, but before). Make sure you include Time::HiRes. From the manpage:
      If the "hard" flag is set, the event will be queued for execution relative to the last time the callback was invoked. However, if "hard" is false the new timeout will be calculated relative to the current time (this is the default).

      If you set repeat and hard, it shouldn't creep. I start up my samplers parked, set the at and interval, and then start them.

      How fast are you getting callbacks? If you are taking too long in some of the callbacks, you could bump the callback time. Make sure that your callback action can never overlap the next callback by either speeding up the callback or slowing down the rate. Also, you might try setting debugging on either globally or on the watcher; there are diagnostics printed as to the actual times between callbacks, etc.

        My callbacks take .6 seconds and happen every 60 seconds -- little chance of overlap. Actually I had put in debugging diags to find this out... I used lhoward's solution below for now and I'll look at Event again in a little while. I have other uses for Event, so I want to get to know it better. The reason I did not use sleep subtracting the function time in the first place is that I was unaware of Time::HiRes.

        Thanks for the help and for telling me about Event and Time::HiRes.