<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>Game Freezes at Random</title>
		<link>http://www.allegro.cc/forums/view/589586</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Thu, 18 Jan 2007 22:45:57 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I had an epiphany as I wrote the title to this post.</p><p>See, several of my allegro programs tend to freeze at will randomly when developing.  As far as I know, there&#39;s not any problems with the binary freezing.  And when I say random, I mean it.  It could be five seconds, five minutes or thirty minutes before it freezes.  When I Ctrl-alt-delete, the program says &quot;Program Not Responding&quot; under status.</p><p>I figured it had something to do with maybe my timer logic, since the problem seems to span several of my latest works.  However, if it did get locked up due to bad timer logic, wouldn&#39;t task manager say &quot;Running&quot; {implicitly meaning indefinitely}?</p><p>Anywho, the epiphany came when I asked myself how long this has been occurring.  I don&#39;t remember ever having this problem with cosmos, but if I remember correctly (after checking, I do), I hadn&#39;t upgraded to allegro 4.2 by that point.  So it would seem the problem didn&#39;t start till I upgraded to allegro 4.2, but who knows, that might just be a coincidence.  </p><p>As for timer logic, it&#39;s rather simple:</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="c">//game.cpp</span></td></tr><tr><td class="number">2</td><td>...</td></tr><tr><td class="number">3</td><td><span class="k1">volatile</span> <span class="k1">int</span> system_time<span class="k2">;</span></td></tr><tr><td class="number">4</td><td><span class="k1">volatile</span> <span class="k1">int</span> ticks<span class="k2">;</span></td></tr><tr><td class="number">5</td><td><span class="k1">volatile</span> <span class="k1">int</span> framerate<span class="k2">;</span></td></tr><tr><td class="number">6</td><td><span class="k1">volatile</span> <span class="k1">int</span> draw_ticks<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> timer1<span class="k2">(</span><span class="k1">void</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>  system_time<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span>      </td></tr><tr><td class="number">11</td><td><span class="k2">}</span><a href="http://www.allegro.cc/manual/END_OF_FUNCTION" target="_blank"><span class="a">END_OF_FUNCTION</span></a><span class="k2">(</span>timer1<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">12</td><td>&#160;</td></tr><tr><td class="number">13</td><td><span class="k1">void</span> frametimer<span class="k2">(</span><span class="k1">void</span><span class="k2">)</span></td></tr><tr><td class="number">14</td><td><span class="k2">{</span></td></tr><tr><td class="number">15</td><td>  framerate <span class="k3">=</span> draw_ticks<span class="k2">;</span></td></tr><tr><td class="number">16</td><td>  draw_ticks <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">17</td><td><span class="k2">}</span><a href="http://www.allegro.cc/manual/END_OF_FUNCTION" target="_blank"><span class="a">END_OF_FUNCTION</span></a><span class="k2">(</span>frametimer<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">18</td><td>&#160;</td></tr><tr><td class="number">19</td><td><span class="k1">void</span> init<span class="k2">(</span><span class="k2">)</span></td></tr><tr><td class="number">20</td><td><span class="k2">{</span></td></tr><tr><td class="number">21</td><td>...</td></tr><tr><td class="number">22</td><td>&#160;</td></tr><tr><td class="number">23</td><td>  <a href="http://www.allegro.cc/manual/LOCK_VARIABLE" target="_blank"><span class="a">LOCK_VARIABLE</span></a><span class="k2">(</span>system_time<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">24</td><td>  <a href="http://www.allegro.cc/manual/LOCK_VARIABLE" target="_blank"><span class="a">LOCK_VARIABLE</span></a><span class="k2">(</span>ticks<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">25</td><td>  <a href="http://www.allegro.cc/manual/LOCK_VARIABLE" target="_blank"><span class="a">LOCK_VARIABLE</span></a><span class="k2">(</span>framerate<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">26</td><td>  <a href="http://www.allegro.cc/manual/LOCK_VARIABLE" target="_blank"><span class="a">LOCK_VARIABLE</span></a><span class="k2">(</span>draw_ticks<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">27</td><td>  <a href="http://www.allegro.cc/manual/LOCK_FUNCTION" target="_blank"><span class="a">LOCK_FUNCTION</span></a><span class="k2">(</span>timer1<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">28</td><td>  <a href="http://www.allegro.cc/manual/LOCK_FUNCTION" target="_blank"><span class="a">LOCK_FUNCTION</span></a><span class="k2">(</span>frametimer<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">29</td><td>  iTimer_Speed <span class="k3">=</span> GAME.configuration-&gt;clock_speed<span class="k2">;</span></td></tr><tr><td class="number">30</td><td>  <a href="http://www.allegro.cc/manual/install_int_ex" target="_blank"><span class="a">install_int_ex</span></a><span class="k2">(</span>timer1, BPS_TO_TIMER<span class="k2">(</span>iTimer_Speed<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">31</td><td>  <a href="http://www.allegro.cc/manual/install_int_ex" target="_blank"><span class="a">install_int_ex</span></a><span class="k2">(</span>frametimer, BPS_TO_TIMER<span class="k2">(</span><span class="n">1</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">32</td><td>&#160;</td></tr><tr><td class="number">33</td><td>...</td></tr><tr><td class="number">34</td><td><span class="k2">}</span></td></tr></tbody></table></div></div><p>

