<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>Two timers, one function</title>
		<link>http://www.allegro.cc/forums/view/567938</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Thu, 23 Feb 2006 09:06:27 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Hi!<br />Is it safe install two timers that point to the same function?<br />I want to do something like this:</p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td><span class="k1">void</span> timer_func<span class="k2">(</span><span class="k1">void</span><span class="k3">*</span> p<span class="k2">)</span></td></tr><tr><td class="number">2</td><td><span class="k2">{</span></td></tr><tr><td class="number">3</td><td>  <span class="k1">int</span> i <span class="k3">=</span> <span class="k3">*</span><span class="k2">(</span><span class="k2">(</span><span class="k1">int</span><span class="k3">*</span><span class="k2">)</span> p<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">4</td><td>  <span class="k1">switch</span> <span class="k2">(</span>i<span class="k2">)</span> <span class="k2">{</span> ... <span class="k2">}</span></td></tr><tr><td class="number">5</td><td><span class="k2">}</span></td></tr><tr><td class="number">6</td><td><a href="http://www.allegro.cc/manual/END_OF_FUNCTION" target="_blank"><span class="a">END_OF_FUNCTION</span></a><span class="k2">(</span>timer_func<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">7</td><td>&#160;</td></tr><tr><td class="number">8</td><td><span class="k1">void</span> install_timers<span class="k2">(</span><span class="k2">)</span></td></tr><tr><td class="number">9</td><td><span class="k2">{</span></td></tr><tr><td class="number">10</td><td>  <span class="k1">volatile</span> <span class="k1">int</span> param1 <span class="k3">=</span> <span class="n">1</span><span class="k2">;</span></td></tr><tr><td class="number">11</td><td>  <span class="k1">volatile</span> <span class="k1">int</span> param2 <span class="k3">=</span> <span class="n">2</span><span class="k2">;</span></td></tr><tr><td class="number">12</td><td>&#160;</td></tr><tr><td class="number">13</td><td>  <a href="http://www.allegro.cc/manual/LOCK_VARIABLE" target="_blank"><span class="a">LOCK_VARIABLE</span></a><span class="k2">(</span>param1<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">14</td><td>  <a href="http://www.allegro.cc/manual/LOCK_VARIABLE" target="_blank"><span class="a">LOCK_VARIABLE</span></a><span class="k2">(</span>param2<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">15</td><td>  <a href="http://www.allegro.cc/manual/LOCK_FUNCTION" target="_blank"><span class="a">LOCK_FUNCTION</span></a><span class="k2">(</span>timer_func<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">16</td><td>  <a href="http://www.allegro.cc/manual/install_param_int_ex" target="_blank"><span class="a">install_param_int_ex</span></a><span class="k2">(</span>timer_func, <span class="k2">(</span><span class="k1">void</span><span class="k3">*</span><span class="k2">)</span> <span class="k3">&amp;</span>param1, BPS_TO_TIMER<span class="k2">(</span><span class="n">60</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">17</td><td>  <a href="http://www.allegro.cc/manual/install_param_int_ex" target="_blank"><span class="a">install_param_int_ex</span></a><span class="k2">(</span>timer_func, <span class="k2">(</span><span class="k1">void</span><span class="k3">*</span><span class="k2">)</span> <span class="k3">&amp;</span>param2, BPS_TO_TIMER<span class="k2">(</span><span class="n">60</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">18</td><td><span class="k2">}</span></td></tr></tbody></table></div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Biznaga)</author>
		<pubDate>Sun, 19 Feb 2006 11:54:53 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>That&#39;s perfectly valid. Try it out <img src="http://www.allegro.cc/forums/smileys/tongue.gif" alt=":P" /></p><p>[append]<br />Oh, well, it&#39;s valid, but the address of those two params goes out of scope when the functions return. It will cause lots of crashes later <img src="http://www.allegro.cc/forums/smileys/kiss.gif" alt=":-*" /> To fix, move the params to a scope that won&#39;t be overwritten for the lifetime of the timers (i.e. globals).
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (CGamesPlay)</author>
		<pubDate>Sun, 19 Feb 2006 12:00:07 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Remember that your function must be <u>fast</u>. If it is fast, then you should have no problems.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (ReyBrujo)</author>
		<pubDate>Sun, 19 Feb 2006 12:02:48 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I&#39;ll assume it&#39;s OK then. Thanks, guys!</p><div class="quote_container"><div class="title">CGamesPlay said:</div><div class="quote"><p>
