<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>A5 program doesn&#39;t work after computer suspend</title>
		<link>http://www.allegro.cc/forums/view/612807</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Sun, 16 Jun 2013 06:40:40 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>My Allegro 5.09 program does not work correctly after a computer suspend.  I suspect this is a problem with my event loop but I may be incorrect.  Any suggestions on how to address this issue?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Ashteth)</author>
		<pubDate>Fri, 14 Jun 2013 05:52:48 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Can you describe the problem? If it seems it&#39;s hanging maybe you didn&#39;t stop your timers and they built up a ton of events or something.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Trent Gamblin)</author>
		<pubDate>Fri, 14 Jun 2013 06:03:30 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>
After a system suspend (I close my laptop monitor), the Allegro program displays the static image that it last displayed but sprites do not update, the mouse is unresponsive etc.  In other words, what you indicated makes a lot of sense: the event queue may be built up and cannot flush.  Below is my main loop (with comments not present in the actual code) to indicate what is going on.  You will also note that I am using AGUI, though disabling AGUI seems to have no effect on the problem.</p><p>I guess the questions are:  is there anything I can add to flush the queue after a system suspend?  And:  would updating to a version of Allegro after 5.09 solve this problem?</p><p>Thanks</p><p> </p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">   1</span> <span class="k1">while</span><span class="k2">(</span>bMainLoop<span class="k2">)</span>
<span class="number">   2</span> <span class="k2">{</span>
<span class="number">   3</span>      <a href="http://www.allegro.cc/manual/ALLEGRO_EVENT"><span class="a">ALLEGRO_EVENT</span></a> ev<span class="k2">;</span>
<span class="number">   4</span>      <a href="http://www.allegro.cc/manual/al_wait_for_event"><span class="a">al_wait_for_event</span></a><span class="k2">(</span>m_qEventQueue, <span class="k3">&amp;</span>ev<span class="k2">)</span><span class="k2">;</span>
<span class="number">   5</span>      <span class="c">// Process event in AGUI.</span>
<span class="number">   6</span>      inputHandler-&gt;processEvent<span class="k2">(</span>ev<span class="k2">)</span><span class="k2">;</span>
<span class="number">   7</span>      <span class="k1">switch</span><span class="k2">(</span>ev.type<span class="k2">)</span>
<span class="number">   8</span>      <span class="k2">{</span>
<span class="number">   9</span>         <span class="k1">case</span> ALLEGRO_EVENT_TIMER:
<span class="number">  10</span>         <span class="k2">{</span>
<span class="number">  11</span>            <span class="c">// Record Time</span>
<span class="number">  12</span>            m_dSimTime <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_get_time"><span class="a">al_get_time</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  13</span>            m_dElapsedTime <span class="k3">=</span> m_dSimTime <span class="k3">-</span> m_dLastTime<span class="k2">;</span>
<span class="number">  14</span>            m_dLastTime <span class="k3">=</span> m_dSimTime<span class="k2">;</span>
<span class="number">  15</span>            
<span class="number">  16</span>            <span class="c">// Force redraw after event is handled.</span>
<span class="number">  17</span>            bRedraw <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number">  18</span>
<span class="number">  19</span>            <span class="c">// Update mouse location.</span>
<span class="number">  20</span>            g_cMouse.setCaptured<span class="k2">(</span><span class="k1">false</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  21</span>            g_cMouse.updateMouseDrag<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  22</span>
<span class="number">  23</span>            <span class="c">// Update scenegraph</span>
<span class="number">  24</span>            g_cSceneGraph.update<span class="k2">(</span>m_dSimTime, m_dElapsedTime<span class="k2">)</span><span class="k2">;</span>
<span class="number">  25</span>
<span class="number">  26</span>            <span class="c">// Update timed function callback pipe.</span>
<span class="number">  27</span>            <span class="c">// C style callback functions are executed based </span>
<span class="number">  28</span>            <span class="c">// on timer and then erased.</span>
<span class="number">  29</span>            g_cPlan.update<span class="k2">(</span>m_dSimTime<span class="k2">)</span><span class="k2">;</span>
<span class="number">  30</span>            <span class="k1">break</span><span class="k2">;</span>
<span class="number">  31</span>         <span class="k2">}</span>
<span class="number">  32</span>         <span class="k1">case</span> ALLEGRO_EVENT_DISPLAY_CLOSE:
<span class="number">  33</span>         <span class="k2">{</span>
<span class="number">  34</span>            bMainLoop <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number">  35</span>            <span class="k1">break</span><span class="k2">;</span>
<span class="number">  36</span>         <span class="k2">}</span>
<span class="number">  37</span>         <span class="k1">case</span> ALLEGRO_EVENT_MOUSE_AXES:
<span class="number">  38</span>         <span class="k1">case</span> ALLEGRO_EVENT_MOUSE_ENTER_DISPLAY:
<span class="number">  39</span>         <span class="k2">{</span>
<span class="number">  40</span>            <span class="c">// Record mouse position.</span>
<span class="number">  41</span>            m_iMouseX <span class="k3">=</span> ev.mouse.x<span class="k2">;</span>
<span class="number">  42</span>            m_iMouseY <span class="k3">=</span> ev.mouse.y<span class="k2">;</span>
<span class="number">  43</span>            a2dVector vPos<span class="k2">(</span>ev.mouse.x, ev.mouse.y<span class="k2">)</span><span class="k2">;</span>
<span class="number">  44</span>            g_cMouse.setPos<span class="k2">(</span>vPos<span class="k2">)</span><span class="k2">;</span>            
<span class="number">  45</span>            <span class="k1">break</span><span class="k2">;</span>
<span class="number">  46</span>         <span class="k2">}</span>
<span class="number">  47</span>         <span class="k1">case</span> ALLEGRO_EVENT_MOUSE_BUTTON_DOWN:
<span class="number">  48</span>         <span class="k2">{</span>
<span class="number">  49</span>            <span class="k1">if</span><span class="k2">(</span><span class="n">1</span> <span class="k3">=</span><span class="k3">=</span> ev.mouse.button<span class="k2">)</span>
<span class="number">  50</span>            <span class="k2">{</span>
<span class="number">  51</span>               g_cMouse.setLeftDown<span class="k2">(</span><span class="k1">true</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  52</span>            <span class="k2">}</span>
<span class="number">  53</span>            <span class="k1">if</span><span class="k2">(</span><span class="n">2</span> <span class="k3">=</span><span class="k3">=</span> ev.mouse.button<span class="k2">)</span>
<span class="number">  54</span>            <span class="k2">{</span>
<span class="number">  55</span>               g_cMouse.setRightDown<span class="k2">(</span><span class="k1">true</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  56</span>            <span class="k2">}</span>
<span class="number">  57</span>            <span class="k1">break</span><span class="k2">;</span>
<span class="number">  58</span>         <span class="k2">}</span>
<span class="number">  59</span>         <span class="k1">case</span> ALLEGRO_EVENT_MOUSE_BUTTON_UP:
<span class="number">  60</span>         <span class="k2">{</span>
<span class="number">  61</span>            <span class="k1">if</span><span class="k2">(</span><span class="n">1</span> <span class="k3">=</span><span class="k3">=</span> ev.mouse.button<span class="k2">)</span>
<span class="number">  62</span>            <span class="k2">{</span>
<span class="number">  63</span>               g_cMouse.setLeftDown<span class="k2">(</span><span class="k1">false</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  64</span>            <span class="k2">}</span>
<span class="number">  65</span>            <span class="k1">if</span><span class="k2">(</span><span class="n">2</span> <span class="k3">=</span><span class="k3">=</span> ev.mouse.button<span class="k2">)</span>
<span class="number">  66</span>            <span class="k2">{</span>
<span class="number">  67</span>               g_cMouse.setRightDown<span class="k2">(</span><span class="k1">false</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  68</span>            <span class="k2">}</span>
<span class="number">  69</span>            <span class="k1">break</span><span class="k2">;</span>
<span class="number">  70</span>         <span class="k2">}</span>
<span class="number">  71</span>         
<span class="number">  72</span>         <span class="k1">case</span> ALLEGRO_EVENT_DISPLAY_EXPOSE:
<span class="number">  73</span>         <span class="k2">{</span>
<span class="number">  74</span>            bRedraw <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number">  75</span>            <span class="k1">break</span><span class="k2">;</span>
<span class="number">  76</span>         <span class="k2">}</span>
<span class="number">  77</span>         default:
<span class="number">  78</span>         <span class="k2">{</span>
<span class="number">  79</span>            <span class="k1">break</span><span class="k2">;</span>
<span class="number">  80</span>         <span class="k2">}</span>
<span class="number">  81</span>   <span class="k2">}</span>
<span class="number">  82</span> 
<span class="number">  83</span>   <span class="k1">if</span><span class="k2">(</span>bRedraw <span class="k3">&amp;</span><span class="k3">&amp;</span> <a href="http://www.allegro.cc/manual/al_is_event_queue_empty"><span class="a">al_is_event_queue_empty</span></a><span class="k2">(</span>m_qEventQueue<span class="k2">)</span><span class="k2">)</span>
<span class="number">  84</span>   <span class="k2">{</span>
<span class="number">  85</span>      bRedraw <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number">  86</span>      <a href="http://www.allegro.cc/manual/al_set_target_backbuffer"><span class="a">al_set_target_backbuffer</span></a><span class="k2">(</span>m_qDisplay<span class="k2">)</span><span class="k2">;</span>
<span class="number">  87</span>      <a href="http://www.allegro.cc/manual/al_clear_to_color"><span class="a">al_clear_to_color</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/al_map_rgb"><span class="a">al_map_rgb</span></a><span class="k2">(</span><span class="n">0</span>,<span class="n">0</span>,<span class="n">0</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  88</span>         
<span class="number">  89</span>      <span class="c">// Draw scenegraph</span>
<span class="number">  90</span>      g_cSceneGraph.draw<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  91</span>         
<span class="number">  92</span>      <span class="c">// Draw gui</span>
<span class="number">  93</span>      gui-&gt;logic<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  94</span>      gui-&gt;render<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  95</span>         
<span class="number">  96</span>      <a href="http://www.allegro.cc/manual/al_flip_display"><span class="a">al_flip_display</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  97</span>   <span class="k2">}</span>
<span class="number">  98</span> <span class="k2">}</span>
</div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Ashteth)</author>
		<pubDate>Fri, 14 Jun 2013 08:39:17 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>There is nothing in Allegro that will tell you the system has suspended or resumed, so you could try checking for a large jump in time and if that happens flush the event queue?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Trent Gamblin)</author>
		<pubDate>Fri, 14 Jun 2013 08:49:59 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Is there a chance he&#39;ll get a DISPLAY_LOST event?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Thomas Fjellstrom)</author>
		<pubDate>Fri, 14 Jun 2013 08:53:19 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Only if he&#39;s using D3D.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Trent Gamblin)</author>
		<pubDate>Fri, 14 Jun 2013 16:08:33 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Anyone know how to purge the event buffer so I can test some of these theories out?  I will most likely come back to this problem later.  It&#39;s really more of a minor annoyance and I have more important things to work on.  I&#39;m surprised no one else seems to have come across this problem.  Thanks.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Ashteth)</author>
		<pubDate>Sun, 16 Jun 2013 02:41:27 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p><span class="source-code"><a href="http://www.allegro.cc/manual/al_flush_event_queue"><span class="a">al_flush_event_queue</span></a></span>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Trent Gamblin)</author>
		<pubDate>Sun, 16 Jun 2013 03:04:44 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Flushing the buffer after 10 minutes of inactivity seems to solve the problem.  Thanks.  Now all I have to do is figure out why some of the bitmaps seem to get corrupted after a suspend.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Ashteth)</author>
		<pubDate>Sun, 16 Jun 2013 06:29:47 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Are you using D3D? In theory you should only get corrupted bitmaps with D3D + using ALLEGRO_NO_PRESERVE_TEXTURE.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Trent Gamblin)</author>
		<pubDate>Sun, 16 Jun 2013 06:40:40 +0000</pubDate>
	</item>
</rss>