</p><div class="source-code snippet"><div class="inner"><pre><span class="c">//game.h</span>
...
<span class="k1">extern</span> <span class="k1">volatile</span> <span class="k1">int</span> draw_ticks<span class="k2">;</span>
<span class="k1">extern</span> <span class="k1">volatile</span> <span class="k1">int</span> ticks<span class="k2">;</span>
<span class="k1">extern</span> <span class="k1">volatile</span> <span class="k1">int</span> framerate<span class="k2">;</span>
<span class="k1">extern</span> <span class="k1">volatile</span> <span class="k1">int</span> system_time<span class="k2">;</span>
<span class="k1">void</span> timer1<span class="k2">(</span><span class="k1">void</span><span class="k2">)</span><span class="k2">;</span>
<span class="k1">void</span> timer2<span class="k2">(</span><span class="k1">void</span><span class="k2">)</span><span class="k2">;</span>
...
</pre></div></div><p>

Lastly, the main loop, also in game.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="c">//game.cpp</span></td></tr><tr><td class="number">2</td><td><span class="k1">void</span> play_game<span class="k2">(</span><span class="k2">)</span></td></tr><tr><td class="number">3</td><td><span class="k2">{</span>  </td></tr><tr><td class="number">4</td><td>  <span class="k1">if</span><span class="k2">(</span>GAME.configuration-&gt;framerate <span class="k3">=</span><span class="k3">=</span> <span class="n">1</span><span class="k2">)</span></td></tr><tr><td class="number">5</td><td>    iFrameRate <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span></td></tr><tr><td class="number">6</td><td>  <span class="k1">else</span></td></tr><tr><td class="number">7</td><td>    iFrameRate <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span></td></tr><tr><td class="number">8</td><td>  game_init<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">9</td><td>  </td></tr><tr><td class="number">10</td><td>  <span class="k1">while</span><span class="k2">(</span><span class="k3">!</span>gInput.MAP<span class="k2">(</span>CANCEL,<span class="n">5</span><span class="k2">)</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> <span class="k3">!</span>GAME.quit<span class="k2">)</span></td></tr><tr><td class="number">11</td><td>  <span class="k2">{</span></td></tr><tr><td class="number">12</td><td>    <span class="k1">while</span><span class="k2">(</span>system_time<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>      system_time--<span class="k2">;</span></td></tr><tr><td class="number">15</td><td>      ticks<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span></td></tr><tr><td class="number">16</td><td>      game_update<span class="k2">(</span><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>      </td></tr><tr><td class="number">19</td><td>    draw_ticks<span class="k3">+</span><span class="k3">+</span><span class="k2">;</span></td></tr><tr><td class="number">20</td><td>    game_draw<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">21</td><td>&#160;</td></tr><tr><td class="number">22</td><td>    <span class="k1">if</span><span class="k2">(</span>iFrameRate<span class="k2">)</span> </td></tr><tr><td class="number">23</td><td>    <span class="k2">{</span></td></tr><tr><td class="number">24</td><td>      text_mode<span class="k2">(</span><span class="k3">-</span><span class="n">1</span><span class="k2">)</span><span class="k2">;</span>  </td></tr><tr><td class="number">25</td><td>      textprintf<span class="k2">(</span><a href="http://www.allegro.cc/manual/screen" target="_blank"><span class="a">screen</span></a>, <a href="http://www.allegro.cc/manual/font" target="_blank"><span class="a">font</span></a>, <span class="n">0</span>, <span class="n">0</span>, <span class="k3">-</span><span class="n">1</span>, <span class="s">"Framerate:  %dfps"</span>, framerate<span class="k2">)</span><span class="k2">;</span>          </td></tr><tr><td class="number">26</td><td>    <span class="k2">}</span></td></tr><tr><td class="number">27</td><td>  <span class="k2">}</span>  </td></tr><tr><td class="number">28</td><td>  game_shutdown<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">29</td><td><span class="k2">}</span></td></tr></tbody></table></div></div><p>
As for further timer logic, I give most classes an int &quot;update_timer&quot; and do the following:</p><div class="source-code snippet"><div class="inner"><pre>...
<span class="k1">if</span><span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_38.html" target="_blank">abs</a><span class="k2">(</span>ticks <span class="k3">-</span> update_timer<span class="k2">)</span> <span class="k3">&gt;</span> update_delay<span class="k2">)</span>
<span class="k2">{</span>
   update_timer <span class="k3">=</span> ticks<span class="k2">;</span>
   <span class="c">//Do stuff</span>
   ...
<span class="k2">}</span>
</pre></div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Onewing)</author>
		<pubDate>Tue, 16 Jan 2007 11:37:54 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Random freezing is my greatest fear.  I avoid it at all costs.</p><p>The best trick I&#39;ve found is running it in a debugger and breaking as soon as the pause occurs.  Then ofcourse evaluating the stack tree.</p><p>Sometimes it takes a couple tries to land it just right and sometimes you&#39;ll even find the program will hang in a couple of places.</p><p>The absolute worst kind is when it hangs randomly every 30 min+ and only lasts a few seconds.  That kind of bug will make you want to shoot yourself.</p><p>[edit]<br />I found the problem.  Your frequency cannot be 1.  Try 20.</p><p>[edit]<br />OK I was wrong.  You&#39;re using BPS_TO_TIMER.  In that case set it to 50 or 60.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (ImLeftFooted)</author>
		<pubDate>Tue, 16 Jan 2007 12:17:47 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>the problem is most likely a memory leak if your in winxp open the task manager go to the processes tab and watch the mem usage of your game exe.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (piccolo)</author>
		<pubDate>Tue, 16 Jan 2007 12:39:13 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I was wrong again.  I was looking at the frame timer and thought it was the logic timer.  Do the debugger trick.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (ImLeftFooted)</author>
		<pubDate>Tue, 16 Jan 2007 12:46:53 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Which OS are you using?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Matthew Leverton)</author>
		<pubDate>Tue, 16 Jan 2007 12:52:51 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