Oh, well, it&#39;s valid, but the address of those two params goes out of scope when the functions return.
</p></div></div><p>

A minor detail <img src="http://www.allegro.cc/forums/smileys/tongue.gif" alt=":P" /><br />Of course those vars will be global or declared in the main game loop. I missed that in the example above, sorry. <img src="http://www.allegro.cc/forums/smileys/grin.gif" alt=";D" /></p><div class="quote_container"><div class="title">ReyBrujo said:</div><div class="quote"><p>
Remember that your function must be <u>fast</u>.
</p></div></div><p>

That&#39;s the idea, it&#39;ll just update some flags.</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">volatile</span> <span class="k1">int</span><span class="k2">[</span>MAX<span class="k2">]</span> params<span class="k2">;</span>
...
<span class="k1">void</span> timer_func<span class="k2">(</span><span class="k1">void</span><span class="k3">*</span> p<span class="k2">)</span>
<span class="k2">{</span>
  <span class="k1">int</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_470.html" target="_blank">index</a> <span class="k3">=</span> <span class="k3">*</span><span class="k2">(</span><span class="k2">(</span><span class="k1">int</span><span class="k3">*</span><span class="k2">)</span> p<span class="k2">)</span><span class="k2">;</span>
  <span class="k3">+</span><span class="k3">+</span>params<span class="k2">[</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_470.html" target="_blank">index</a><span class="k2">]</span><span class="k2">;</span>
<span class="k2">}</span>
</pre></div></div><p>

The point is I have this doubt mainly because I know nothing about interrupts and threads. I don&#39;t know if something weird happens with the stack or whatever when accessing the same function at the same time. My game is still in the design stage, so I don&#39;t want any weird bug later.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Biznaga)</author>
		<pubDate>Mon, 20 Feb 2006 02:19:00 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
The point is I have this doubt mainly because I know nothing about interrupts and threads. I don&#39;t know if something weird happens with the stack or whatever when accessing the same function at the same time. My game is still in the design stage, so I don&#39;t want any weird bug later.
</p></div></div><p>
In most cases they should be called from completely different stacks.</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
volatile int[MAX] params;<br />...<br />void timer_func(void* p)<br />{<br />  int index = <b>((int</b>) p);<br />  ++params[index];<br />}
</p></div></div><p>
The typical way to solve this problem is pass timer_func a pointer to a struct with all the data you need in it, instead of making global varaibles.</p><p>Example:
</p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td><span class="k1">struct</span> TimerInfo <span class="k2">{</span></td></tr><tr><td class="number">2</td><td>  <span class="k1">int</span> i<span class="k2">;</span></td></tr><tr><td class="number">3</td><td>  <span class="k1">char</span> c<span class="k2">;</span></td></tr><tr><td class="number">4</td><td><span class="k2">}</span><span class="k2">;</span></td></tr><tr><td class="number">5</td><td>&#160;</td></tr><tr><td class="number">6</td><td><span class="k1">void</span> timer_func<span class="k2">(</span><span class="k1">void</span><span class="k3">*</span> p<span class="k2">)</span></td></tr><tr><td class="number">7</td><td><span class="k2">{</span></td></tr><tr><td class="number">8</td><td>  TimerInfo <span class="k3">&amp;</span>t <span class="k3">=</span> <span class="k3">*</span><span class="k2">(</span>TimerInfo<span class="k3">*</span><span class="k2">)</span>p<span class="k2">;</span></td></tr><tr><td class="number">9</td><td>&#160;</td></tr><tr><td class="number">10</td><td>  <span class="k1">switch</span><span class="k2">(</span>t.i<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">11</td><td>    <span class="k1">case</span> <span class="n">0</span><span class="k2">:</span> cout <span class="k3">&lt;</span><span class="k3">&lt;</span> t.c <span class="k3">&lt;</span><span class="k3">&lt;</span> endl<span class="k2">;</span></td></tr><tr><td class="number">12</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">13</td><td><span class="k2">}</span></td></tr><tr><td class="number">14</td><td><a href="http://www.allegro.cc/manual/END_OF_FUNCTION" target="_blank"><span class="a">END_OF_FUNCTION</span></a><span class="k2">(</span>timer_func<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">15</td><td>&#160;</td></tr><tr><td class="number">16</td><td><span class="k1">void</span> install_timers<span class="k2">(</span><span class="k2">)</span></td></tr><tr><td class="number">17</td><td><span class="k2">{</span></td></tr><tr><td class="number">18</td><td>  <span class="k1">static</span> TimerInfo t1 <span class="k3">=</span> <span class="k2">{</span> <span class="n">0</span>, <span class="s">'A'</span> <span class="k2">}</span><span class="k2">;</span></td></tr><tr><td class="number">19</td><td>  <span class="k1">static</span> TimerInfo t2 <span class="k3">=</span> <span class="k2">{</span> <span class="n">2</span>, <span class="s">'B'</span> <span class="k2">}</span><span class="k2">;</span></td></tr><tr><td class="number">20</td><td>&#160;</td></tr><tr><td class="number">21</td><td>  <a href="http://www.allegro.cc/manual/LOCK_FUNCTION" target="_blank"><span class="a">LOCK_FUNCTION</span></a><span class="k2">(</span>timer_func<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">22</td><td>  <a href="http://www.allegro.cc/manual/install_param_int_ex" target="_blank"><span class="a">install_param_int_ex</span></a><span class="k2">(</span>timer_func, <span class="k2">(</span><span class="k1">void</span><span class="k3">*</span><span class="k2">)</span> <span class="k3">&amp;</span>t1, BPS_TO_TIMER<span class="k2">(</span><span class="n">60</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">23</td><td>  <a href="http://www.allegro.cc/manual/install_param_int_ex" target="_blank"><span class="a">install_param_int_ex</span></a><span class="k2">(</span>timer_func, <span class="k2">(</span><span class="k1">void</span><span class="k3">*</span><span class="k2">)</span> <span class="k3">&amp;</span>t2, BPS_TO_TIMER<span class="k2">(</span><span class="n">60</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">24</td><td><span class="k2">}</span></td></tr></tbody></table></div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (ImLeftFooted)</author>
		<pubDate>Mon, 20 Feb 2006 07:34:24 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>And again I say: <i>Don&#39;t - use - allegro - timers!</i> They&#39;re inaccurate, they eat (too) much cpu, and they require extra threads, without removing the need for constant polling (which is the only advantage of using threads after all).<br />QueryPerformanceCounter() (windows), gettimeofday (linux) are cheaper (in terms of system resources - basically, they run anyway, so all you need to do is read them once per main loop pass), thread-safe, way more accurate (down to a single cpu clock tick) and easier to code (once you wrap them right; do it once and re-use for all future projects). Only fall back on allegro timers if you absolutely have to.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Tobias Dammers)</author>
		<pubDate>Mon, 20 Feb 2006 20:42:01 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Unless you are making a 3D (especially a FPS), Allegro timers are fine and portable enough.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (ReyBrujo)</author>
		<pubDate>Mon, 20 Feb 2006 21:18:59 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I completely agree with Rey. I use Allegro timers (and lots of them) for all of my games, and they work perfectly. They exist for a reason, despite their few shortcomings, and if you understand how they work and how they are meant to be deployed you won&#39;t have any problems. If the situation demands a different approach (such as complex 3D systems), take it.</p><p><i>Edited for clarity.</i>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Sirocco)</author>
		<pubDate>Mon, 20 Feb 2006 21:48:54 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>If anybody had some framework for basic QPC/gettimeofday that can be reused easily, that would be nice. <img src="http://www.allegro.cc/forums/smileys/kiss.gif" alt=":-*" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (BAF)</author>
		<pubDate>Tue, 21 Feb 2006 06:52:09 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Baf said:</div><div class="quote"><p>

If anybody had some framework for basic QPC/gettimeofday that can be reused easily, that would be nice.
</p></div></div><p>

Search for timer in the forum and write your own.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (GullRaDriel)</author>
		<pubDate>Tue, 21 Feb 2006 13:50:49 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
timers [...] require extra threads
</p></div></div><p>
All of Allegro&#39;s timers run on a single thread. And since some of Allegro&#39;s internals use timers, that thread is already created.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Kitty Cat)</author>
		<pubDate>Tue, 21 Feb 2006 15:30:33 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>This is what I use:<br />timer.h:
</p><div class="source-code snippet"><div class="inner"><pre><span class="p">#ifndef TIMER_H</span>
<span class="p">#define TIMER_H</span>

<span class="k1">void</span> init_timer<span class="k2">(</span><span class="k1">bool</span> use_qpc <span class="k3">=</span> <span class="k1">false</span><span class="k2">)</span><span class="k2">;</span>
<span class="k1">void</span> stop_timer<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="k1">void</span> start_timer<span class="k2">(</span><span class="k1">int</span> timer_ms<span class="k2">)</span><span class="k2">;</span>
<span class="k1">float</span> get_timer_delta<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="k1">const</span> <span class="k1">char</span><span class="k3">*</span> get_timing_method_string<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="k1">float</span> get_timer_accuracy<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>

<span class="p">#endif</span>
</pre></div></div><p>

timer.cpp:
</p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td><span class="p">#include &lt;allegro.h&gt;</span></td></tr><tr><td class="number">2</td><td><span class="p">#ifdef ALLEGRO_WINDOWS</span></td></tr><tr><td class="number">3</td><td>  <span class="p">#include &lt;winalleg.h&gt;</span></td></tr><tr><td class="number">4</td><td><span class="p">#endif</span></td></tr><tr><td class="number">5</td><td><span class="p">#include "timer.h"</span></td></tr><tr><td class="number">6</td><td>&#160;</td></tr><tr><td class="number">7</td><td><span class="k1">bool</span> initialized <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span></td></tr><tr><td class="number">8</td><td>&#160;</td></tr><tr><td class="number">9</td><td><span class="k1">int</span> timer <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">10</td><td><span class="k1">int</span> timer_ms <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">11</td><td>&#160;</td></tr><tr><td class="number">12</td><td><span class="p">#ifdef ALLEGRO_WINDOWS</span></td></tr><tr><td class="number">13</td><td>LARGE_INTEGER last_perf_count_li<span class="k2">;</span></td></tr><tr><td class="number">14</td><td>LARGE_INTEGER perf_count_li<span class="k2">;</span></td></tr><tr><td class="number">15</td><td>LARGE_INTEGER perf_freq_li<span class="k2">;</span></td></tr><tr><td class="number">16</td><td><span class="k1">unsigned</span> <span class="k1">long</span> <span class="k1">long</span> last_perf_count<span class="k2">;</span></td></tr><tr><td class="number">17</td><td><span class="k1">unsigned</span> <span class="k1">long</span> <span class="k1">long</span> perf_count<span class="k2">;</span></td></tr><tr><td class="number">18</td><td><span class="k1">unsigned</span> <span class="k1">long</span> <span class="k1">long</span> perf_freq<span class="k2">;</span></td></tr><tr><td class="number">19</td><td>&#160;</td></tr><tr><td class="number">20</td><td><span class="k1">unsigned</span> <span class="k1">long</span> <span class="k1">long</span> li_to_ll<span class="k2">(</span>LARGE_INTEGER li<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">21</td><td>  <span class="k1">unsigned</span> <span class="k1">long</span> <span class="k1">long</span> ll <span class="k3">=</span> li.HighPart<span class="k2">;</span></td></tr><tr><td class="number">22</td><td>  ll <span class="k3">=</span> ll <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="n">32</span><span class="k2">;</span></td></tr><tr><td class="number">23</td><td>  ll <span class="k3">|</span><span class="k3">=</span> li.LowPart<span class="k2">;</span></td></tr><tr><td class="number">24</td><td>  <span class="k1">return</span> ll<span class="k2">;</span></td></tr><tr><td class="number">25</td><td><span class="k2">}</span></td></tr><tr><td class="number">26</td><td><span class="p">#endif</span></td></tr><tr><td class="number">27</td><td>&#160;</td></tr><tr><td class="number">28</td><td><span class="k1">bool</span> qpc_mode <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span></td></tr><tr><td class="number">29</td><td>&#160;</td></tr><tr><td class="number">30</td><td><span class="k1">void</span> timer_proc<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">31</td><td>  <span class="k3">+</span><span class="k3">+</span>timer<span class="k2">;</span></td></tr><tr><td class="number">32</td><td><span class="k2">}</span></td></tr><tr><td class="number">33</td><td><a href="http://www.allegro.cc/manual/END_OF_FUNCTION" target="_blank"><span class="a">END_OF_FUNCTION</span></a><span class="k2">(</span>timer_proc<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">34</td><td>&#160;</td></tr><tr><td class="number">35</td><td><span class="k1">void</span> init_timer<span class="k2">(</span><span class="k1">bool</span> use_qpc<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">36</td><td><span class="p">#ifdef ALLEGRO_WINDOWS</span></td></tr><tr><td class="number">37</td><td>  <span class="k1">if</span> <span class="k2">(</span>use_qpc<span class="k2">)</span></td></tr><tr><td class="number">38</td><td>    qpc_mode <span class="k3">=</span> QueryPerformanceFrequency<span class="k2">(</span><span class="k3">&amp;</span>perf_freq_li<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">39</td><td>  <span class="k1">else</span></td></tr><tr><td class="number">40</td><td><span class="p">#endif</span></td></tr><tr><td class="number">41</td><td>    qpc_mode <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span></td></tr><tr><td class="number">42</td><td>  </td></tr><tr><td class="number">43</td><td>  <span class="k1">if</span> <span class="k2">(</span>qpc_mode<span class="k2">)</span></td></tr><tr><td class="number">44</td><td>    perf_freq <span class="k3">=</span> li_to_ll<span class="k2">(</span>perf_freq_li<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">45</td><td>  </td></tr><tr><td class="number">46</td><td>  <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span>qpc_mode<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">47</td><td>    <a href="http://www.allegro.cc/manual/LOCK_VARIABLE" target="_blank"><span class="a">LOCK_VARIABLE</span></a><span class="k2">(</span>timer<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">48</td><td>    <a href="http://www.allegro.cc/manual/LOCK_FUNCTION" target="_blank"><span class="a">LOCK_FUNCTION</span></a><span class="k2">(</span>timer_proc<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">49</td><td>    <a href="http://www.allegro.cc/manual/install_timer" target="_blank"><span class="a">install_timer</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">50</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">51</td><td>  </td></tr><tr><td class="number">52</td><td>  initialized <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span></td></tr><tr><td class="number">53</td><td><span class="k2">}</span></td></tr><tr><td class="number">54</td><td>&#160;</td></tr><tr><td class="number">55</td><td><span class="k1">void</span> stop_timer<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">56</td><td>  <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span>qpc_mode<span class="k2">)</span></td></tr><tr><td class="number">57</td><td>    <a href="http://www.allegro.cc/manual/remove_int" target="_blank"><span class="a">remove_int</span></a><span class="k2">(</span>timer_proc<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">58</td><td><span class="k2">}</span></td></tr><tr><td class="number">59</td><td>&#160;</td></tr><tr><td class="number">60</td><td><span class="k1">void</span> start_timer<span class="k2">(</span><span class="k1">int</span> _timer_ms<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">61</td><td>  <span class="k1">if</span> <span class="k2">(</span>qpc_mode<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">62</td><td><span class="p">#ifdef ALLEGRO_WINDOWS</span></td></tr><tr><td class="number">63</td><td>    QueryPerformanceCounter<span class="k2">(</span><span class="k3">&amp;</span>last_perf_count_li<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">64</td><td>    last_perf_count <span class="k3">=</span> li_to_ll<span class="k2">(</span>last_perf_count_li<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">65</td><td><span class="p">#endif</span></td></tr><tr><td class="number">66</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">67</td><td>  <span class="k1">else</span> <span class="k2">{</span></td></tr><tr><td class="number">68</td><td>    stop_timer<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">69</td><td>    timer_ms <span class="k3">=</span> _timer_ms<span class="k2">;</span></td></tr><tr><td class="number">70</td><td>    <a href="http://www.allegro.cc/manual/install_int" target="_blank"><span class="a">install_int</span></a><span class="k2">(</span>timer_proc, timer_ms<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">71</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">72</td><td><span class="k2">}</span></td></tr><tr><td class="number">73</td><td>&#160;</td></tr><tr><td class="number">74</td><td><span class="k1">float</span> get_timer_delta<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">75</td><td>  <span class="k1">if</span> <span class="k2">(</span>qpc_mode<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">76</td><td><span class="p">#ifdef ALLEGRO_WINDOWS</span></td></tr><tr><td class="number">77</td><td>    QueryPerformanceCounter<span class="k2">(</span><span class="k3">&amp;</span>perf_count_li<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">78</td><td>    perf_count <span class="k3">=</span> li_to_ll<span class="k2">(</span>perf_count_li<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">79</td><td>    <span class="k1">float</span> result <span class="k3">=</span> <span class="k2">(</span><span class="k1">float</span><span class="k2">)</span><span class="k2">(</span><span class="k2">(</span><span class="k1">double</span><span class="k2">)</span><span class="k2">(</span>perf_count <span class="k3">-</span> last_perf_count<span class="k2">)</span> <span class="k3">/</span> <span class="k2">(</span><span class="k1">double</span><span class="k2">)</span>perf_freq<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">80</td><td>    last_perf_count <span class="k3">=</span> perf_count<span class="k2">;</span></td></tr><tr><td class="number">81</td><td>    <span class="k1">return</span> result<span class="k2">;</span></td></tr><tr><td class="number">82</td><td><span class="p">#else</span></td></tr><tr><td class="number">83</td><td>    <span class="k1">return</span> NULL<span class="k2">;</span></td></tr><tr><td class="number">84</td><td><span class="p">#endif</span></td></tr><tr><td class="number">85</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">86</td><td>  <span class="k1">else</span> <span class="k2">{</span></td></tr><tr><td class="number">87</td><td>    <span class="k1">float</span> result <span class="k3">=</span> <span class="k2">(</span><span class="k1">float</span><span class="k2">)</span>timer <span class="k3">*</span> <span class="k2">(</span><span class="k1">float</span><span class="k2">)</span>timer_ms <span class="k3">*</span> <span class="n">0</span>.<span class="n">001f</span><span class="k2">;</span></td></tr><tr><td class="number">88</td><td>    timer <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">89</td><td>    <span class="k1">return</span> result<span class="k2">;</span></td></tr><tr><td class="number">90</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">91</td><td><span class="k2">}</span></td></tr><tr><td class="number">92</td><td>&#160;</td></tr><tr><td class="number">93</td><td><span class="k1">const</span> <span class="k1">char</span><span class="k3">*</span> get_timing_method_string<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">94</td><td>  <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span>initialized<span class="k2">)</span></td></tr><tr><td class="number">95</td><td>    <span class="k1">return</span> <span class="s">"Not initialized!"</span><span class="k2">;</span></td></tr><tr><td class="number">96</td><td>  <span class="k1">if</span> <span class="k2">(</span>qpc_mode<span class="k2">)</span></td></tr><tr><td class="number">97</td><td><span class="p">#ifdef ALLEGRO_WINDOWS</span></td></tr><tr><td class="number">98</td><td>    <span class="k1">return</span> <span class="s">"QueryPerformanceCounter"</span><span class="k2">;</span></td></tr><tr><td class="number">99</td><td><span class="p">#else</span></td></tr><tr><td class="number">100</td><td>    <span class="k1">return</span> <span class="s">"Something's terribly wrong"</span><span class="k2">;</span></td></tr><tr><td class="number">101</td><td><span class="p">#endif</span></td></tr><tr><td class="number">102</td><td>  <span class="k1">return</span> <span class="s">"Allegro timer routines"</span><span class="k2">;</span></td></tr><tr><td class="number">103</td><td><span class="k2">}</span></td></tr><tr><td class="number">104</td><td>&#160;</td></tr><tr><td class="number">105</td><td><span class="k1">float</span> get_timer_accuracy<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">106</td><td>  <span class="k1">if</span> <span class="k2">(</span>qpc_mode<span class="k2">)</span></td></tr><tr><td class="number">107</td><td><span class="p">#ifdef ALLEGRO_WINDOWS</span></td></tr><tr><td class="number">108</td><td>    <span class="k1">return</span> <span class="k2">(</span><span class="k1">float</span><span class="k2">)</span>perf_freq<span class="k2">;</span></td></tr><tr><td class="number">109</td><td><span class="p">#else</span></td></tr><tr><td class="number">110</td><td>    <span class="k1">return</span> <span class="n">0</span>.<span class="n">0f</span><span class="k2">;</span></td></tr><tr><td class="number">111</td><td><span class="p">#endif</span></td></tr><tr><td class="number">112</td><td>  <span class="k1">if</span> <span class="k2">(</span>timer_ms<span class="k2">)</span></td></tr><tr><td class="number">113</td><td>    <span class="k1">return</span> <span class="n">1000</span>.<span class="n">0f</span> <span class="k3">/</span> <span class="k2">(</span><span class="k1">float</span><span class="k2">)</span>timer_ms<span class="k2">;</span></td></tr><tr><td class="number">114</td><td>  <span class="k1">return</span> <span class="n">0</span>.<span class="n">0f</span><span class="k2">;</span></td></tr><tr><td class="number">115</td><td><span class="k2">}</span></td></tr></tbody></table></div></div><p>
Uses QPC in windows if asked to, and falls back on allegro timers otherwise.<br />Doesn&#39;t support gettimeofday() yet, since I don&#39;t have a linux box running, but it can easily be extended. You can also hack it at will to use integers to represent time, or libc-time, or whatever you please. You may also want to put the whole thing into a class, or make it C-friendly.<br />Oh yes, and feel free to re-use.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Tobias Dammers)</author>
		<pubDate>Wed, 22 Feb 2006 19:32:57 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Baf said:</div><div class="quote"><p>

If anybody had some framework for basic QPC/gettimeofday that can be reused easily, that would be nice. <img src="http://www.allegro.cc/forums/smileys/kiss.gif" alt=":-*" />
</p></div></div><p>
Put it in my domain&#39;s temp folder.  If you want to mirror it baf it would last longer:<br /><a href="http://wipproject.zapto.org/tmp/timer.h">http://wipproject.zapto.org/tmp/timer.h</a><br /><a href="http://wipproject.zapto.org/tmp/timer.cpp">http://wipproject.zapto.org/tmp/timer.cpp</a></p><p>Usage:
</p><div class="source-code snippet"><div class="inner"><pre><span class="p">#include "timer.h"</span>

<span class="k1">int</span> main<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span>
  <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"%u seconds or %u milliseconds or %u microseconds since program start"</span>,
    timer.secs<span class="k2">(</span><span class="k2">)</span>,
    timer.msecs<span class="k2">(</span><span class="k2">)</span>,
    timer.usecs<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="k2">}</span>
</pre></div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (ImLeftFooted)</author>
		<pubDate>Thu, 23 Feb 2006 09:06:27 +0000</pubDate>
	</item>
</rss>
