<div dir="ltr"><div><br><div class="gmail_extra"><div class="gmail_quote">On Mon, May 26, 2014 at 3:38 AM, Michael Schnell <span dir="ltr"><<a href="mailto:mschnell@lumino.de" target="_blank">mschnell@lumino.de</a>></span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div><br></div>

I use EpikTimer in my (soon to be released) work on the ActiveNoGUI Widget Type.<br>
<br>
Here I found, that it is a rather appropriate use for EpikTimer to handle it in a "static" way, not creating an instance of TEpikTimer with every use of same, but simply to use class properties, class procedures and class functions of TEpikTimer.<br>


<br>
The advantage of this is that the overhead when creating an EpikTimer is reduced to zero.<br>
<br></blockquote></div><br></div>Hi Michael,<br><br>I'm having a little trouble understanding where new functionality is needed for your use case. With the existing code, you don't need to create an EpikTimer instance each time you need a new timer. A single instance supports an unlimited number of timers using the TimerData record from the EpikTimer unit:<br>
<br>TimerData = record<br>  Running:Boolean; // Timer is currently running<br>  TimebaseUsed:TimeBaseSelector; // keeps timer aligned with the source that started it.<br>  StartTime:TickType; // Ticks sample when timer was started<br>
  TotalTicks:TickType; // Total ticks... for snapshotting and pausing<br>end;<br><br>You can declare any number these records to create as many timers as you need. Here's an example for a single ET instance of EpikTimer:<br>
<br>Function TimedExecution: Extended;<br>Var<br>  i:integer;<br>  TimerA,TimerB:TimerData;<br>  TickTick:Array[1..1000] of TimerData; // if you need a thousand timers<br>Begin<br>  ET.Clear(TimerA);<br>  ET.Clear(TimerB); // Declared timers must be cleared before use<br>
</div>  For i:=1 to 1000 do ET.Clear(TickTick[i]);<br><div><br>   ET.Start(TickTick[someindex])  <br><br>    ET.Start(TimerA);<br>    ExecuteTimedSectionA;<br>    ET.Stop (TimerA);<br><br>    ET.Start(TimerB);<br>    ExecuteTimedSectionB;<br>
    ET.Stop (TimerB);<br><br>   ET.Stop(TickTick[someindex])  <br>  etc...<br><br>The mechanism is pretty efficient as the record for each timer is only a few dozen bytes. One instance is necessary to do the initialization that detects the available timebases and does a rough overhead calibration for system calls. There's always going to be edge jitter with userland calls, so calibrating each timer wouldn't add certainty to the overall measurement.<br>
<br>If I'm not understanding the problem you're trying to solve, could you please explain it a little further?<br><br>Thanks,<br><br>-Tom</div></div>