Which OS are you using?
</p></div></div><p>
WindowsXP and should be in synch with Windows Updates.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Onewing)</author>
		<pubDate>Tue, 16 Jan 2007 21:00:58 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Try giving some time back to the OS every game loop using rest(0) or Sleep(0). I&#39;ve found that on Windows 98 using Allegro 4.1.0 or higher, I have to use rest(1) or Sleep(1) to prevent the keyboard, mouse and joystick I/O from locking up for split seconds every so often. (Thus for each frame I end up giving 1 ms of time back to the OS.)</p><p>--- Kris Asick (Gemini)<br />--- <a href="http://www.pixelships.com">http://www.pixelships.com</a>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Kris Asick)</author>
		<pubDate>Wed, 17 Jan 2007 03:05:35 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I can try it, but I don&#39;t think it&#39;s right.  My programs are freezing and staying frozen until I kill them.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Onewing)</author>
		<pubDate>Wed, 17 Jan 2007 04:59:25 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>
Does it work with other games?<br />Does it work with the Allegro Demo, or examples?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Richard Phipps)</author>
		<pubDate>Wed, 17 Jan 2007 05:07:26 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Any more ideas in the mean time?</p><p>It&#39;s hard to determine if there is a problem with running the allegro demos, but I&#39;ll run them for a while and see if anything happens later on when I have that kind of time.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Onewing)</author>
		<pubDate>Thu, 18 Jan 2007 10:22:56 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Onewing:  can we have the whole code ?</p><p>I really wanna help, and having the whole source can allow us some debugging.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (GullRaDriel)</author>
		<pubDate>Thu, 18 Jan 2007 14:28:37 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
install_int_ex(frametimer, BPS_TO_TIMER(1));
</p></div></div><p>
This is a 1000 Hz timer. Bad stuff is supposed to happen if you use these...?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Audric)</author>
		<pubDate>Thu, 18 Jan 2007 17:09:10 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
This is a 1000 Hz timer.
</p></div></div><p>

No, that&#39;s a 1 Hz timer. Nothing wrong with that.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Indeterminatus)</author>
		<pubDate>Thu, 18 Jan 2007 17:16:15 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
Onewing: can we have the whole code ?
</p></div></div><p>
Well, I had the problem with Toggles, a game I released back in August &#39;06.  I believe I packaged the source with that, but it&#39;s pretty big.  For the new game, the source code is, just guessing, 5000+ lines of code.</p><p>Since the problem spans several programs, I&#39;d either expect it to be non-code related or something to do with my timer logic.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Onewing)</author>
		<pubDate>Thu, 18 Jan 2007 22:45:57 +0000</pubDate>
	</item>
</rss>
