<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>Allegro 5 Threading Interface</title>
		<link>http://www.allegro.cc/forums/view/607420</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Fri, 03 Jun 2011 19:07:12 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Hi guys, </p><p>One of the libCurl function is synchronous (which means you can&#39;t continue until the function has completed one way or another). So I would need to do some multi-thread to avoid pausing the entire game while requesting the data from the server.</p><p>I have being checking the example (too elaborated to be actually an example) to understand the Allegro thread interface. But what I would like to do is just open a new thread, modified some variables (std::string) and then close it. My question is:</p><p>If I create a variable called std::string string, outside of the tread, then send the address of that variable and use a pointer to modified that variable in the thread, but at the same time I might be using it (not modifying it) the variable outside the thread, do I need to use mutex and things like that?</p><p>Does someone have really an example to show a very basic program using the Allegro 5 threading interface?</p><p>Thanks.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (AMCerasoli)</author>
		<pubDate>Tue, 24 May 2011 03:17:51 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Check out the <a href="http://curl.haxx.se/libcurl/c/libcurl-multi.html">multi</a> interface.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Vanneto)</author>
		<pubDate>Tue, 24 May 2011 03:44:13 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/607420/918673#target">AMCerasoli</a> said:</div><div class="quote"><p> If I create a variable called std::string string, outside of the tread, then send the address of that variable and use a pointer to modified that variable in the thread, but at the same time I might be using it (not modifying it) the variable outside the thread, do I need to use mutex and things like that?
</p></div></div><p>Yes.</p><p>Why don&#39;t you create a little example using libcurl and an Allegro thread and then post it here for comments?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Matthew Leverton)</author>
		<pubDate>Tue, 24 May 2011 03:47:50 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
Check out the multi [curl.haxx.se] interface.
</p></div></div><p>
It says:
</p><pre>
1. Enable a &quot;pull&quot; interface. The application that uses libcurl decides where and when to ask libcurl to get/send data.

2. Enable multiple simultaneous transfers in the same thread without making it complicated for the application.

3. Enable the application to wait for action on its own file descriptors and curl&#39;s file descriptors simultaneous easily.
</pre><p>

There is no multi-thread. Besides I don&#39;t need multi handle since I&#39;m doing just one call to the server to just one specific file. I don&#39;t need to retrieve nor check multiple calls to server.</p><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/607420/918686#target">Matthew Leverton</a> said:</div><div class="quote"><p>
Why don&#39;t you create a little example using libcurl and an Allegro thread and then post it here for comments?
</p></div></div><p>

Here, and probably the wiki, and probably should be inside the examples binaries too. there is thread.c and thread2.c and as the name says (thread2.c) it&#39;s even more elaborated, with more functions, structs, and unfortunately the mutex thing.</p><p>Sorry but there is nothing you could do right now, I&#39;m going to still struggling with thread2.c file to <b>get to the point</b>. I just wanted to know if I had to use mutex because without using it I already know how to do it, but using the mutex thing I have no Idea, I&#39;m going to have to read more.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (AMCerasoli)</author>
		<pubDate>Tue, 24 May 2011 04:17:39 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Assuming you have some variable named <span class="source-code">foo</span> that is shared, you can do something like this:</p><div class="source-code snippet"><div class="inner"><pre><span class="c">// call this once at the beginning</span>
<a href="http://www.allegro.cc/manual/ALLEGRO_MUTEX"><span class="a">ALLEGRO_MUTEX</span></a> <span class="k3">*</span>m <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_mutex"><span class="a">al_create_mutex</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>

<span class="c">// within the various threads, do this any time you want to access the variable</span>
<a href="http://www.allegro.cc/manual/al_lock_mutex"><span class="a">al_lock_mutex</span></a><span class="k2">(</span>m<span class="k2">)</span><span class="k2">;</span>
<span class="c">// use variable foo</span>
<a href="http://www.allegro.cc/manual/al_unlock_mutex"><span class="a">al_unlock_mutex</span></a><span class="k2">(</span>m<span class="k2">)</span><span class="k2">;</span>

<span class="c">// call this once at the very end</span>
<a href="http://www.allegro.cc/manual/al_destroy_mutex"><span class="a">al_destroy_mutex</span></a><span class="k2">(</span>m<span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Matthew Leverton)</author>
		<pubDate>Tue, 24 May 2011 05:54:00 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Ok, thanks Matt, that helps me solve my particular problem, don&#39;t know if I&#39;m doing it correct, though.</p><p>But I&#39;m trying to create a little example to put it on the Wiki, but I don&#39;t know if I&#39;m using the functions correctly.</p><p>I took a Wiki tut and modified a little bit.<br />Anyway here it&#39;s:</p><p>Concept: Change the X axis in one thread and the Y axis in another thread of a bitmap.</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="p">#include &lt;stdio.h&gt;</span>
<span class="number">   2</span><span class="p">#include &lt;iostream&gt;</span>
<span class="number">   3</span><span class="p">#include &lt;allegro5/allegro.h&gt;</span>
<span class="number">   4</span>
<span class="number">   5</span><span class="k1">class</span> DATA<span class="k2">{</span>
<span class="number">   6</span>
<span class="number">   7</span>   public:
<span class="number">   8</span>   <span class="k1">float</span> posiX<span class="k2">;</span>
<span class="number">   9</span>   <span class="k1">float</span> posiY<span class="k2">;</span>
<span class="number">  10</span>   <span class="k1">bool</span>  modi_X<span class="k2">;</span>
<span class="number">  11</span>
<span class="number">  12</span>   DATA<span class="k2">(</span><span class="k2">)</span><span class="k2">{</span>
<span class="number">  13</span>
<span class="number">  14</span>   posiX  <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number">  15</span>   posiY  <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number">  16</span>   modi_X <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number">  17</span>
<span class="number">  18</span>   <span class="k2">}</span>
<span class="number">  19</span>
<span class="number">  20</span><span class="k2">}</span>data<span class="k2">;</span>
<span class="number">  21</span>
<span class="number">  22</span><span class="k1">const</span> <span class="k1">float</span> FPS        <span class="k3">=</span> <span class="n">60</span><span class="k2">;</span>
<span class="number">  23</span><span class="k1">const</span> <span class="k1">int</span> <a href="http://www.allegro.cc/manual/SCREEN_W"><span class="a">SCREEN_W</span></a>     <span class="k3">=</span> <span class="n">640</span><span class="k2">;</span>
<span class="number">  24</span><span class="k1">const</span> <span class="k1">int</span> <a href="http://www.allegro.cc/manual/SCREEN_H"><span class="a">SCREEN_H</span></a>     <span class="k3">=</span> <span class="n">480</span><span class="k2">;</span>
<span class="number">  25</span><span class="k1">const</span> <span class="k1">int</span> BOUNCER_SIZE <span class="k3">=</span> <span class="n">32</span><span class="k2">;</span>
<span class="number">  26</span>
<span class="number">  27</span><span class="k1">static</span> <span class="k1">void</span> <span class="k3">*</span>Func_Thread<span class="k2">(</span><a href="http://www.allegro.cc/manual/ALLEGRO_THREAD"><span class="a">ALLEGRO_THREAD</span></a> <span class="k3">*</span>thr, <span class="k1">void</span> <span class="k3">*</span>arg<span class="k2">)</span><span class="k2">;</span>
<span class="number">  28</span>
<span class="number">  29</span><span class="k1">int</span> main<span class="k2">(</span><span class="k1">int</span> argc, <span class="k1">char</span> <span class="k3">*</span><span class="k3">*</span>argv<span class="k2">)</span>
<span class="number">  30</span><span class="k2">{</span>
<span class="number">  31</span>   <a href="http://www.allegro.cc/manual/ALLEGRO_DISPLAY"><span class="a">ALLEGRO_DISPLAY</span></a>     <span class="k3">*</span>display     <span class="k3">=</span> NULL<span class="k2">;</span>
<span class="number">  32</span>   <a href="http://www.allegro.cc/manual/ALLEGRO_EVENT_QUEUE"><span class="a">ALLEGRO_EVENT_QUEUE</span></a> <span class="k3">*</span>event_queue <span class="k3">=</span> NULL<span class="k2">;</span>
<span class="number">  33</span>   <a href="http://www.allegro.cc/manual/ALLEGRO_TIMER"><span class="a">ALLEGRO_TIMER</span></a>       <span class="k3">*</span>timer       <span class="k3">=</span> NULL<span class="k2">;</span>
<span class="number">  34</span>   <a href="http://www.allegro.cc/manual/ALLEGRO_BITMAP"><span class="a">ALLEGRO_BITMAP</span></a>      <span class="k3">*</span>bouncer     <span class="k3">=</span> NULL<span class="k2">;</span>
<span class="number">  35</span>   <a href="http://www.allegro.cc/manual/ALLEGRO_MUTEX"><span class="a">ALLEGRO_MUTEX</span></a>       <span class="k3">*</span>mutex       <span class="k3">=</span> NULL<span class="k2">;</span>
<span class="number">  36</span>   <a href="http://www.allegro.cc/manual/ALLEGRO_THREAD"><span class="a">ALLEGRO_THREAD</span></a>      <span class="k3">*</span>thread_1    <span class="k3">=</span> NULL<span class="k2">;</span>
<span class="number">  37</span>   <a href="http://www.allegro.cc/manual/ALLEGRO_THREAD"><span class="a">ALLEGRO_THREAD</span></a>      <span class="k3">*</span>thread_2    <span class="k3">=</span> NULL<span class="k2">;</span>
<span class="number">  38</span>
<span class="number">  39</span>   <span class="k1">bool</span> redraw <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number">  40</span>
<span class="number">  41</span>   <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span><a href="http://www.allegro.cc/manual/al_init"><span class="a">al_init</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number">  42</span>      <a href="http://www.delorie.com/djgpp/doc/libc/libc_345.html" target="_blank">fprintf</a><span class="k2">(</span>stderr, <span class="s">"failed to initialize allegro!\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  43</span>      <span class="k1">return</span> <span class="k3">-</span><span class="n">1</span><span class="k2">;</span>
<span class="number">  44</span>   <span class="k2">}</span>
<span class="number">  45</span>
<span class="number">  46</span>   <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span><a href="http://www.allegro.cc/manual/al_install_mouse"><span class="a">al_install_mouse</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number">  47</span>      <a href="http://www.delorie.com/djgpp/doc/libc/libc_345.html" target="_blank">fprintf</a><span class="k2">(</span>stderr, <span class="s">"failed to initialize the mouse!\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  48</span>      <span class="k1">return</span> <span class="k3">-</span><span class="n">1</span><span class="k2">;</span>
<span class="number">  49</span>   <span class="k2">}</span>
<span class="number">  50</span>
<span class="number">  51</span>   timer <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_timer"><span class="a">al_create_timer</span></a><span class="k2">(</span><span class="n">1</span>.<span class="n">0</span> <span class="k3">/</span> FPS<span class="k2">)</span><span class="k2">;</span>
<span class="number">  52</span>   <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>timer<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  53</span>      <a href="http://www.delorie.com/djgpp/doc/libc/libc_345.html" target="_blank">fprintf</a><span class="k2">(</span>stderr, <span class="s">"failed to create timer!\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  54</span>      <span class="k1">return</span> <span class="k3">-</span><span class="n">1</span><span class="k2">;</span>
<span class="number">  55</span>   <span class="k2">}</span>
<span class="number">  56</span>
<span class="number">  57</span>   display <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_display"><span class="a">al_create_display</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/SCREEN_W"><span class="a">SCREEN_W</span></a>, <a href="http://www.allegro.cc/manual/SCREEN_H"><span class="a">SCREEN_H</span></a><span class="k2">)</span><span class="k2">;</span>
<span class="number">  58</span>   <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>display<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  59</span>      <a href="http://www.delorie.com/djgpp/doc/libc/libc_345.html" target="_blank">fprintf</a><span class="k2">(</span>stderr, <span class="s">"failed to create display!\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  60</span>      <a href="http://www.allegro.cc/manual/al_destroy_timer"><span class="a">al_destroy_timer</span></a><span class="k2">(</span>timer<span class="k2">)</span><span class="k2">;</span>
<span class="number">  61</span>      <span class="k1">return</span> <span class="k3">-</span><span class="n">1</span><span class="k2">;</span>
<span class="number">  62</span>   <span class="k2">}</span>
<span class="number">  63</span>
<span class="number">  64</span>   bouncer <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_bitmap"><span class="a">al_create_bitmap</span></a><span class="k2">(</span>BOUNCER_SIZE, BOUNCER_SIZE<span class="k2">)</span><span class="k2">;</span>
<span class="number">  65</span>   <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>bouncer<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  66</span>      <a href="http://www.delorie.com/djgpp/doc/libc/libc_345.html" target="_blank">fprintf</a><span class="k2">(</span>stderr, <span class="s">"failed to create bouncer bitmap!\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  67</span>      <a href="http://www.allegro.cc/manual/al_destroy_display"><span class="a">al_destroy_display</span></a><span class="k2">(</span>display<span class="k2">)</span><span class="k2">;</span>
<span class="number">  68</span>      <a href="http://www.allegro.cc/manual/al_destroy_timer"><span class="a">al_destroy_timer</span></a><span class="k2">(</span>timer<span class="k2">)</span><span class="k2">;</span>
<span class="number">  69</span>      <span class="k1">return</span> <span class="k3">-</span><span class="n">1</span><span class="k2">;</span>
<span class="number">  70</span>   <span class="k2">}</span>
<span class="number">  71</span>
<span class="number">  72</span>   <a href="http://www.allegro.cc/manual/al_set_target_bitmap"><span class="a">al_set_target_bitmap</span></a><span class="k2">(</span>bouncer<span class="k2">)</span><span class="k2">;</span>
<span class="number">  73</span>
<span class="number">  74</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">255</span>, <span class="n">0</span>, <span class="n">255</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  75</span>
<span class="number">  76</span>   <a href="http://www.allegro.cc/manual/al_set_target_bitmap"><span class="a">al_set_target_bitmap</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/al_get_backbuffer"><span class="a">al_get_backbuffer</span></a><span class="k2">(</span>display<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  77</span>
<span class="number">  78</span>   event_queue <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_event_queue"><span class="a">al_create_event_queue</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  79</span>
<span class="number">  80</span>   <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>event_queue<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  81</span>      <a href="http://www.delorie.com/djgpp/doc/libc/libc_345.html" target="_blank">fprintf</a><span class="k2">(</span>stderr, <span class="s">"failed to create event_queue!\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  82</span>      <a href="http://www.allegro.cc/manual/al_destroy_bitmap"><span class="a">al_destroy_bitmap</span></a><span class="k2">(</span>bouncer<span class="k2">)</span><span class="k2">;</span>
<span class="number">  83</span>      <a href="http://www.allegro.cc/manual/al_destroy_display"><span class="a">al_destroy_display</span></a><span class="k2">(</span>display<span class="k2">)</span><span class="k2">;</span>
<span class="number">  84</span>      <a href="http://www.allegro.cc/manual/al_destroy_timer"><span class="a">al_destroy_timer</span></a><span class="k2">(</span>timer<span class="k2">)</span><span class="k2">;</span>
<span class="number">  85</span>      <span class="k1">return</span> <span class="k3">-</span><span class="n">1</span><span class="k2">;</span>
<span class="number">  86</span>   <span class="k2">}</span>
<span class="number">  87</span>
<span class="number">  88</span>   <a href="http://www.allegro.cc/manual/al_register_event_source"><span class="a">al_register_event_source</span></a><span class="k2">(</span>event_queue, <a href="http://www.allegro.cc/manual/al_get_display_event_source"><span class="a">al_get_display_event_source</span></a><span class="k2">(</span>display<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  89</span>   <a href="http://www.allegro.cc/manual/al_register_event_source"><span class="a">al_register_event_source</span></a><span class="k2">(</span>event_queue, <a href="http://www.allegro.cc/manual/al_get_timer_event_source"><span class="a">al_get_timer_event_source</span></a><span class="k2">(</span>timer<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  90</span>   <a href="http://www.allegro.cc/manual/al_register_event_source"><span class="a">al_register_event_source</span></a><span class="k2">(</span>event_queue, <a href="http://www.allegro.cc/manual/al_get_mouse_event_source"><span class="a">al_get_mouse_event_source</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  91</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">  92</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">  93</span>   <a href="http://www.allegro.cc/manual/al_start_timer"><span class="a">al_start_timer</span></a><span class="k2">(</span>timer<span class="k2">)</span><span class="k2">;</span>
<span class="number">  94</span>
<span class="number">  95</span>   mutex <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_mutex"><span class="a">al_create_mutex</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  96</span>
<span class="number">  97</span>   thread_1 <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_thread"><span class="a">al_create_thread</span></a><span class="k2">(</span>Func_Thread, <span class="k3">&amp;</span>data<span class="k2">)</span><span class="k2">;</span>
<span class="number">  98</span>   <a href="http://www.allegro.cc/manual/al_start_thread"><span class="a">al_start_thread</span></a><span class="k2">(</span>thread_1<span class="k2">)</span><span class="k2">;</span>
<span class="number">  99</span>
<span class="number"> 100</span>   <a href="http://www.allegro.cc/manual/al_rest"><span class="a">al_rest</span></a><span class="k2">(</span><span class="n">1</span><span class="k2">)</span><span class="k2">;</span> <span class="c">//Why without this doesn't work?</span>
<span class="number"> 101</span>
<span class="number"> 102</span>   <a href="http://www.allegro.cc/manual/al_lock_mutex"><span class="a">al_lock_mutex</span></a><span class="k2">(</span>mutex<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 103</span>   data.modi_X <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 104</span>   <a href="http://www.allegro.cc/manual/al_unlock_mutex"><span class="a">al_unlock_mutex</span></a><span class="k2">(</span>mutex<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 105</span>
<span class="number"> 106</span>
<span class="number"> 107</span>   thread_2 <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_thread"><span class="a">al_create_thread</span></a><span class="k2">(</span>Func_Thread, <span class="k3">&amp;</span>data<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 108</span>   <a href="http://www.allegro.cc/manual/al_start_thread"><span class="a">al_start_thread</span></a><span class="k2">(</span>thread_2<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 109</span>
<span class="number"> 110</span>
<span class="number"> 111</span>   <span class="k1">while</span><span class="k2">(</span><span class="n">1</span><span class="k2">)</span>
<span class="number"> 112</span>   <span class="k2">{</span>
<span class="number"> 113</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"> 114</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>event_queue, <span class="k3">&amp;</span>ev<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 115</span>
<span class="number"> 116</span>      <span class="k1">if</span><span class="k2">(</span>ev.type <span class="k3">=</span><span class="k3">=</span> ALLEGRO_EVENT_TIMER<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 117</span>         redraw <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 118</span>      <span class="k2">}</span>
<span class="number"> 119</span>      <span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span>ev.type <span class="k3">=</span><span class="k3">=</span> ALLEGRO_EVENT_DISPLAY_CLOSE<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 120</span>         <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 121</span>      <span class="k2">}</span>
<span class="number"> 122</span>      <span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span>ev.type <span class="k3">=</span><span class="k3">=</span> ALLEGRO_EVENT_MOUSE_BUTTON_DOWN<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 123</span>         Beep<span class="k2">(</span><span class="n">500</span>,<span class="n">20</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 124</span>      <span class="k2">}</span>
<span class="number"> 125</span>      <span class="k1">if</span><span class="k2">(</span>redraw <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>event_queue<span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 126</span>         redraw <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 127</span>
<span class="number"> 128</span>         <span class="c">//al_clear_to_color(al_map_rgb(0,0,0));</span>
<span class="number"> 129</span>
<span class="number"> 130</span>         <a href="http://www.allegro.cc/manual/al_lock_mutex"><span class="a">al_lock_mutex</span></a><span class="k2">(</span>mutex<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 131</span>         <a href="http://www.allegro.cc/manual/al_draw_bitmap"><span class="a">al_draw_bitmap</span></a><span class="k2">(</span>bouncer, data.posiX, data.posiY, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 132</span>         <a href="http://www.allegro.cc/manual/al_unlock_mutex"><span class="a">al_unlock_mutex</span></a><span class="k2">(</span>mutex<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 133</span>
<span class="number"> 134</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"> 135</span>      <span class="k2">}</span>
<span class="number"> 136</span>   <span class="k2">}</span>
<span class="number"> 137</span>
<span class="number"> 138</span>   <a href="http://www.allegro.cc/manual/al_destroy_bitmap"><span class="a">al_destroy_bitmap</span></a><span class="k2">(</span>bouncer<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 139</span>   <a href="http://www.allegro.cc/manual/al_destroy_timer"><span class="a">al_destroy_timer</span></a><span class="k2">(</span>timer<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 140</span>   <a href="http://www.allegro.cc/manual/al_destroy_display"><span class="a">al_destroy_display</span></a><span class="k2">(</span>display<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 141</span>   <a href="http://www.allegro.cc/manual/al_destroy_event_queue"><span class="a">al_destroy_event_queue</span></a><span class="k2">(</span>event_queue<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 142</span>
<span class="number"> 143</span>   <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 144</span><span class="k2">}</span>
<span class="number"> 145</span>
<span class="number"> 146</span>   <span class="k1">static</span> <span class="k1">void</span> <span class="k3">*</span>Func_Thread<span class="k2">(</span><a href="http://www.allegro.cc/manual/ALLEGRO_THREAD"><span class="a">ALLEGRO_THREAD</span></a> <span class="k3">*</span>thr, <span class="k1">void</span> <span class="k3">*</span>arg<span class="k2">)</span><span class="k2">{</span>
<span class="number"> 147</span>
<span class="number"> 148</span>   <a href="http://www.allegro.cc/manual/ALLEGRO_MUTEX"><span class="a">ALLEGRO_MUTEX</span></a> <span class="k3">*</span>mutex<span class="k2">;</span>
<span class="number"> 149</span>   mutex       <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_mutex"><span class="a">al_create_mutex</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 150</span>
<span class="number"> 151</span>   DATA <span class="k3">*</span>data  <span class="k3">=</span> <span class="k2">(</span>DATA<span class="k3">*</span><span class="k2">)</span> arg<span class="k2">;</span>
<span class="number"> 152</span>
<span class="number"> 153</span>   <span class="k1">float</span> num   <span class="k3">=</span> <span class="n">0</span>.<span class="n">1</span><span class="k2">;</span>
<span class="number"> 154</span>   <span class="k1">bool</span> modi_X <span class="k3">=</span> data-&gt;modi_X<span class="k2">;</span>
<span class="number"> 155</span>
<span class="number"> 156</span>
<span class="number"> 157</span>
<span class="number"> 158</span>   <span class="k1">while</span><span class="k2">(</span><span class="n">1</span><span class="k2">)</span><span class="k2">{</span>
<span class="number"> 159</span>
<span class="number"> 160</span>      <a href="http://www.allegro.cc/manual/al_lock_mutex"><span class="a">al_lock_mutex</span></a><span class="k2">(</span>mutex<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 161</span>
<span class="number"> 162</span>      <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>modi_X<span class="k2">)</span>
<span class="number"> 163</span>         data-&gt;posiX <span class="k3">+</span><span class="k3">=</span> num<span class="k2">;</span>
<span class="number"> 164</span>      <span class="k1">else</span>
<span class="number"> 165</span>         data-&gt;posiY <span class="k3">+</span><span class="k3">=</span> num<span class="k2">;</span>
<span class="number"> 166</span>
<span class="number"> 167</span>      <a href="http://www.allegro.cc/manual/al_rest"><span class="a">al_rest</span></a><span class="k2">(</span><span class="n">0</span>.<span class="n">01</span><span class="k2">)</span><span class="k2">;</span> <span class="c">// If I don't use this, I'm not seeing the image because I'm adding 'num' too fast?</span>
<span class="number"> 168</span>
<span class="number"> 169</span>      <a href="http://www.allegro.cc/manual/al_unlock_mutex"><span class="a">al_unlock_mutex</span></a><span class="k2">(</span>mutex<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 170</span>   <span class="k2">}</span>
<span class="number"> 171</span>
<span class="number"> 172</span>
<span class="number"> 173</span>   <span class="k1">return</span> NULL<span class="k2">;</span>
<span class="number"> 174</span>   <span class="k2">}</span>
</div></div><p>

Well, there are some comments on the source about things that I can&#39;t understand, all the thread thing it&#39;s very new for me but I think it&#39;s incredible powerful. </p><p>I was also trying to add the feature, to allow the user to start or stop the movement of the bitmap, but I think I need conditionals, because suppose that I have a <span class="source-code"><span class="k1">bool</span></span> called <span class="source-code">run</span> inside <span class="source-code">DATA</span> I can&#39;t do something like this:</p><div class="source-code snippet"><div class="inner"><pre>
<span class="k1">while</span><span class="k2">(</span>data-&gt;run<span class="k2">)</span><span class="k2">{</span>

      <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>modi_X<span class="k2">)</span>
         data-&gt;posiX <span class="k3">+</span><span class="k3">=</span> num<span class="k2">;</span>
      <span class="k1">else</span>
         data-&gt;posiY <span class="k3">+</span><span class="k3">=</span> num<span class="k2">;</span>

<span class="k2">}</span>
</pre></div></div><p> <br />It doesn&#39;t do anything, it&#39;s like the thread thinks run still being false, even when I&#39;m changing it outside the thread (<span class="source-code">data.run <span class="k3">=</span> <span class="k1">true</span></span>).</p><p>So for easy answers:</p><p><b>1)</b> So in the first code comment when I said &quot;<span class="source-code"><span class="c">//Why without this doesn't work?</span></span>&quot; why is that happening? why without <span class="source-code"><a href="http://www.allegro.cc/manual/al_rest"><span class="a">al_rest</span></a><span class="k2">(</span><span class="k2">)</span></span> the data info is sent incorrectly? it&#39;s because takes more time to change <span class="source-code">data.modi_X <span class="k3">=</span> <span class="k1">true</span></span> than create a new thread, so the new thread receive the old data?</p><p><b>2)</b> In the second comment &quot;<span class="source-code"><span class="c">//If I don't use this, I'm not seeing the image because I'm adding 'num' too fast?</span></span>&quot; I guess that is because even before allegro create the windows this thread is created and the <span class="source-code">num</span> variable increase its value too fast? and why if instead of add 0.1 I add 0.000001 and delete the <span class="source-code"><a href="http://www.allegro.cc/manual/al_rest"><span class="a">al_rest</span></a><span class="k2">(</span><span class="k2">)</span></span> line just works for some steps and then do nothing?</p><p><b>3)</b> Can I call <span class="source-code"><a href="http://www.allegro.cc/manual/al_destroy_thread"><span class="a">al_destroy_thread</span></a><span class="k2">(</span><span class="k2">)</span></span> inside the same thread? I&#39;m using that in my code (not this one, here I&#39;m not destroying the threads yet) but I don&#39;t know if is doing something... I have no error.</p><p><b>4)</b> To check if a <span class="source-code"><span class="k1">struct</span></span> or <span class="source-code"><span class="k1">class</span></span> variable has change do I need to use conditionals?</p><p>Damn, this looks like a FAQ... <img src="http://www.allegro.cc/forums/smileys/undecided.gif" alt=":-/" /><br />Well this is all... For now.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (AMCerasoli)</author>
		<pubDate>Wed, 25 May 2011 03:30:04 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Just a couple of things quickly:</p><ul><li><p>The mutex must be pointing to the same object in order for it to work. So the mutex should be a member of the DATA class.</p><br /></li><li><p>The thread function checks <span class="source-code"><a href="http://www.allegro.cc/manual/al_get_thread_should_stop"><span class="a">al_get_thread_should_stop</span></a><span class="k2">(</span><span class="k2">)</span></span> inside its loop. If that is true, then it gracefully returns out as soon as it can. The outer function that created the thread is responsible for destroying it.
</p></li></ul></div>]]>
		</description>
		<author>no-reply@allegro.cc (Matthew Leverton)</author>
		<pubDate>Wed, 25 May 2011 03:35:35 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p><span class="source-code"><span class="k1">volatile</span></span>?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (weapon_S)</author>
		<pubDate>Wed, 25 May 2011 10:12:22 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>The &#39;volatile&#39; keyword simply means the compiler shouldn&#39;t optimize code that uses that variable, for instance the timer tick, the compiler could just load a copy into eax and wait forever to see if it changes all by itself (and the timer thread could hardly be expected to do that).
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Arthur Kalliokoski)</author>
		<pubDate>Wed, 25 May 2011 10:15:51 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Ok ,I have modified the code:</p><p>Now I&#39;m destroying the thread at the end of the program, and initializing mutex inside the class data. But most of my questions still there, though.</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="p">#include &lt;stdio.h&gt;</span>
<span class="number">   2</span><span class="p">#include &lt;iostream&gt;</span>
<span class="number">   3</span><span class="p">#include &lt;allegro5/allegro.h&gt;</span>
<span class="number">   4</span>
<span class="number">   5</span><span class="k1">class</span> DATA<span class="k2">{</span>
<span class="number">   6</span>
<span class="number">   7</span>   public:
<span class="number">   8</span>   <a href="http://www.allegro.cc/manual/ALLEGRO_MUTEX"><span class="a">ALLEGRO_MUTEX</span></a> <span class="k3">*</span>mutex<span class="k2">;</span>
<span class="number">   9</span>   <span class="k1">float</span>          posiX<span class="k2">;</span>
<span class="number">  10</span>   <span class="k1">float</span>          posiY<span class="k2">;</span>
<span class="number">  11</span>   <span class="k1">bool</span>           modi_X<span class="k2">;</span>
<span class="number">  12</span>
<span class="number">  13</span>   DATA<span class="k2">(</span><span class="k2">)</span><span class="k2">{</span>
<span class="number">  14</span>
<span class="number">  15</span>   mutex  <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_mutex"><span class="a">al_create_mutex</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  16</span>   posiX  <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number">  17</span>   posiY  <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number">  18</span>   modi_X <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number">  19</span>
<span class="number">  20</span>   <span class="k2">}</span>
<span class="number">  21</span>
<span class="number">  22</span><span class="k2">}</span>data<span class="k2">;</span>
<span class="number">  23</span>
<span class="number">  24</span><span class="k1">const</span> <span class="k1">float</span> FPS        <span class="k3">=</span> <span class="n">60</span><span class="k2">;</span>
<span class="number">  25</span><span class="k1">const</span> <span class="k1">int</span> <a href="http://www.allegro.cc/manual/SCREEN_W"><span class="a">SCREEN_W</span></a>     <span class="k3">=</span> <span class="n">640</span><span class="k2">;</span>
<span class="number">  26</span><span class="k1">const</span> <span class="k1">int</span> <a href="http://www.allegro.cc/manual/SCREEN_H"><span class="a">SCREEN_H</span></a>     <span class="k3">=</span> <span class="n">480</span><span class="k2">;</span>
<span class="number">  27</span><span class="k1">const</span> <span class="k1">int</span> BOUNCER_SIZE <span class="k3">=</span> <span class="n">32</span><span class="k2">;</span>
<span class="number">  28</span>
<span class="number">  29</span><span class="k1">static</span> <span class="k1">void</span> <span class="k3">*</span>Func_Thread<span class="k2">(</span><a href="http://www.allegro.cc/manual/ALLEGRO_THREAD"><span class="a">ALLEGRO_THREAD</span></a> <span class="k3">*</span>thr, <span class="k1">void</span> <span class="k3">*</span>arg<span class="k2">)</span><span class="k2">;</span>
<span class="number">  30</span>
<span class="number">  31</span><span class="k1">int</span> main<span class="k2">(</span><span class="k1">int</span> argc, <span class="k1">char</span> <span class="k3">*</span><span class="k3">*</span>argv<span class="k2">)</span>
<span class="number">  32</span><span class="k2">{</span>
<span class="number">  33</span>   <a href="http://www.allegro.cc/manual/ALLEGRO_DISPLAY"><span class="a">ALLEGRO_DISPLAY</span></a>     <span class="k3">*</span>display     <span class="k3">=</span> NULL<span class="k2">;</span>
<span class="number">  34</span>   <a href="http://www.allegro.cc/manual/ALLEGRO_EVENT_QUEUE"><span class="a">ALLEGRO_EVENT_QUEUE</span></a> <span class="k3">*</span>event_queue <span class="k3">=</span> NULL<span class="k2">;</span>
<span class="number">  35</span>   <a href="http://www.allegro.cc/manual/ALLEGRO_TIMER"><span class="a">ALLEGRO_TIMER</span></a>       <span class="k3">*</span>timer       <span class="k3">=</span> NULL<span class="k2">;</span>
<span class="number">  36</span>   <a href="http://www.allegro.cc/manual/ALLEGRO_BITMAP"><span class="a">ALLEGRO_BITMAP</span></a>      <span class="k3">*</span>bouncer     <span class="k3">=</span> NULL<span class="k2">;</span>
<span class="number">  37</span>   <a href="http://www.allegro.cc/manual/ALLEGRO_THREAD"><span class="a">ALLEGRO_THREAD</span></a>      <span class="k3">*</span>thread_1    <span class="k3">=</span> NULL<span class="k2">;</span>
<span class="number">  38</span>   <a href="http://www.allegro.cc/manual/ALLEGRO_THREAD"><span class="a">ALLEGRO_THREAD</span></a>      <span class="k3">*</span>thread_2    <span class="k3">=</span> NULL<span class="k2">;</span>
<span class="number">  39</span>
<span class="number">  40</span>   <span class="k1">bool</span> redraw <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number">  41</span>
<span class="number">  42</span>   <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span><a href="http://www.allegro.cc/manual/al_init"><span class="a">al_init</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number">  43</span>      <a href="http://www.delorie.com/djgpp/doc/libc/libc_345.html" target="_blank">fprintf</a><span class="k2">(</span>stderr, <span class="s">"failed to initialize allegro!\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  44</span>      <span class="k1">return</span> <span class="k3">-</span><span class="n">1</span><span class="k2">;</span>
<span class="number">  45</span>   <span class="k2">}</span>
<span class="number">  46</span>
<span class="number">  47</span>   <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span><a href="http://www.allegro.cc/manual/al_install_mouse"><span class="a">al_install_mouse</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number">  48</span>      <a href="http://www.delorie.com/djgpp/doc/libc/libc_345.html" target="_blank">fprintf</a><span class="k2">(</span>stderr, <span class="s">"failed to initialize the mouse!\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  49</span>      <span class="k1">return</span> <span class="k3">-</span><span class="n">1</span><span class="k2">;</span>
<span class="number">  50</span>   <span class="k2">}</span>
<span class="number">  51</span>
<span class="number">  52</span>   timer <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_timer"><span class="a">al_create_timer</span></a><span class="k2">(</span><span class="n">1</span>.<span class="n">0</span> <span class="k3">/</span> FPS<span class="k2">)</span><span class="k2">;</span>
<span class="number">  53</span>   <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>timer<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  54</span>      <a href="http://www.delorie.com/djgpp/doc/libc/libc_345.html" target="_blank">fprintf</a><span class="k2">(</span>stderr, <span class="s">"failed to create timer!\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  55</span>      <span class="k1">return</span> <span class="k3">-</span><span class="n">1</span><span class="k2">;</span>
<span class="number">  56</span>   <span class="k2">}</span>
<span class="number">  57</span>
<span class="number">  58</span>   display <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_display"><span class="a">al_create_display</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/SCREEN_W"><span class="a">SCREEN_W</span></a>, <a href="http://www.allegro.cc/manual/SCREEN_H"><span class="a">SCREEN_H</span></a><span class="k2">)</span><span class="k2">;</span>
<span class="number">  59</span>   <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>display<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  60</span>      <a href="http://www.delorie.com/djgpp/doc/libc/libc_345.html" target="_blank">fprintf</a><span class="k2">(</span>stderr, <span class="s">"failed to create display!\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  61</span>      <a href="http://www.allegro.cc/manual/al_destroy_timer"><span class="a">al_destroy_timer</span></a><span class="k2">(</span>timer<span class="k2">)</span><span class="k2">;</span>
<span class="number">  62</span>      <span class="k1">return</span> <span class="k3">-</span><span class="n">1</span><span class="k2">;</span>
<span class="number">  63</span>   <span class="k2">}</span>
<span class="number">  64</span>
<span class="number">  65</span>   bouncer <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_bitmap"><span class="a">al_create_bitmap</span></a><span class="k2">(</span>BOUNCER_SIZE, BOUNCER_SIZE<span class="k2">)</span><span class="k2">;</span>
<span class="number">  66</span>   <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>bouncer<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  67</span>      <a href="http://www.delorie.com/djgpp/doc/libc/libc_345.html" target="_blank">fprintf</a><span class="k2">(</span>stderr, <span class="s">"failed to create bouncer bitmap!\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  68</span>      <a href="http://www.allegro.cc/manual/al_destroy_display"><span class="a">al_destroy_display</span></a><span class="k2">(</span>display<span class="k2">)</span><span class="k2">;</span>
<span class="number">  69</span>      <a href="http://www.allegro.cc/manual/al_destroy_timer"><span class="a">al_destroy_timer</span></a><span class="k2">(</span>timer<span class="k2">)</span><span class="k2">;</span>
<span class="number">  70</span>      <span class="k1">return</span> <span class="k3">-</span><span class="n">1</span><span class="k2">;</span>
<span class="number">  71</span>   <span class="k2">}</span>
<span class="number">  72</span>
<span class="number">  73</span>   <a href="http://www.allegro.cc/manual/al_set_target_bitmap"><span class="a">al_set_target_bitmap</span></a><span class="k2">(</span>bouncer<span class="k2">)</span><span class="k2">;</span>
<span class="number">  74</span>
<span class="number">  75</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">255</span>, <span class="n">0</span>, <span class="n">255</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  76</span>
<span class="number">  77</span>   <a href="http://www.allegro.cc/manual/al_set_target_bitmap"><span class="a">al_set_target_bitmap</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/al_get_backbuffer"><span class="a">al_get_backbuffer</span></a><span class="k2">(</span>display<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  78</span>
<span class="number">  79</span>   event_queue <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_event_queue"><span class="a">al_create_event_queue</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  80</span>
<span class="number">  81</span>   <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>event_queue<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  82</span>      <a href="http://www.delorie.com/djgpp/doc/libc/libc_345.html" target="_blank">fprintf</a><span class="k2">(</span>stderr, <span class="s">"failed to create event_queue!\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  83</span>      <a href="http://www.allegro.cc/manual/al_destroy_bitmap"><span class="a">al_destroy_bitmap</span></a><span class="k2">(</span>bouncer<span class="k2">)</span><span class="k2">;</span>
<span class="number">  84</span>      <a href="http://www.allegro.cc/manual/al_destroy_display"><span class="a">al_destroy_display</span></a><span class="k2">(</span>display<span class="k2">)</span><span class="k2">;</span>
<span class="number">  85</span>      <a href="http://www.allegro.cc/manual/al_destroy_timer"><span class="a">al_destroy_timer</span></a><span class="k2">(</span>timer<span class="k2">)</span><span class="k2">;</span>
<span class="number">  86</span>      <span class="k1">return</span> <span class="k3">-</span><span class="n">1</span><span class="k2">;</span>
<span class="number">  87</span>   <span class="k2">}</span>
<span class="number">  88</span>
<span class="number">  89</span>   <a href="http://www.allegro.cc/manual/al_register_event_source"><span class="a">al_register_event_source</span></a><span class="k2">(</span>event_queue, <a href="http://www.allegro.cc/manual/al_get_display_event_source"><span class="a">al_get_display_event_source</span></a><span class="k2">(</span>display<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  90</span>   <a href="http://www.allegro.cc/manual/al_register_event_source"><span class="a">al_register_event_source</span></a><span class="k2">(</span>event_queue, <a href="http://www.allegro.cc/manual/al_get_timer_event_source"><span class="a">al_get_timer_event_source</span></a><span class="k2">(</span>timer<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  91</span>   <a href="http://www.allegro.cc/manual/al_register_event_source"><span class="a">al_register_event_source</span></a><span class="k2">(</span>event_queue, <a href="http://www.allegro.cc/manual/al_get_mouse_event_source"><span class="a">al_get_mouse_event_source</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  92</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">  93</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">  94</span>   <a href="http://www.allegro.cc/manual/al_start_timer"><span class="a">al_start_timer</span></a><span class="k2">(</span>timer<span class="k2">)</span><span class="k2">;</span>
<span class="number">  95</span>
<span class="number">  96</span>   thread_1 <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_thread"><span class="a">al_create_thread</span></a><span class="k2">(</span>Func_Thread, <span class="k3">&amp;</span>data<span class="k2">)</span><span class="k2">;</span>
<span class="number">  97</span>   <a href="http://www.allegro.cc/manual/al_start_thread"><span class="a">al_start_thread</span></a><span class="k2">(</span>thread_1<span class="k2">)</span><span class="k2">;</span>
<span class="number">  98</span>
<span class="number">  99</span>   <a href="http://www.allegro.cc/manual/al_rest"><span class="a">al_rest</span></a><span class="k2">(</span><span class="n">1</span><span class="k2">)</span><span class="k2">;</span> <span class="c">//Why without this doesn't work?</span>
<span class="number"> 100</span>
<span class="number"> 101</span>   <a href="http://www.allegro.cc/manual/al_lock_mutex"><span class="a">al_lock_mutex</span></a><span class="k2">(</span>data.mutex<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 102</span>   data.modi_X <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 103</span>   <a href="http://www.allegro.cc/manual/al_unlock_mutex"><span class="a">al_unlock_mutex</span></a><span class="k2">(</span>data.mutex<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 104</span>
<span class="number"> 105</span>
<span class="number"> 106</span>   thread_2 <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_thread"><span class="a">al_create_thread</span></a><span class="k2">(</span>Func_Thread, <span class="k3">&amp;</span>data<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 107</span>   <a href="http://www.allegro.cc/manual/al_start_thread"><span class="a">al_start_thread</span></a><span class="k2">(</span>thread_2<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 108</span>
<span class="number"> 109</span>
<span class="number"> 110</span>   <span class="k1">while</span><span class="k2">(</span><span class="n">1</span><span class="k2">)</span>
<span class="number"> 111</span>   <span class="k2">{</span>
<span class="number"> 112</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"> 113</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>event_queue, <span class="k3">&amp;</span>ev<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 114</span>
<span class="number"> 115</span>      <span class="k1">if</span><span class="k2">(</span>ev.type <span class="k3">=</span><span class="k3">=</span> ALLEGRO_EVENT_TIMER<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 116</span>         redraw <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 117</span>      <span class="k2">}</span>
<span class="number"> 118</span>      <span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span>ev.type <span class="k3">=</span><span class="k3">=</span> ALLEGRO_EVENT_DISPLAY_CLOSE<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 119</span>         <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 120</span>      <span class="k2">}</span>
<span class="number"> 121</span>      <span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span>ev.type <span class="k3">=</span><span class="k3">=</span> ALLEGRO_EVENT_MOUSE_BUTTON_DOWN<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 122</span>         Beep<span class="k2">(</span><span class="n">500</span>,<span class="n">20</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 123</span>      <span class="k2">}</span>
<span class="number"> 124</span>      <span class="k1">if</span><span class="k2">(</span>redraw <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>event_queue<span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 125</span>         redraw <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 126</span>
<span class="number"> 127</span>         <span class="c">//al_clear_to_color(al_map_rgb(0,0,0));</span>
<span class="number"> 128</span>
<span class="number"> 129</span>         <a href="http://www.allegro.cc/manual/al_lock_mutex"><span class="a">al_lock_mutex</span></a><span class="k2">(</span>data.mutex<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 130</span>         <a href="http://www.allegro.cc/manual/al_draw_bitmap"><span class="a">al_draw_bitmap</span></a><span class="k2">(</span>bouncer, data.posiX, data.posiY, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 131</span>         <a href="http://www.allegro.cc/manual/al_unlock_mutex"><span class="a">al_unlock_mutex</span></a><span class="k2">(</span>data.mutex<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 132</span>
<span class="number"> 133</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"> 134</span>      <span class="k2">}</span>
<span class="number"> 135</span>   <span class="k2">}</span>
<span class="number"> 136</span>   <a href="http://www.allegro.cc/manual/al_destroy_thread"><span class="a">al_destroy_thread</span></a><span class="k2">(</span>thread_1<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 137</span>   <a href="http://www.allegro.cc/manual/al_destroy_thread"><span class="a">al_destroy_thread</span></a><span class="k2">(</span>thread_2<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 138</span>
<span class="number"> 139</span>   <a href="http://www.allegro.cc/manual/al_destroy_bitmap"><span class="a">al_destroy_bitmap</span></a><span class="k2">(</span>bouncer<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 140</span>   <a href="http://www.allegro.cc/manual/al_destroy_timer"><span class="a">al_destroy_timer</span></a><span class="k2">(</span>timer<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 141</span>   <a href="http://www.allegro.cc/manual/al_destroy_display"><span class="a">al_destroy_display</span></a><span class="k2">(</span>display<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 142</span>   <a href="http://www.allegro.cc/manual/al_destroy_event_queue"><span class="a">al_destroy_event_queue</span></a><span class="k2">(</span>event_queue<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 143</span>
<span class="number"> 144</span>   <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 145</span><span class="k2">}</span>
<span class="number"> 146</span>
<span class="number"> 147</span>   <span class="k1">static</span> <span class="k1">void</span> <span class="k3">*</span>Func_Thread<span class="k2">(</span><a href="http://www.allegro.cc/manual/ALLEGRO_THREAD"><span class="a">ALLEGRO_THREAD</span></a> <span class="k3">*</span>thr, <span class="k1">void</span> <span class="k3">*</span>arg<span class="k2">)</span><span class="k2">{</span>
<span class="number"> 148</span>
<span class="number"> 149</span>   DATA <span class="k3">*</span>data  <span class="k3">=</span> <span class="k2">(</span>DATA<span class="k3">*</span><span class="k2">)</span> arg<span class="k2">;</span>
<span class="number"> 150</span>
<span class="number"> 151</span>   <span class="k1">float</span> num   <span class="k3">=</span> <span class="n">0</span>.<span class="n">1</span><span class="k2">;</span>
<span class="number"> 152</span>   <span class="k1">bool</span> modi_X <span class="k3">=</span> data-&gt;modi_X<span class="k2">;</span>
<span class="number"> 153</span>
<span class="number"> 154</span>   <span class="k1">while</span><span class="k2">(</span><span class="k3">!</span><a href="http://www.allegro.cc/manual/al_get_thread_should_stop"><span class="a">al_get_thread_should_stop</span></a><span class="k2">(</span>thr<span class="k2">)</span><span class="k2">)</span><span class="k2">{</span>
<span class="number"> 155</span>
<span class="number"> 156</span>      <a href="http://www.allegro.cc/manual/al_lock_mutex"><span class="a">al_lock_mutex</span></a><span class="k2">(</span>data-&gt;mutex<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 157</span>
<span class="number"> 158</span>      <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>modi_X<span class="k2">)</span>
<span class="number"> 159</span>         data-&gt;posiX <span class="k3">+</span><span class="k3">=</span> num<span class="k2">;</span>
<span class="number"> 160</span>      <span class="k1">else</span>
<span class="number"> 161</span>         data-&gt;posiY <span class="k3">+</span><span class="k3">=</span> num<span class="k2">;</span>
<span class="number"> 162</span>
<span class="number"> 163</span>      <a href="http://www.allegro.cc/manual/al_rest"><span class="a">al_rest</span></a><span class="k2">(</span><span class="n">0</span>.<span class="n">01</span><span class="k2">)</span><span class="k2">;</span> <span class="c">// If I don't use this, I'm not seeing the image because I'm adding 'num' too fast?</span>
<span class="number"> 164</span>
<span class="number"> 165</span>      <a href="http://www.allegro.cc/manual/al_unlock_mutex"><span class="a">al_unlock_mutex</span></a><span class="k2">(</span>data-&gt;mutex<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 166</span>   <span class="k2">}</span>
<span class="number"> 167</span>
<span class="number"> 168</span>
<span class="number"> 169</span>   <span class="k1">return</span> NULL<span class="k2">;</span>
<span class="number"> 170</span>   <span class="k2">}</span>
</div></div><p>

Here are some Images about what happens on different processors:</p><p>AMD Turion 64X2 (2 processors)<br /><span class="remote-thumbnail"><span class="json">{"name":"604160","src":"\/\/djungxnpq2nug.cloudfront.net\/image\/cache\/a\/5\/a57ec36cccc29065e694a03571e4b156.png","w":636,"h":481,"tn":"\/\/djungxnpq2nug.cloudfront.net\/image\/cache\/a\/5\/a57ec36cccc29065e694a03571e4b156"}</span><img src="http://www.allegro.cc//djungxnpq2nug.cloudfront.net/image/cache/a/5/a57ec36cccc29065e694a03571e4b156-240.jpg" alt="604160" width="240" height="181" /></span></p><p>Intel P4 (1 processor)<br /><span class="remote-thumbnail"><span class="json">{"name":"604162g","src":"\/\/djungxnpq2nug.cloudfront.net\/image\/cache\/1\/6\/169e967e5502215a8f2ab750b7f9ea57.png","w":633,"h":478,"tn":"\/\/djungxnpq2nug.cloudfront.net\/image\/cache\/1\/6\/169e967e5502215a8f2ab750b7f9ea57"}</span><img src="http://www.allegro.cc//djungxnpq2nug.cloudfront.net/image/cache/1/6/169e967e5502215a8f2ab750b7f9ea57-240.jpg" alt="604162g" width="240" height="181" /></span>	</p><p>Intel Atom N450 (1 processor, and 2 threads? that is what says the webpage)<br /><span class="remote-thumbnail"><span class="json">{"name":"604161","src":"\/\/djungxnpq2nug.cloudfront.net\/image\/cache\/c\/4\/c4e854283698a1c85714a39f52af37c7.png","w":632,"h":472,"tn":"\/\/djungxnpq2nug.cloudfront.net\/image\/cache\/c\/4\/c4e854283698a1c85714a39f52af37c7"}</span><img src="http://www.allegro.cc//djungxnpq2nug.cloudfront.net/image/cache/c/4/c4e854283698a1c85714a39f52af37c7-240.jpg" alt="604161" width="240" height="179" /></span>	</p><p>I&#39;m still thinking why I&#39;m getting those results.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (AMCerasoli)</author>
		<pubDate>Wed, 25 May 2011 15:42:45 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>You can&#39;t create your <i>data</i> object before main() because Allegro functions (like al_create_mutex) must not be called before al_init.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Elias)</author>
		<pubDate>Wed, 25 May 2011 15:47:40 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>First of all I&#39;m using this as an excuse to look into threading ( I don&#39;t know <span class="cuss"><span><span class="cuss"><span>shit</span></span></span></span> <img src="http://www.allegro.cc/forums/smileys/grin.gif" alt=";D" /> )
</p><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/607420/918823#target">AMCerasoli</a> said:</div><div class="quote"><p>al_rest(1); //Why without this doesn&#39;t work?</p></div></div><p>
My guess: both threads will be set to modiX = true;
</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>al_rest(0.01); // If I don&#39;t use this, I&#39;m not seeing the image because I&#39;m adding &#39;num&#39; too fast?</p></div></div><p>
That comment seems very correct.</p><p>By the way, there is a nice optical illusion in the last one. (In fact it is not impossible).<br />I assume what you see here is the kind of unpredictability of threads you here about. (I.e. the windows(?) task scheduler.)<br />And maybe you want to unlock the mutex before resting in the threads.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (weapon_S)</author>
		<pubDate>Wed, 25 May 2011 16:27:03 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Damn! you hit the nail weapon_S!! I was overlooking that, now in all computers shows the same, like the P4 picture, Except if I open another program in which I can see a very little variation in the image.</p><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/607420/918876#target">weapon_S</a> said:</div><div class="quote"><p>
My guess: both threads will be set to modiX = true;
</p></div></div><p>

Yes I know that, the question is, why?</p><p>And my only answer is: because takes more time to change <span class="source-code">data.modi_X</span> to <span class="source-code"><span class="k1">true</span></span> than create a new thread, so the new thread receive the old data?</p><p>Here is the last update.</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="p">#include &lt;stdio.h&gt;</span>
<span class="number">   2</span><span class="p">#include &lt;iostream&gt;</span>
<span class="number">   3</span><span class="p">#include &lt;allegro5/allegro.h&gt;</span>
<span class="number">   4</span>
<span class="number">   5</span><span class="k1">class</span> DATA<span class="k2">{</span>
<span class="number">   6</span>
<span class="number">   7</span>   public:
<span class="number">   8</span>   <a href="http://www.allegro.cc/manual/ALLEGRO_MUTEX"><span class="a">ALLEGRO_MUTEX</span></a> <span class="k3">*</span>mutex<span class="k2">;</span>
<span class="number">   9</span>   <span class="k1">float</span>          posiX<span class="k2">;</span>
<span class="number">  10</span>   <span class="k1">float</span>          posiY<span class="k2">;</span>
<span class="number">  11</span>   <span class="k1">bool</span>           modi_X<span class="k2">;</span>
<span class="number">  12</span>
<span class="number">  13</span>   DATA<span class="k2">(</span><span class="k2">)</span><span class="k2">{</span>
<span class="number">  14</span>
<span class="number">  15</span>   mutex  <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_mutex"><span class="a">al_create_mutex</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  16</span>   posiX  <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number">  17</span>   posiY  <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number">  18</span>   modi_X <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number">  19</span>
<span class="number">  20</span>   <span class="k2">}</span>
<span class="number">  21</span>
<span class="number">  22</span><span class="k2">}</span><span class="k2">;</span>
<span class="number">  23</span>
<span class="number">  24</span><span class="k1">const</span> <span class="k1">float</span> FPS        <span class="k3">=</span> <span class="n">60</span><span class="k2">;</span>
<span class="number">  25</span><span class="k1">const</span> <span class="k1">int</span> <a href="http://www.allegro.cc/manual/SCREEN_W"><span class="a">SCREEN_W</span></a>     <span class="k3">=</span> <span class="n">640</span><span class="k2">;</span>
<span class="number">  26</span><span class="k1">const</span> <span class="k1">int</span> <a href="http://www.allegro.cc/manual/SCREEN_H"><span class="a">SCREEN_H</span></a>     <span class="k3">=</span> <span class="n">480</span><span class="k2">;</span>
<span class="number">  27</span><span class="k1">const</span> <span class="k1">int</span> BOUNCER_SIZE <span class="k3">=</span> <span class="n">32</span><span class="k2">;</span>
<span class="number">  28</span>
<span class="number">  29</span><span class="k1">static</span> <span class="k1">void</span> <span class="k3">*</span>Func_Thread<span class="k2">(</span><a href="http://www.allegro.cc/manual/ALLEGRO_THREAD"><span class="a">ALLEGRO_THREAD</span></a> <span class="k3">*</span>thr, <span class="k1">void</span> <span class="k3">*</span>arg<span class="k2">)</span><span class="k2">;</span>
<span class="number">  30</span>
<span class="number">  31</span><span class="k1">int</span> main<span class="k2">(</span><span class="k1">int</span> argc, <span class="k1">char</span> <span class="k3">*</span><span class="k3">*</span>argv<span class="k2">)</span>
<span class="number">  32</span><span class="k2">{</span>
<span class="number">  33</span>   <a href="http://www.allegro.cc/manual/ALLEGRO_DISPLAY"><span class="a">ALLEGRO_DISPLAY</span></a>     <span class="k3">*</span>display     <span class="k3">=</span> NULL<span class="k2">;</span>
<span class="number">  34</span>   <a href="http://www.allegro.cc/manual/ALLEGRO_EVENT_QUEUE"><span class="a">ALLEGRO_EVENT_QUEUE</span></a> <span class="k3">*</span>event_queue <span class="k3">=</span> NULL<span class="k2">;</span>
<span class="number">  35</span>   <a href="http://www.allegro.cc/manual/ALLEGRO_TIMER"><span class="a">ALLEGRO_TIMER</span></a>       <span class="k3">*</span>timer       <span class="k3">=</span> NULL<span class="k2">;</span>
<span class="number">  36</span>   <a href="http://www.allegro.cc/manual/ALLEGRO_BITMAP"><span class="a">ALLEGRO_BITMAP</span></a>      <span class="k3">*</span>bouncer     <span class="k3">=</span> NULL<span class="k2">;</span>
<span class="number">  37</span>   <a href="http://www.allegro.cc/manual/ALLEGRO_THREAD"><span class="a">ALLEGRO_THREAD</span></a>      <span class="k3">*</span>thread_1    <span class="k3">=</span> NULL<span class="k2">;</span>
<span class="number">  38</span>   <a href="http://www.allegro.cc/manual/ALLEGRO_THREAD"><span class="a">ALLEGRO_THREAD</span></a>      <span class="k3">*</span>thread_2    <span class="k3">=</span> NULL<span class="k2">;</span>
<span class="number">  39</span>
<span class="number">  40</span>   <span class="k1">bool</span> redraw <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number">  41</span>
<span class="number">  42</span>   <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span><a href="http://www.allegro.cc/manual/al_init"><span class="a">al_init</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number">  43</span>      <a href="http://www.delorie.com/djgpp/doc/libc/libc_345.html" target="_blank">fprintf</a><span class="k2">(</span>stderr, <span class="s">"failed to initialize allegro!\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  44</span>      <span class="k1">return</span> <span class="k3">-</span><span class="n">1</span><span class="k2">;</span>
<span class="number">  45</span>   <span class="k2">}</span>
<span class="number">  46</span>
<span class="number">  47</span>   <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span><a href="http://www.allegro.cc/manual/al_install_mouse"><span class="a">al_install_mouse</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number">  48</span>      <a href="http://www.delorie.com/djgpp/doc/libc/libc_345.html" target="_blank">fprintf</a><span class="k2">(</span>stderr, <span class="s">"failed to initialize the mouse!\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  49</span>      <span class="k1">return</span> <span class="k3">-</span><span class="n">1</span><span class="k2">;</span>
<span class="number">  50</span>   <span class="k2">}</span>
<span class="number">  51</span>
<span class="number">  52</span>   timer <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_timer"><span class="a">al_create_timer</span></a><span class="k2">(</span><span class="n">1</span>.<span class="n">0</span> <span class="k3">/</span> FPS<span class="k2">)</span><span class="k2">;</span>
<span class="number">  53</span>   <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>timer<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  54</span>      <a href="http://www.delorie.com/djgpp/doc/libc/libc_345.html" target="_blank">fprintf</a><span class="k2">(</span>stderr, <span class="s">"failed to create timer!\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  55</span>      <span class="k1">return</span> <span class="k3">-</span><span class="n">1</span><span class="k2">;</span>
<span class="number">  56</span>   <span class="k2">}</span>
<span class="number">  57</span>
<span class="number">  58</span>   display <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_display"><span class="a">al_create_display</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/SCREEN_W"><span class="a">SCREEN_W</span></a>, <a href="http://www.allegro.cc/manual/SCREEN_H"><span class="a">SCREEN_H</span></a><span class="k2">)</span><span class="k2">;</span>
<span class="number">  59</span>   <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>display<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  60</span>      <a href="http://www.delorie.com/djgpp/doc/libc/libc_345.html" target="_blank">fprintf</a><span class="k2">(</span>stderr, <span class="s">"failed to create display!\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  61</span>      <a href="http://www.allegro.cc/manual/al_destroy_timer"><span class="a">al_destroy_timer</span></a><span class="k2">(</span>timer<span class="k2">)</span><span class="k2">;</span>
<span class="number">  62</span>      <span class="k1">return</span> <span class="k3">-</span><span class="n">1</span><span class="k2">;</span>
<span class="number">  63</span>   <span class="k2">}</span>
<span class="number">  64</span>
<span class="number">  65</span>   bouncer <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_bitmap"><span class="a">al_create_bitmap</span></a><span class="k2">(</span>BOUNCER_SIZE, BOUNCER_SIZE<span class="k2">)</span><span class="k2">;</span>
<span class="number">  66</span>   <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>bouncer<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  67</span>      <a href="http://www.delorie.com/djgpp/doc/libc/libc_345.html" target="_blank">fprintf</a><span class="k2">(</span>stderr, <span class="s">"failed to create bouncer bitmap!\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  68</span>      <a href="http://www.allegro.cc/manual/al_destroy_display"><span class="a">al_destroy_display</span></a><span class="k2">(</span>display<span class="k2">)</span><span class="k2">;</span>
<span class="number">  69</span>      <a href="http://www.allegro.cc/manual/al_destroy_timer"><span class="a">al_destroy_timer</span></a><span class="k2">(</span>timer<span class="k2">)</span><span class="k2">;</span>
<span class="number">  70</span>      <span class="k1">return</span> <span class="k3">-</span><span class="n">1</span><span class="k2">;</span>
<span class="number">  71</span>   <span class="k2">}</span>
<span class="number">  72</span>
<span class="number">  73</span>   <a href="http://www.allegro.cc/manual/al_set_target_bitmap"><span class="a">al_set_target_bitmap</span></a><span class="k2">(</span>bouncer<span class="k2">)</span><span class="k2">;</span>
<span class="number">  74</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">255</span>, <span class="n">0</span>, <span class="n">255</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  75</span>   <a href="http://www.allegro.cc/manual/al_set_target_bitmap"><span class="a">al_set_target_bitmap</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/al_get_backbuffer"><span class="a">al_get_backbuffer</span></a><span class="k2">(</span>display<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  76</span>   event_queue <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_event_queue"><span class="a">al_create_event_queue</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  77</span>
<span class="number">  78</span>   <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>event_queue<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  79</span>      <a href="http://www.delorie.com/djgpp/doc/libc/libc_345.html" target="_blank">fprintf</a><span class="k2">(</span>stderr, <span class="s">"failed to create event_queue!\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  80</span>      <a href="http://www.allegro.cc/manual/al_destroy_bitmap"><span class="a">al_destroy_bitmap</span></a><span class="k2">(</span>bouncer<span class="k2">)</span><span class="k2">;</span>
<span class="number">  81</span>      <a href="http://www.allegro.cc/manual/al_destroy_display"><span class="a">al_destroy_display</span></a><span class="k2">(</span>display<span class="k2">)</span><span class="k2">;</span>
<span class="number">  82</span>      <a href="http://www.allegro.cc/manual/al_destroy_timer"><span class="a">al_destroy_timer</span></a><span class="k2">(</span>timer<span class="k2">)</span><span class="k2">;</span>
<span class="number">  83</span>      <span class="k1">return</span> <span class="k3">-</span><span class="n">1</span><span class="k2">;</span>
<span class="number">  84</span>   <span class="k2">}</span>
<span class="number">  85</span>
<span class="number">  86</span>   <a href="http://www.allegro.cc/manual/al_register_event_source"><span class="a">al_register_event_source</span></a><span class="k2">(</span>event_queue, <a href="http://www.allegro.cc/manual/al_get_display_event_source"><span class="a">al_get_display_event_source</span></a><span class="k2">(</span>display<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  87</span>   <a href="http://www.allegro.cc/manual/al_register_event_source"><span class="a">al_register_event_source</span></a><span class="k2">(</span>event_queue, <a href="http://www.allegro.cc/manual/al_get_timer_event_source"><span class="a">al_get_timer_event_source</span></a><span class="k2">(</span>timer<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  88</span>   <a href="http://www.allegro.cc/manual/al_register_event_source"><span class="a">al_register_event_source</span></a><span class="k2">(</span>event_queue, <a href="http://www.allegro.cc/manual/al_get_mouse_event_source"><span class="a">al_get_mouse_event_source</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  89</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">  90</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">  91</span>   <a href="http://www.allegro.cc/manual/al_start_timer"><span class="a">al_start_timer</span></a><span class="k2">(</span>timer<span class="k2">)</span><span class="k2">;</span>
<span class="number">  92</span>
<span class="number">  93</span>   DATA data<span class="k2">;</span>
<span class="number">  94</span>
<span class="number">  95</span>   thread_1 <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_thread"><span class="a">al_create_thread</span></a><span class="k2">(</span>Func_Thread, <span class="k3">&amp;</span>data<span class="k2">)</span><span class="k2">;</span>
<span class="number">  96</span>   <a href="http://www.allegro.cc/manual/al_start_thread"><span class="a">al_start_thread</span></a><span class="k2">(</span>thread_1<span class="k2">)</span><span class="k2">;</span>
<span class="number">  97</span>
<span class="number">  98</span>   <a href="http://www.allegro.cc/manual/al_rest"><span class="a">al_rest</span></a><span class="k2">(</span><span class="n">1</span><span class="k2">)</span><span class="k2">;</span> <span class="c">//Why without this doesn't work?</span>
<span class="number">  99</span>
<span class="number"> 100</span>   <a href="http://www.allegro.cc/manual/al_lock_mutex"><span class="a">al_lock_mutex</span></a><span class="k2">(</span>data.mutex<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 101</span>   data.modi_X <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 102</span>   <a href="http://www.allegro.cc/manual/al_unlock_mutex"><span class="a">al_unlock_mutex</span></a><span class="k2">(</span>data.mutex<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 103</span>
<span class="number"> 104</span>   thread_2 <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_thread"><span class="a">al_create_thread</span></a><span class="k2">(</span>Func_Thread, <span class="k3">&amp;</span>data<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 105</span>   <a href="http://www.allegro.cc/manual/al_start_thread"><span class="a">al_start_thread</span></a><span class="k2">(</span>thread_2<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 106</span>
<span class="number"> 107</span>
<span class="number"> 108</span>   <span class="k1">while</span><span class="k2">(</span><span class="n">1</span><span class="k2">)</span>
<span class="number"> 109</span>   <span class="k2">{</span>
<span class="number"> 110</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"> 111</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>event_queue, <span class="k3">&amp;</span>ev<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 112</span>
<span class="number"> 113</span>      <span class="k1">if</span><span class="k2">(</span>ev.type <span class="k3">=</span><span class="k3">=</span> ALLEGRO_EVENT_TIMER<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 114</span>         redraw <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 115</span>      <span class="k2">}</span>
<span class="number"> 116</span>      <span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span>ev.type <span class="k3">=</span><span class="k3">=</span> ALLEGRO_EVENT_DISPLAY_CLOSE<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 117</span>         <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 118</span>      <span class="k2">}</span>
<span class="number"> 119</span>      <span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span>ev.type <span class="k3">=</span><span class="k3">=</span> ALLEGRO_EVENT_MOUSE_BUTTON_DOWN<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 120</span>         Beep<span class="k2">(</span><span class="n">500</span>,<span class="n">20</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 121</span>      <span class="k2">}</span>
<span class="number"> 122</span>      <span class="k1">if</span><span class="k2">(</span>redraw <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>event_queue<span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 123</span>         redraw <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 124</span>
<span class="number"> 125</span>         <span class="c">//al_clear_to_color(al_map_rgb(0,0,0));</span>
<span class="number"> 126</span>
<span class="number"> 127</span>         <a href="http://www.allegro.cc/manual/al_lock_mutex"><span class="a">al_lock_mutex</span></a><span class="k2">(</span>data.mutex<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 128</span>         <a href="http://www.allegro.cc/manual/al_draw_bitmap"><span class="a">al_draw_bitmap</span></a><span class="k2">(</span>bouncer, data.posiX, data.posiY, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 129</span>         <a href="http://www.allegro.cc/manual/al_unlock_mutex"><span class="a">al_unlock_mutex</span></a><span class="k2">(</span>data.mutex<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 130</span>
<span class="number"> 131</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"> 132</span>      <span class="k2">}</span>
<span class="number"> 133</span>   <span class="k2">}</span>
<span class="number"> 134</span>   <a href="http://www.allegro.cc/manual/al_destroy_thread"><span class="a">al_destroy_thread</span></a><span class="k2">(</span>thread_1<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 135</span>   <a href="http://www.allegro.cc/manual/al_destroy_thread"><span class="a">al_destroy_thread</span></a><span class="k2">(</span>thread_2<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 136</span>
<span class="number"> 137</span>   <a href="http://www.allegro.cc/manual/al_destroy_bitmap"><span class="a">al_destroy_bitmap</span></a><span class="k2">(</span>bouncer<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 138</span>   <a href="http://www.allegro.cc/manual/al_destroy_timer"><span class="a">al_destroy_timer</span></a><span class="k2">(</span>timer<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 139</span>   <a href="http://www.allegro.cc/manual/al_destroy_display"><span class="a">al_destroy_display</span></a><span class="k2">(</span>display<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 140</span>   <a href="http://www.allegro.cc/manual/al_destroy_event_queue"><span class="a">al_destroy_event_queue</span></a><span class="k2">(</span>event_queue<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 141</span>
<span class="number"> 142</span>   <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 143</span><span class="k2">}</span>
<span class="number"> 144</span>
<span class="number"> 145</span>   <span class="k1">static</span> <span class="k1">void</span> <span class="k3">*</span>Func_Thread<span class="k2">(</span><a href="http://www.allegro.cc/manual/ALLEGRO_THREAD"><span class="a">ALLEGRO_THREAD</span></a> <span class="k3">*</span>thr, <span class="k1">void</span> <span class="k3">*</span>arg<span class="k2">)</span><span class="k2">{</span>
<span class="number"> 146</span>
<span class="number"> 147</span>   DATA <span class="k3">*</span>data  <span class="k3">=</span> <span class="k2">(</span>DATA<span class="k3">*</span><span class="k2">)</span> arg<span class="k2">;</span>
<span class="number"> 148</span>
<span class="number"> 149</span>   <span class="k1">float</span> num   <span class="k3">=</span> <span class="n">0</span>.<span class="n">1</span><span class="k2">;</span>
<span class="number"> 150</span>   <span class="k1">bool</span> modi_X <span class="k3">=</span> data-&gt;modi_X<span class="k2">;</span>
<span class="number"> 151</span>
<span class="number"> 152</span>   <span class="k1">while</span><span class="k2">(</span><span class="k3">!</span><a href="http://www.allegro.cc/manual/al_get_thread_should_stop"><span class="a">al_get_thread_should_stop</span></a><span class="k2">(</span>thr<span class="k2">)</span><span class="k2">)</span><span class="k2">{</span>
<span class="number"> 153</span>
<span class="number"> 154</span>      <a href="http://www.allegro.cc/manual/al_lock_mutex"><span class="a">al_lock_mutex</span></a><span class="k2">(</span>data-&gt;mutex<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 155</span>
<span class="number"> 156</span>      <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>modi_X<span class="k2">)</span>
<span class="number"> 157</span>         data-&gt;posiX <span class="k3">+</span><span class="k3">=</span> num<span class="k2">;</span>
<span class="number"> 158</span>      <span class="k1">else</span>
<span class="number"> 159</span>         data-&gt;posiY <span class="k3">+</span><span class="k3">=</span> num<span class="k2">;</span>
<span class="number"> 160</span>
<span class="number"> 161</span>      <a href="http://www.allegro.cc/manual/al_unlock_mutex"><span class="a">al_unlock_mutex</span></a><span class="k2">(</span>data-&gt;mutex<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 162</span>
<span class="number"> 163</span>      <a href="http://www.allegro.cc/manual/al_rest"><span class="a">al_rest</span></a><span class="k2">(</span><span class="n">0</span>.<span class="n">1</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 164</span>
<span class="number"> 165</span>   <span class="k2">}</span>
<span class="number"> 166</span>
<span class="number"> 167</span>   <span class="k1">return</span> NULL<span class="k2">;</span>
<span class="number"> 168</span>   <span class="k2">}</span>
</div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (AMCerasoli)</author>
		<pubDate>Wed, 25 May 2011 17:34:22 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/607420/918881#target">AMCerasoli</a> said:</div><div class="quote"><p>
And my only answer is: because takes more time to change data.modi_X to true than create a new thread, so the new thread receive the old data?</p></div></div><p>
When you don&#39;t insert that rest, the modi_X gets changed before the other thread reaches line 152. Whenever you are reading/writing shared data you should mutex<span class="ref"><sup>[<a href="#">1</a>]</sup></span>. So that would also go for reading/writing modi_X.
</p><div class="ref-block"><h2>References</h2><ol><li>I guess</li></ol></div></div>]]>
		</description>
		<author>no-reply@allegro.cc (weapon_S)</author>
		<pubDate>Wed, 25 May 2011 17:42:32 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I still don&#39;t get it <img src="http://www.allegro.cc/forums/smileys/undecided.gif" alt=":-/" /></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="number">  2</span>   DATA data<span class="k2">;</span>
<span class="number">  3</span>
<span class="number">  4</span>   thread_1 <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_thread"><span class="a">al_create_thread</span></a><span class="k2">(</span>Func_Thread, <span class="k3">&amp;</span>data<span class="k2">)</span><span class="k2">;</span> <span class="c">//Here I send data with modi_X </span>
<span class="number">  5</span>   <a href="http://www.allegro.cc/manual/al_start_thread"><span class="a">al_start_thread</span></a><span class="k2">(</span>thread_1<span class="k2">)</span><span class="k2">;</span>                       <span class="c">//as false</span>
<span class="number">  6</span>
<span class="number">  7</span>   <span class="c">//al_rest(1); </span>
<span class="number">  8</span>
<span class="number">  9</span>   <a href="http://www.allegro.cc/manual/al_lock_mutex"><span class="a">al_lock_mutex</span></a><span class="k2">(</span>data.mutex<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 10</span>   data.modi_X <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>          <span class="c">//Here I change the value (using correctly the</span>
<span class="number"> 11</span>   <a href="http://www.allegro.cc/manual/al_unlock_mutex"><span class="a">al_unlock_mutex</span></a><span class="k2">(</span>data.mutex<span class="k2">)</span><span class="k2">;</span> <span class="c">//Mutual thingy)</span>
<span class="number"> 12</span>
<span class="number"> 13</span>   thread_2 <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_thread"><span class="a">al_create_thread</span></a><span class="k2">(</span>Func_Thread, <span class="k3">&amp;</span>data<span class="k2">)</span><span class="k2">;</span>  <span class="c">//Then here I should send </span>
<span class="number"> 14</span>   <a href="http://www.allegro.cc/manual/al_start_thread"><span class="a">al_start_thread</span></a><span class="k2">(</span>thread_2<span class="k2">)</span><span class="k2">;</span>                        <span class="c">//data with the modi_X already </span>
<span class="number"> 15</span>                                                     <span class="c">//modified. But if don't use </span>
<span class="number"> 16</span>                                                     <span class="c">//rest that doesn't happens.</span>
</div></div><p>

If what you say is true: &quot;When you don&#39;t insert that rest, the modi_X gets changed before the other thread reaches line 152.&quot; shouldn&#39;t work correctly?</p><p>I think what it&#39;s happening is that if I don&#39;t insert that rest, the modi_X gets changed <b>after</b> the other thread reaches line 152. Isn&#39;t that right? <img src="http://www.allegro.cc/forums/smileys/tongue.gif" alt=":P" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (AMCerasoli)</author>
		<pubDate>Wed, 25 May 2011 21:17:55 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>It would need to be something like this:</p><h3>Parent Thread</h3><p>

</p><ul><li><p>Create data object
</p></li><li><p>Set modi_X = true
</p></li><li><p>Create / start thread #1
</p></li><li><p>Wait for signal from child thread #1
</p></li><li><p>Set modi_X = false
</p></li><li><p>Create / start thread #2
</p></li><li><p>Wait for signal from child thread #2 (technically optional)</p></li></ul><h3>Child Thread #1</h3><p>

</p><ul><li><p>Initialize self, read modi_X
</p></li><li><p>Signal parent</p></li></ul><h3>Child Thread #2</h3><p>

</p><ul><li><p>Initialize self, read modi_X
</p></li><li><p>Signal parent</p></li></ul><p>Here&#39;s a sample program:
</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="p">#include &lt;allegro5/allegro.h&gt;</span>
<span class="number">  2</span><span class="p">#include &lt;stdio.h&gt;</span>
<span class="number">  3</span>
<span class="number">  4</span><span class="k1">typedef</span> <span class="k1">struct</span> threaddatatag <span class="k2">{</span>
<span class="number">  5</span>  <a href="http://www.allegro.cc/manual/ALLEGRO_MUTEX"><span class="a">ALLEGRO_MUTEX</span></a> <span class="k3">*</span>m<span class="k2">;</span>
<span class="number">  6</span>  <a href="http://www.allegro.cc/manual/ALLEGRO_COND"><span class="a">ALLEGRO_COND</span></a> <span class="k3">*</span>c<span class="k2">;</span>
<span class="number">  7</span>  <span class="k1">int</span> x<span class="k2">;</span>
<span class="number">  8</span>  <span class="k1">bool</span> ready<span class="k2">;</span>
<span class="number">  9</span><span class="k2">}</span> THREAD_DATA<span class="k2">;</span>
<span class="number"> 10</span>
<span class="number"> 11</span><span class="k1">void</span> <span class="k3">*</span>child_thread<span class="k2">(</span><a href="http://www.allegro.cc/manual/ALLEGRO_THREAD"><span class="a">ALLEGRO_THREAD</span></a> <span class="k3">*</span>me, <span class="k1">void</span> <span class="k3">*</span>param<span class="k2">)</span>
<span class="number"> 12</span><span class="k2">{</span>
<span class="number"> 13</span>  THREAD_DATA <span class="k3">*</span>data <span class="k3">=</span> param<span class="k2">;</span>
<span class="number"> 14</span>  <span class="k1">int</span> x<span class="k2">;</span>
<span class="number"> 15</span>
<span class="number"> 16</span>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Child thread running!\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 17</span>
<span class="number"> 18</span>  <a href="http://www.allegro.cc/manual/al_lock_mutex"><span class="a">al_lock_mutex</span></a><span class="k2">(</span>data-&gt;m<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 19</span>  <a href="http://www.allegro.cc/manual/al_rest"><span class="a">al_rest</span></a><span class="k2">(</span><span class="n">1</span><span class="k2">)</span><span class="k2">;</span> 
<span class="number"> 20</span>  x <span class="k3">=</span> data-&gt;x<span class="k2">;</span>  
<span class="number"> 21</span>  data-&gt;ready <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 22</span>  <a href="http://www.allegro.cc/manual/al_broadcast_cond"><span class="a">al_broadcast_cond</span></a><span class="k2">(</span>data-&gt;c<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 23</span>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Child signalled that it is ready\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 24</span>  <a href="http://www.allegro.cc/manual/al_rest"><span class="a">al_rest</span></a><span class="k2">(</span><span class="n">0</span>.<span class="n">10</span><span class="k2">)</span><span class="k2">;</span> 
<span class="number"> 25</span>  <a href="http://www.allegro.cc/manual/al_unlock_mutex"><span class="a">al_unlock_mutex</span></a><span class="k2">(</span>data-&gt;m<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 26</span>
<span class="number"> 27</span>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"x is %d\n"</span>, x<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 28</span>
<span class="number"> 29</span>  <span class="k1">while</span> <span class="k2">(</span><span class="k3">!</span><a href="http://www.allegro.cc/manual/al_get_thread_should_stop"><span class="a">al_get_thread_should_stop</span></a><span class="k2">(</span>me<span class="k2">)</span><span class="k2">)</span>
<span class="number"> 30</span>  <span class="k2">{</span>
<span class="number"> 31</span>    <a href="http://www.allegro.cc/manual/al_rest"><span class="a">al_rest</span></a><span class="k2">(</span><span class="n">1</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 32</span>  <span class="k2">}</span>
<span class="number"> 33</span>
<span class="number"> 34</span>  <span class="k1">return</span> NULL<span class="k2">;</span>
<span class="number"> 35</span><span class="k2">}</span>
<span class="number"> 36</span>
<span class="number"> 37</span><span class="k1">int</span> main<span class="k2">(</span><span class="k2">)</span>
<span class="number"> 38</span><span class="k2">{</span>
<span class="number"> 39</span>  <a href="http://www.allegro.cc/manual/ALLEGRO_THREAD"><span class="a">ALLEGRO_THREAD</span></a> <span class="k3">*</span>child<span class="k2">;</span>
<span class="number"> 40</span>  THREAD_DATA <span class="k3">*</span>data<span class="k2">;</span>
<span class="number"> 41</span>
<span class="number"> 42</span>  <a href="http://www.allegro.cc/manual/al_init"><span class="a">al_init</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 43</span>
<span class="number"> 44</span>  data <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_551.html" target="_blank">malloc</a><span class="k2">(</span><span class="k1">sizeof</span><span class="k2">(</span><span class="k3">*</span>data<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 45</span>  data-&gt;m <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_mutex"><span class="a">al_create_mutex</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 46</span>  data-&gt;c <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_cond"><span class="a">al_create_cond</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 47</span>
<span class="number"> 48</span>  child <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_thread"><span class="a">al_create_thread</span></a><span class="k2">(</span>child_thread, data<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 49</span>
<span class="number"> 50</span>  data-&gt;ready <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 51</span>  data-&gt;x <span class="k3">=</span> <span class="n">1</span><span class="k2">;</span>
<span class="number"> 52</span>
<span class="number"> 53</span>  <a href="http://www.allegro.cc/manual/al_start_thread"><span class="a">al_start_thread</span></a><span class="k2">(</span>child<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 54</span>
<span class="number"> 55</span>  <a href="http://www.allegro.cc/manual/al_lock_mutex"><span class="a">al_lock_mutex</span></a><span class="k2">(</span>data-&gt;m<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 56</span>  <span class="k1">while</span> <span class="k2">(</span><span class="k3">!</span>data-&gt;ready<span class="k2">)</span>
<span class="number"> 57</span>  <span class="k2">{</span>
<span class="number"> 58</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Parent is waiting for child to be ready\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 59</span>    <a href="http://www.allegro.cc/manual/al_wait_cond"><span class="a">al_wait_cond</span></a><span class="k2">(</span>data-&gt;c, data-&gt;m<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 60</span>  <span class="k2">}</span>
<span class="number"> 61</span>  <a href="http://www.allegro.cc/manual/al_unlock_mutex"><span class="a">al_unlock_mutex</span></a><span class="k2">(</span>data-&gt;m<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 62</span>
<span class="number"> 63</span>  <span class="c">// repeat proces for child thread #2</span>
<span class="number"> 64</span>
<span class="number"> 65</span>  <a href="http://www.allegro.cc/manual/al_destroy_thread"><span class="a">al_destroy_thread</span></a><span class="k2">(</span>child<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 66</span>
<span class="number"> 67</span>  <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 68</span><span class="k2">}</span>
</div></div><p>

Note how it uses a signal (condition) along with a &quot;ready&quot; flag that tells the parent that the child has read the <span class="source-code">x</span> value.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Matthew Leverton)</author>
		<pubDate>Wed, 25 May 2011 21:18:45 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>oh yhea, now it&#39;s working without <span class="source-code"><a href="http://www.allegro.cc/manual/al_rest"><span class="a">al_rest</span></a><span class="k2">(</span><span class="k2">)</span></span>.</p><p>thread-0.0.3 <img src="http://www.allegro.cc/forums/smileys/grin.gif" alt=";D" /></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="number">   2</span><span class="p">#include &lt;stdio.h&gt;</span>
<span class="number">   3</span><span class="p">#include &lt;iostream&gt;</span>
<span class="number">   4</span><span class="p">#include &lt;allegro5/allegro.h&gt;</span>
<span class="number">   5</span>
<span class="number">   6</span><span class="k1">class</span> DATA<span class="k2">{</span>
<span class="number">   7</span>
<span class="number">   8</span>   public:
<span class="number">   9</span>   
<span class="number">  10</span>      <a href="http://www.allegro.cc/manual/ALLEGRO_MUTEX"><span class="a">ALLEGRO_MUTEX</span></a> <span class="k3">*</span>mutex<span class="k2">;</span>
<span class="number">  11</span>      <a href="http://www.allegro.cc/manual/ALLEGRO_COND"><span class="a">ALLEGRO_COND</span></a>  <span class="k3">*</span>cond<span class="k2">;</span>
<span class="number">  12</span>      <span class="k1">float</span>          posiX<span class="k2">;</span>
<span class="number">  13</span>      <span class="k1">float</span>          posiY<span class="k2">;</span>
<span class="number">  14</span>      <span class="k1">bool</span>           modi_X<span class="k2">;</span>
<span class="number">  15</span>
<span class="number">  16</span>   DATA<span class="k2">(</span><span class="k2">)</span><span class="k2">{</span>
<span class="number">  17</span>
<span class="number">  18</span>      mutex  <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_mutex"><span class="a">al_create_mutex</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  19</span>      cond   <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_cond"><span class="a">al_create_cond</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  20</span>      posiX  <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number">  21</span>      posiY  <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number">  22</span>      modi_X <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number">  23</span>
<span class="number">  24</span>   <span class="k2">}</span>
<span class="number">  25</span>   
<span class="number">  26</span>   ~DATA<span class="k2">(</span><span class="k2">)</span><span class="k2">{</span>
<span class="number">  27</span>    
<span class="number">  28</span>      <a href="http://www.allegro.cc/manual/al_destroy_mutex"><span class="a">al_destroy_mutex</span></a><span class="k2">(</span>mutex<span class="k2">)</span><span class="k2">;</span>
<span class="number">  29</span>      <a href="http://www.allegro.cc/manual/al_destroy_cond"><span class="a">al_destroy_cond</span></a><span class="k2">(</span>cond<span class="k2">)</span><span class="k2">;</span>
<span class="number">  30</span>   
<span class="number">  31</span>   <span class="k2">}</span>
<span class="number">  32</span>
<span class="number">  33</span><span class="k2">}</span><span class="k2">;</span>
<span class="number">  34</span>
<span class="number">  35</span><span class="k1">const</span> <span class="k1">float</span> FPS        <span class="k3">=</span> <span class="n">30</span><span class="k2">;</span>
<span class="number">  36</span><span class="k1">const</span> <span class="k1">int</span> <a href="http://www.allegro.cc/manual/SCREEN_W"><span class="a">SCREEN_W</span></a>     <span class="k3">=</span> <span class="n">640</span><span class="k2">;</span>
<span class="number">  37</span><span class="k1">const</span> <span class="k1">int</span> <a href="http://www.allegro.cc/manual/SCREEN_H"><span class="a">SCREEN_H</span></a>     <span class="k3">=</span> <span class="n">480</span><span class="k2">;</span>
<span class="number">  38</span><span class="k1">const</span> <span class="k1">int</span> BOUNCER_SIZE <span class="k3">=</span> <span class="n">32</span><span class="k2">;</span>
<span class="number">  39</span>
<span class="number">  40</span><span class="k1">static</span> <span class="k1">void</span> <span class="k3">*</span>Func_Thread<span class="k2">(</span><a href="http://www.allegro.cc/manual/ALLEGRO_THREAD"><span class="a">ALLEGRO_THREAD</span></a> <span class="k3">*</span>thr, <span class="k1">void</span> <span class="k3">*</span>arg<span class="k2">)</span><span class="k2">;</span>
<span class="number">  41</span>
<span class="number">  42</span><span class="k1">int</span> main<span class="k2">(</span><span class="k1">int</span> argc, <span class="k1">char</span> <span class="k3">*</span><span class="k3">*</span>argv<span class="k2">)</span>
<span class="number">  43</span><span class="k2">{</span>
<span class="number">  44</span>   <a href="http://www.allegro.cc/manual/ALLEGRO_DISPLAY"><span class="a">ALLEGRO_DISPLAY</span></a>     <span class="k3">*</span>display     <span class="k3">=</span> NULL<span class="k2">;</span>
<span class="number">  45</span>   <a href="http://www.allegro.cc/manual/ALLEGRO_EVENT_QUEUE"><span class="a">ALLEGRO_EVENT_QUEUE</span></a> <span class="k3">*</span>event_queue <span class="k3">=</span> NULL<span class="k2">;</span>
<span class="number">  46</span>   <a href="http://www.allegro.cc/manual/ALLEGRO_TIMER"><span class="a">ALLEGRO_TIMER</span></a>       <span class="k3">*</span>timer       <span class="k3">=</span> NULL<span class="k2">;</span>
<span class="number">  47</span>   <a href="http://www.allegro.cc/manual/ALLEGRO_BITMAP"><span class="a">ALLEGRO_BITMAP</span></a>      <span class="k3">*</span>bouncer     <span class="k3">=</span> NULL<span class="k2">;</span>
<span class="number">  48</span>   <a href="http://www.allegro.cc/manual/ALLEGRO_THREAD"><span class="a">ALLEGRO_THREAD</span></a>      <span class="k3">*</span>thread_1    <span class="k3">=</span> NULL<span class="k2">;</span>
<span class="number">  49</span>   <a href="http://www.allegro.cc/manual/ALLEGRO_THREAD"><span class="a">ALLEGRO_THREAD</span></a>      <span class="k3">*</span>thread_2    <span class="k3">=</span> NULL<span class="k2">;</span>
<span class="number">  50</span>
<span class="number">  51</span>   <span class="k1">bool</span> redraw <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number">  52</span>
<span class="number">  53</span>   <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span><a href="http://www.allegro.cc/manual/al_init"><span class="a">al_init</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number">  54</span>      <a href="http://www.delorie.com/djgpp/doc/libc/libc_345.html" target="_blank">fprintf</a><span class="k2">(</span>stderr, <span class="s">"failed to initialize allegro!\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  55</span>      <span class="k1">return</span> <span class="k3">-</span><span class="n">1</span><span class="k2">;</span>
<span class="number">  56</span>   <span class="k2">}</span>
<span class="number">  57</span>
<span class="number">  58</span>   <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span><a href="http://www.allegro.cc/manual/al_install_mouse"><span class="a">al_install_mouse</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number">  59</span>      <a href="http://www.delorie.com/djgpp/doc/libc/libc_345.html" target="_blank">fprintf</a><span class="k2">(</span>stderr, <span class="s">"failed to initialize the mouse!\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  60</span>      <span class="k1">return</span> <span class="k3">-</span><span class="n">1</span><span class="k2">;</span>
<span class="number">  61</span>   <span class="k2">}</span>
<span class="number">  62</span>
<span class="number">  63</span>   timer <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_timer"><span class="a">al_create_timer</span></a><span class="k2">(</span><span class="n">1</span>.<span class="n">0</span> <span class="k3">/</span> FPS<span class="k2">)</span><span class="k2">;</span>
<span class="number">  64</span>   <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>timer<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  65</span>      <a href="http://www.delorie.com/djgpp/doc/libc/libc_345.html" target="_blank">fprintf</a><span class="k2">(</span>stderr, <span class="s">"failed to create timer!\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  66</span>      <span class="k1">return</span> <span class="k3">-</span><span class="n">1</span><span class="k2">;</span>
<span class="number">  67</span>   <span class="k2">}</span>
<span class="number">  68</span>
<span class="number">  69</span>   display <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_display"><span class="a">al_create_display</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/SCREEN_W"><span class="a">SCREEN_W</span></a>, <a href="http://www.allegro.cc/manual/SCREEN_H"><span class="a">SCREEN_H</span></a><span class="k2">)</span><span class="k2">;</span>
<span class="number">  70</span>   <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>display<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  71</span>      <a href="http://www.delorie.com/djgpp/doc/libc/libc_345.html" target="_blank">fprintf</a><span class="k2">(</span>stderr, <span class="s">"failed to create display!\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  72</span>      <a href="http://www.allegro.cc/manual/al_destroy_timer"><span class="a">al_destroy_timer</span></a><span class="k2">(</span>timer<span class="k2">)</span><span class="k2">;</span>
<span class="number">  73</span>      <span class="k1">return</span> <span class="k3">-</span><span class="n">1</span><span class="k2">;</span>
<span class="number">  74</span>   <span class="k2">}</span>
<span class="number">  75</span>
<span class="number">  76</span>   bouncer <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_bitmap"><span class="a">al_create_bitmap</span></a><span class="k2">(</span>BOUNCER_SIZE, BOUNCER_SIZE<span class="k2">)</span><span class="k2">;</span>
<span class="number">  77</span>   <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>bouncer<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  78</span>      <a href="http://www.delorie.com/djgpp/doc/libc/libc_345.html" target="_blank">fprintf</a><span class="k2">(</span>stderr, <span class="s">"failed to create bouncer bitmap!\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  79</span>      <a href="http://www.allegro.cc/manual/al_destroy_display"><span class="a">al_destroy_display</span></a><span class="k2">(</span>display<span class="k2">)</span><span class="k2">;</span>
<span class="number">  80</span>      <a href="http://www.allegro.cc/manual/al_destroy_timer"><span class="a">al_destroy_timer</span></a><span class="k2">(</span>timer<span class="k2">)</span><span class="k2">;</span>
<span class="number">  81</span>      <span class="k1">return</span> <span class="k3">-</span><span class="n">1</span><span class="k2">;</span>
<span class="number">  82</span>   <span class="k2">}</span>
<span class="number">  83</span>
<span class="number">  84</span>   <a href="http://www.allegro.cc/manual/al_set_target_bitmap"><span class="a">al_set_target_bitmap</span></a><span class="k2">(</span>bouncer<span class="k2">)</span><span class="k2">;</span>
<span class="number">  85</span>
<span class="number">  86</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">255</span>, <span class="n">0</span>, <span class="n">255</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  87</span>
<span class="number">  88</span>   <a href="http://www.allegro.cc/manual/al_set_target_bitmap"><span class="a">al_set_target_bitmap</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/al_get_backbuffer"><span class="a">al_get_backbuffer</span></a><span class="k2">(</span>display<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  89</span>
<span class="number">  90</span>   event_queue <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_event_queue"><span class="a">al_create_event_queue</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  91</span>
<span class="number">  92</span>   <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>event_queue<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  93</span>      <a href="http://www.delorie.com/djgpp/doc/libc/libc_345.html" target="_blank">fprintf</a><span class="k2">(</span>stderr, <span class="s">"failed to create event_queue!\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  94</span>      <a href="http://www.allegro.cc/manual/al_destroy_bitmap"><span class="a">al_destroy_bitmap</span></a><span class="k2">(</span>bouncer<span class="k2">)</span><span class="k2">;</span>
<span class="number">  95</span>      <a href="http://www.allegro.cc/manual/al_destroy_display"><span class="a">al_destroy_display</span></a><span class="k2">(</span>display<span class="k2">)</span><span class="k2">;</span>
<span class="number">  96</span>      <a href="http://www.allegro.cc/manual/al_destroy_timer"><span class="a">al_destroy_timer</span></a><span class="k2">(</span>timer<span class="k2">)</span><span class="k2">;</span>
<span class="number">  97</span>      <span class="k1">return</span> <span class="k3">-</span><span class="n">1</span><span class="k2">;</span>
<span class="number">  98</span>   <span class="k2">}</span>
<span class="number">  99</span>
<span class="number"> 100</span>   <a href="http://www.allegro.cc/manual/al_register_event_source"><span class="a">al_register_event_source</span></a><span class="k2">(</span>event_queue, <a href="http://www.allegro.cc/manual/al_get_display_event_source"><span class="a">al_get_display_event_source</span></a><span class="k2">(</span>display<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 101</span>   <a href="http://www.allegro.cc/manual/al_register_event_source"><span class="a">al_register_event_source</span></a><span class="k2">(</span>event_queue, <a href="http://www.allegro.cc/manual/al_get_timer_event_source"><span class="a">al_get_timer_event_source</span></a><span class="k2">(</span>timer<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 102</span>   <a href="http://www.allegro.cc/manual/al_register_event_source"><span class="a">al_register_event_source</span></a><span class="k2">(</span>event_queue, <a href="http://www.allegro.cc/manual/al_get_mouse_event_source"><span class="a">al_get_mouse_event_source</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 103</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"> 104</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"> 105</span>   <a href="http://www.allegro.cc/manual/al_start_timer"><span class="a">al_start_timer</span></a><span class="k2">(</span>timer<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 106</span>
<span class="number"> 107</span>   DATA data<span class="k2">;</span>
<span class="number"> 108</span>
<span class="number"> 109</span>   thread_1 <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_thread"><span class="a">al_create_thread</span></a><span class="k2">(</span>Func_Thread, <span class="k3">&amp;</span>data<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 110</span>   <a href="http://www.allegro.cc/manual/al_start_thread"><span class="a">al_start_thread</span></a><span class="k2">(</span>thread_1<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 111</span>
<span class="number"> 112</span>   <a href="http://www.allegro.cc/manual/al_lock_mutex"><span class="a">al_lock_mutex</span></a><span class="k2">(</span>data.mutex<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 113</span>   <a href="http://www.allegro.cc/manual/al_wait_cond"><span class="a">al_wait_cond</span></a><span class="k2">(</span>data.cond, data.mutex<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 114</span>   <a href="http://www.allegro.cc/manual/al_unlock_mutex"><span class="a">al_unlock_mutex</span></a><span class="k2">(</span>data.mutex<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 115</span>
<span class="number"> 116</span>   <a href="http://www.allegro.cc/manual/al_lock_mutex"><span class="a">al_lock_mutex</span></a><span class="k2">(</span>data.mutex<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 117</span>   data.modi_X <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 118</span>   <a href="http://www.allegro.cc/manual/al_unlock_mutex"><span class="a">al_unlock_mutex</span></a><span class="k2">(</span>data.mutex<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 119</span>
<span class="number"> 120</span>   thread_2 <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_thread"><span class="a">al_create_thread</span></a><span class="k2">(</span>Func_Thread, <span class="k3">&amp;</span>data<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 121</span>   <a href="http://www.allegro.cc/manual/al_start_thread"><span class="a">al_start_thread</span></a><span class="k2">(</span>thread_2<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 122</span>
<span class="number"> 123</span>
<span class="number"> 124</span>   <span class="k1">while</span><span class="k2">(</span><span class="n">1</span><span class="k2">)</span>
<span class="number"> 125</span>   <span class="k2">{</span>
<span class="number"> 126</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"> 127</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>event_queue, <span class="k3">&amp;</span>ev<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 128</span>
<span class="number"> 129</span>      <span class="k1">if</span><span class="k2">(</span>ev.type <span class="k3">=</span><span class="k3">=</span> ALLEGRO_EVENT_TIMER<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 130</span>         redraw <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 131</span>      <span class="k2">}</span>
<span class="number"> 132</span>      <span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span>ev.type <span class="k3">=</span><span class="k3">=</span> ALLEGRO_EVENT_DISPLAY_CLOSE<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 133</span>         <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 134</span>      <span class="k2">}</span>
<span class="number"> 135</span>      <span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span>ev.type <span class="k3">=</span><span class="k3">=</span> ALLEGRO_EVENT_MOUSE_BUTTON_DOWN<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 136</span>         <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 137</span>      <span class="k2">}</span>
<span class="number"> 138</span>      <span class="k1">if</span><span class="k2">(</span>redraw <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>event_queue<span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 139</span>         redraw <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 140</span>
<span class="number"> 141</span>         <a href="http://www.allegro.cc/manual/al_lock_mutex"><span class="a">al_lock_mutex</span></a><span class="k2">(</span>data.mutex<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 142</span>         <a href="http://www.allegro.cc/manual/al_draw_bitmap"><span class="a">al_draw_bitmap</span></a><span class="k2">(</span>bouncer, data.posiX, data.posiY, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 143</span>         <a href="http://www.allegro.cc/manual/al_unlock_mutex"><span class="a">al_unlock_mutex</span></a><span class="k2">(</span>data.mutex<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 144</span>
<span class="number"> 145</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"> 146</span>      <span class="k2">}</span>
<span class="number"> 147</span>   <span class="k2">}</span>
<span class="number"> 148</span>   <a href="http://www.allegro.cc/manual/al_destroy_thread"><span class="a">al_destroy_thread</span></a><span class="k2">(</span>thread_1<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 149</span>   <a href="http://www.allegro.cc/manual/al_destroy_thread"><span class="a">al_destroy_thread</span></a><span class="k2">(</span>thread_2<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 150</span>
<span class="number"> 151</span>   <a href="http://www.allegro.cc/manual/al_destroy_bitmap"><span class="a">al_destroy_bitmap</span></a><span class="k2">(</span>bouncer<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 152</span>   <a href="http://www.allegro.cc/manual/al_destroy_timer"><span class="a">al_destroy_timer</span></a><span class="k2">(</span>timer<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 153</span>   <a href="http://www.allegro.cc/manual/al_destroy_display"><span class="a">al_destroy_display</span></a><span class="k2">(</span>display<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 154</span>   <a href="http://www.allegro.cc/manual/al_destroy_event_queue"><span class="a">al_destroy_event_queue</span></a><span class="k2">(</span>event_queue<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 155</span>
<span class="number"> 156</span>   <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 157</span><span class="k2">}</span>
<span class="number"> 158</span>
<span class="number"> 159</span>   <span class="k1">static</span> <span class="k1">void</span> <span class="k3">*</span>Func_Thread<span class="k2">(</span><a href="http://www.allegro.cc/manual/ALLEGRO_THREAD"><span class="a">ALLEGRO_THREAD</span></a> <span class="k3">*</span>thr, <span class="k1">void</span> <span class="k3">*</span>arg<span class="k2">)</span><span class="k2">{</span>
<span class="number"> 160</span>
<span class="number"> 161</span>   DATA <span class="k3">*</span>data  <span class="k3">=</span> <span class="k2">(</span>DATA<span class="k3">*</span><span class="k2">)</span> arg<span class="k2">;</span>
<span class="number"> 162</span>   <span class="k1">float</span> num   <span class="k3">=</span> <span class="n">0</span>.<span class="n">1</span><span class="k2">;</span>
<span class="number"> 163</span>
<span class="number"> 164</span>   <a href="http://www.allegro.cc/manual/al_lock_mutex"><span class="a">al_lock_mutex</span></a><span class="k2">(</span>data-&gt;mutex<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 165</span>
<span class="number"> 166</span>   <span class="k1">bool</span> modi_X <span class="k3">=</span> data-&gt;modi_X<span class="k2">;</span>
<span class="number"> 167</span>   <a href="http://www.allegro.cc/manual/al_broadcast_cond"><span class="a">al_broadcast_cond</span></a><span class="k2">(</span>data-&gt;cond<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 168</span>
<span class="number"> 169</span>   <a href="http://www.allegro.cc/manual/al_unlock_mutex"><span class="a">al_unlock_mutex</span></a><span class="k2">(</span>data-&gt;mutex<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 170</span>
<span class="number"> 171</span>   <span class="k1">while</span><span class="k2">(</span><span class="k3">!</span><a href="http://www.allegro.cc/manual/al_get_thread_should_stop"><span class="a">al_get_thread_should_stop</span></a><span class="k2">(</span>thr<span class="k2">)</span><span class="k2">)</span><span class="k2">{</span>
<span class="number"> 172</span>
<span class="number"> 173</span>      <a href="http://www.allegro.cc/manual/al_lock_mutex"><span class="a">al_lock_mutex</span></a><span class="k2">(</span>data-&gt;mutex<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 174</span>
<span class="number"> 175</span>      <span class="k1">if</span><span class="k2">(</span>modi_X<span class="k2">)</span>
<span class="number"> 176</span>         data-&gt;posiX <span class="k3">+</span><span class="k3">=</span> num<span class="k2">;</span>
<span class="number"> 177</span>      <span class="k1">else</span>
<span class="number"> 178</span>         data-&gt;posiY <span class="k3">+</span><span class="k3">=</span> num<span class="k2">;</span>
<span class="number"> 179</span>
<span class="number"> 180</span>      <a href="http://www.allegro.cc/manual/al_unlock_mutex"><span class="a">al_unlock_mutex</span></a><span class="k2">(</span>data-&gt;mutex<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 181</span>
<span class="number"> 182</span>      <a href="http://www.allegro.cc/manual/al_rest"><span class="a">al_rest</span></a><span class="k2">(</span><span class="n">0</span>.<span class="n">01</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 183</span>
<span class="number"> 184</span>   <span class="k2">}</span>
<span class="number"> 185</span>
<span class="number"> 186</span>   <span class="k1">return</span> NULL<span class="k2">;</span>
<span class="number"> 187</span>   <span class="k2">}</span>
</div></div><p>

Isn&#39;t just beautiful? simpler couldn&#39;t be (Matt don&#39;t do it)...
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (AMCerasoli)</author>
		<pubDate>Thu, 26 May 2011 03:16:46 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>You cannot omit the <span class="source-code">ready</span> flag because the child might broadcast the signal before the parent is ready to catch it.</p><p>To test that theory, place a short rest before the parent waits for the signal. If you give the child enough time to initialize, then the parent will get stuck waiting forever.</p><p>When programming with threads you can never assume the order or speed in which two things in parallel happen.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Matthew Leverton)</author>
		<pubDate>Thu, 26 May 2011 05:00:20 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Ok I think now I get it.</p><p>What do you think?</p><div class="source-code"><div class="toolbar"><span class="name">thread.cpp 0.0.4</span><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="number">   2</span><span class="p">#include &lt;stdio.h&gt;</span>
<span class="number">   3</span><span class="p">#include &lt;iostream&gt;</span>
<span class="number">   4</span><span class="p">#include &lt;allegro5/allegro.h&gt;</span>
<span class="number">   5</span>
<span class="number">   6</span><span class="k1">class</span> DATA<span class="k2">{</span>
<span class="number">   7</span>
<span class="number">   8</span>   public:
<span class="number">   9</span>
<span class="number">  10</span>      <a href="http://www.allegro.cc/manual/ALLEGRO_MUTEX"><span class="a">ALLEGRO_MUTEX</span></a> <span class="k3">*</span>mutex<span class="k2">;</span>
<span class="number">  11</span>      <a href="http://www.allegro.cc/manual/ALLEGRO_COND"><span class="a">ALLEGRO_COND</span></a>  <span class="k3">*</span>cond<span class="k2">;</span>
<span class="number">  12</span>      <span class="k1">float</span>          posiX<span class="k2">;</span>
<span class="number">  13</span>      <span class="k1">float</span>          posiY<span class="k2">;</span>
<span class="number">  14</span>      <span class="k1">bool</span>           modi_X<span class="k2">;</span>
<span class="number">  15</span>      <span class="k1">bool</span>           ready<span class="k2">;</span>
<span class="number">  16</span>
<span class="number">  17</span>   DATA<span class="k2">(</span><span class="k2">)</span><span class="k2">{</span>
<span class="number">  18</span>
<span class="number">  19</span>      mutex  <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_mutex"><span class="a">al_create_mutex</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  20</span>      cond   <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_cond"><span class="a">al_create_cond</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  21</span>      posiX  <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number">  22</span>      posiY  <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number">  23</span>      modi_X <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number">  24</span>      ready  <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number">  25</span>
<span class="number">  26</span>   <span class="k2">}</span>
<span class="number">  27</span>
<span class="number">  28</span>   ~DATA<span class="k2">(</span><span class="k2">)</span><span class="k2">{</span>
<span class="number">  29</span>
<span class="number">  30</span>      <a href="http://www.allegro.cc/manual/al_destroy_mutex"><span class="a">al_destroy_mutex</span></a><span class="k2">(</span>mutex<span class="k2">)</span><span class="k2">;</span>
<span class="number">  31</span>      <a href="http://www.allegro.cc/manual/al_destroy_cond"><span class="a">al_destroy_cond</span></a><span class="k2">(</span>cond<span class="k2">)</span><span class="k2">;</span>
<span class="number">  32</span>
<span class="number">  33</span>   <span class="k2">}</span>
<span class="number">  34</span>
<span class="number">  35</span><span class="k2">}</span><span class="k2">;</span>
<span class="number">  36</span>
<span class="number">  37</span><span class="k1">const</span> <span class="k1">float</span> FPS        <span class="k3">=</span> <span class="n">30</span><span class="k2">;</span>
<span class="number">  38</span><span class="k1">const</span> <span class="k1">int</span> <a href="http://www.allegro.cc/manual/SCREEN_W"><span class="a">SCREEN_W</span></a>     <span class="k3">=</span> <span class="n">640</span><span class="k2">;</span>
<span class="number">  39</span><span class="k1">const</span> <span class="k1">int</span> <a href="http://www.allegro.cc/manual/SCREEN_H"><span class="a">SCREEN_H</span></a>     <span class="k3">=</span> <span class="n">480</span><span class="k2">;</span>
<span class="number">  40</span><span class="k1">const</span> <span class="k1">int</span> BOUNCER_SIZE <span class="k3">=</span> <span class="n">32</span><span class="k2">;</span>
<span class="number">  41</span>
<span class="number">  42</span><span class="k1">static</span> <span class="k1">void</span> <span class="k3">*</span>Func_Thread<span class="k2">(</span><a href="http://www.allegro.cc/manual/ALLEGRO_THREAD"><span class="a">ALLEGRO_THREAD</span></a> <span class="k3">*</span>thr, <span class="k1">void</span> <span class="k3">*</span>arg<span class="k2">)</span><span class="k2">;</span>
<span class="number">  43</span>
<span class="number">  44</span><span class="k1">int</span> main<span class="k2">(</span><span class="k1">int</span> argc, <span class="k1">char</span> <span class="k3">*</span><span class="k3">*</span>argv<span class="k2">)</span>
<span class="number">  45</span><span class="k2">{</span>
<span class="number">  46</span>   <a href="http://www.allegro.cc/manual/ALLEGRO_DISPLAY"><span class="a">ALLEGRO_DISPLAY</span></a>     <span class="k3">*</span>display     <span class="k3">=</span> NULL<span class="k2">;</span>
<span class="number">  47</span>   <a href="http://www.allegro.cc/manual/ALLEGRO_EVENT_QUEUE"><span class="a">ALLEGRO_EVENT_QUEUE</span></a> <span class="k3">*</span>event_queue <span class="k3">=</span> NULL<span class="k2">;</span>
<span class="number">  48</span>   <a href="http://www.allegro.cc/manual/ALLEGRO_TIMER"><span class="a">ALLEGRO_TIMER</span></a>       <span class="k3">*</span>timer       <span class="k3">=</span> NULL<span class="k2">;</span>
<span class="number">  49</span>   <a href="http://www.allegro.cc/manual/ALLEGRO_BITMAP"><span class="a">ALLEGRO_BITMAP</span></a>      <span class="k3">*</span>bouncer     <span class="k3">=</span> NULL<span class="k2">;</span>
<span class="number">  50</span>   <a href="http://www.allegro.cc/manual/ALLEGRO_THREAD"><span class="a">ALLEGRO_THREAD</span></a>      <span class="k3">*</span>thread_1    <span class="k3">=</span> NULL<span class="k2">;</span>
<span class="number">  51</span>   <a href="http://www.allegro.cc/manual/ALLEGRO_THREAD"><span class="a">ALLEGRO_THREAD</span></a>      <span class="k3">*</span>thread_2    <span class="k3">=</span> NULL<span class="k2">;</span>
<span class="number">  52</span>
<span class="number">  53</span>   <span class="k1">bool</span> redraw <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number">  54</span>
<span class="number">  55</span>   <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span><a href="http://www.allegro.cc/manual/al_init"><span class="a">al_init</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number">  56</span>      <a href="http://www.delorie.com/djgpp/doc/libc/libc_345.html" target="_blank">fprintf</a><span class="k2">(</span>stderr, <span class="s">"failed to initialize allegro!\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  57</span>      <span class="k1">return</span> <span class="k3">-</span><span class="n">1</span><span class="k2">;</span>
<span class="number">  58</span>   <span class="k2">}</span>
<span class="number">  59</span>
<span class="number">  60</span>   <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span><a href="http://www.allegro.cc/manual/al_install_mouse"><span class="a">al_install_mouse</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number">  61</span>      <a href="http://www.delorie.com/djgpp/doc/libc/libc_345.html" target="_blank">fprintf</a><span class="k2">(</span>stderr, <span class="s">"failed to initialize the mouse!\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  62</span>      <span class="k1">return</span> <span class="k3">-</span><span class="n">1</span><span class="k2">;</span>
<span class="number">  63</span>   <span class="k2">}</span>
<span class="number">  64</span>
<span class="number">  65</span>   timer <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_timer"><span class="a">al_create_timer</span></a><span class="k2">(</span><span class="n">1</span>.<span class="n">0</span> <span class="k3">/</span> FPS<span class="k2">)</span><span class="k2">;</span>
<span class="number">  66</span>   <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>timer<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  67</span>      <a href="http://www.delorie.com/djgpp/doc/libc/libc_345.html" target="_blank">fprintf</a><span class="k2">(</span>stderr, <span class="s">"failed to create timer!\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  68</span>      <span class="k1">return</span> <span class="k3">-</span><span class="n">1</span><span class="k2">;</span>
<span class="number">  69</span>   <span class="k2">}</span>
<span class="number">  70</span>
<span class="number">  71</span>   display <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_display"><span class="a">al_create_display</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/SCREEN_W"><span class="a">SCREEN_W</span></a>, <a href="http://www.allegro.cc/manual/SCREEN_H"><span class="a">SCREEN_H</span></a><span class="k2">)</span><span class="k2">;</span>
<span class="number">  72</span>   <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>display<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  73</span>      <a href="http://www.delorie.com/djgpp/doc/libc/libc_345.html" target="_blank">fprintf</a><span class="k2">(</span>stderr, <span class="s">"failed to create display!\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  74</span>      <a href="http://www.allegro.cc/manual/al_destroy_timer"><span class="a">al_destroy_timer</span></a><span class="k2">(</span>timer<span class="k2">)</span><span class="k2">;</span>
<span class="number">  75</span>      <span class="k1">return</span> <span class="k3">-</span><span class="n">1</span><span class="k2">;</span>
<span class="number">  76</span>   <span class="k2">}</span>
<span class="number">  77</span>
<span class="number">  78</span>   bouncer <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_bitmap"><span class="a">al_create_bitmap</span></a><span class="k2">(</span>BOUNCER_SIZE, BOUNCER_SIZE<span class="k2">)</span><span class="k2">;</span>
<span class="number">  79</span>   <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>bouncer<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  80</span>      <a href="http://www.delorie.com/djgpp/doc/libc/libc_345.html" target="_blank">fprintf</a><span class="k2">(</span>stderr, <span class="s">"failed to create bouncer bitmap!\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  81</span>      <a href="http://www.allegro.cc/manual/al_destroy_display"><span class="a">al_destroy_display</span></a><span class="k2">(</span>display<span class="k2">)</span><span class="k2">;</span>
<span class="number">  82</span>      <a href="http://www.allegro.cc/manual/al_destroy_timer"><span class="a">al_destroy_timer</span></a><span class="k2">(</span>timer<span class="k2">)</span><span class="k2">;</span>
<span class="number">  83</span>      <span class="k1">return</span> <span class="k3">-</span><span class="n">1</span><span class="k2">;</span>
<span class="number">  84</span>   <span class="k2">}</span>
<span class="number">  85</span>
<span class="number">  86</span>   <a href="http://www.allegro.cc/manual/al_set_target_bitmap"><span class="a">al_set_target_bitmap</span></a><span class="k2">(</span>bouncer<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">255</span>, <span class="n">0</span>, <span class="n">255</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  88</span>   <a href="http://www.allegro.cc/manual/al_set_target_bitmap"><span class="a">al_set_target_bitmap</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/al_get_backbuffer"><span class="a">al_get_backbuffer</span></a><span class="k2">(</span>display<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  89</span>   event_queue <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_event_queue"><span class="a">al_create_event_queue</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  90</span>
<span class="number">  91</span>   <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>event_queue<span class="k2">)</span> <span class="k2">{</span>
<span class="number">  92</span>      <a href="http://www.delorie.com/djgpp/doc/libc/libc_345.html" target="_blank">fprintf</a><span class="k2">(</span>stderr, <span class="s">"failed to create event_queue!\n"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  93</span>      <a href="http://www.allegro.cc/manual/al_destroy_bitmap"><span class="a">al_destroy_bitmap</span></a><span class="k2">(</span>bouncer<span class="k2">)</span><span class="k2">;</span>
<span class="number">  94</span>      <a href="http://www.allegro.cc/manual/al_destroy_display"><span class="a">al_destroy_display</span></a><span class="k2">(</span>display<span class="k2">)</span><span class="k2">;</span>
<span class="number">  95</span>      <a href="http://www.allegro.cc/manual/al_destroy_timer"><span class="a">al_destroy_timer</span></a><span class="k2">(</span>timer<span class="k2">)</span><span class="k2">;</span>
<span class="number">  96</span>      <span class="k1">return</span> <span class="k3">-</span><span class="n">1</span><span class="k2">;</span>
<span class="number">  97</span>   <span class="k2">}</span>
<span class="number">  98</span>
<span class="number">  99</span>   <a href="http://www.allegro.cc/manual/al_register_event_source"><span class="a">al_register_event_source</span></a><span class="k2">(</span>event_queue, <a href="http://www.allegro.cc/manual/al_get_display_event_source"><span class="a">al_get_display_event_source</span></a><span class="k2">(</span>display<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 100</span>   <a href="http://www.allegro.cc/manual/al_register_event_source"><span class="a">al_register_event_source</span></a><span class="k2">(</span>event_queue, <a href="http://www.allegro.cc/manual/al_get_timer_event_source"><span class="a">al_get_timer_event_source</span></a><span class="k2">(</span>timer<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 101</span>   <a href="http://www.allegro.cc/manual/al_register_event_source"><span class="a">al_register_event_source</span></a><span class="k2">(</span>event_queue, <a href="http://www.allegro.cc/manual/al_get_mouse_event_source"><span class="a">al_get_mouse_event_source</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 102</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"> 103</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"> 104</span>   <a href="http://www.allegro.cc/manual/al_start_timer"><span class="a">al_start_timer</span></a><span class="k2">(</span>timer<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 105</span>
<span class="number"> 106</span>   DATA data<span class="k2">;</span>
<span class="number"> 107</span>
<span class="number"> 108</span>   thread_1 <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_thread"><span class="a">al_create_thread</span></a><span class="k2">(</span>Func_Thread, <span class="k3">&amp;</span>data<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 109</span>   <a href="http://www.allegro.cc/manual/al_start_thread"><span class="a">al_start_thread</span></a><span class="k2">(</span>thread_1<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 110</span>
<span class="number"> 111</span>   <a href="http://www.allegro.cc/manual/al_lock_mutex"><span class="a">al_lock_mutex</span></a><span class="k2">(</span>data.mutex<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 112</span>   <span class="k1">while</span> <span class="k2">(</span><span class="k3">!</span>data.ready<span class="k2">)</span><span class="k2">{</span>
<span class="number"> 113</span>
<span class="number"> 114</span>      <a href="http://www.allegro.cc/manual/al_wait_cond"><span class="a">al_wait_cond</span></a><span class="k2">(</span>data.cond, data.mutex<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 115</span>
<span class="number"> 116</span>   <span class="k2">}</span>
<span class="number"> 117</span>   <a href="http://www.allegro.cc/manual/al_unlock_mutex"><span class="a">al_unlock_mutex</span></a><span class="k2">(</span>data.mutex<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 118</span>
<span class="number"> 119</span>   <a href="http://www.allegro.cc/manual/al_lock_mutex"><span class="a">al_lock_mutex</span></a><span class="k2">(</span>data.mutex<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 120</span>   data.modi_X <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 121</span>   data.ready  <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 122</span>   <a href="http://www.allegro.cc/manual/al_unlock_mutex"><span class="a">al_unlock_mutex</span></a><span class="k2">(</span>data.mutex<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 123</span>
<span class="number"> 124</span>   thread_2 <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_thread"><span class="a">al_create_thread</span></a><span class="k2">(</span>Func_Thread, <span class="k3">&amp;</span>data<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 125</span>   <a href="http://www.allegro.cc/manual/al_start_thread"><span class="a">al_start_thread</span></a><span class="k2">(</span>thread_2<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 126</span>
<span class="number"> 127</span>   <a href="http://www.allegro.cc/manual/al_lock_mutex"><span class="a">al_lock_mutex</span></a><span class="k2">(</span>data.mutex<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 128</span>   <span class="k1">while</span> <span class="k2">(</span><span class="k3">!</span>data.ready<span class="k2">)</span><span class="k2">{</span>
<span class="number"> 129</span>
<span class="number"> 130</span>      <a href="http://www.allegro.cc/manual/al_wait_cond"><span class="a">al_wait_cond</span></a><span class="k2">(</span>data.cond, data.mutex<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 131</span>
<span class="number"> 132</span>   <span class="k2">}</span>
<span class="number"> 133</span>   <a href="http://www.allegro.cc/manual/al_unlock_mutex"><span class="a">al_unlock_mutex</span></a><span class="k2">(</span>data.mutex<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 134</span>
<span class="number"> 135</span>
<span class="number"> 136</span>   <span class="k1">while</span><span class="k2">(</span><span class="n">1</span><span class="k2">)</span>
<span class="number"> 137</span>   <span class="k2">{</span>
<span class="number"> 138</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"> 139</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>event_queue, <span class="k3">&amp;</span>ev<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 140</span>
<span class="number"> 141</span>      <span class="k1">if</span><span class="k2">(</span>ev.type <span class="k3">=</span><span class="k3">=</span> ALLEGRO_EVENT_TIMER<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 142</span>         redraw <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 143</span>      <span class="k2">}</span>
<span class="number"> 144</span>      <span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span>ev.type <span class="k3">=</span><span class="k3">=</span> ALLEGRO_EVENT_DISPLAY_CLOSE<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 145</span>         <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 146</span>      <span class="k2">}</span>
<span class="number"> 147</span>      <span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span>ev.type <span class="k3">=</span><span class="k3">=</span> ALLEGRO_EVENT_MOUSE_BUTTON_DOWN<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 148</span>         <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 149</span>      <span class="k2">}</span>
<span class="number"> 150</span>      <span class="k1">if</span><span class="k2">(</span>redraw <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>event_queue<span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 151</span>         redraw <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 152</span>
<span class="number"> 153</span>         <a href="http://www.allegro.cc/manual/al_lock_mutex"><span class="a">al_lock_mutex</span></a><span class="k2">(</span>data.mutex<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 154</span>         <a href="http://www.allegro.cc/manual/al_draw_bitmap"><span class="a">al_draw_bitmap</span></a><span class="k2">(</span>bouncer, data.posiX, data.posiY, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 155</span>         <a href="http://www.allegro.cc/manual/al_unlock_mutex"><span class="a">al_unlock_mutex</span></a><span class="k2">(</span>data.mutex<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 156</span>
<span class="number"> 157</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"> 158</span>      <span class="k2">}</span>
<span class="number"> 159</span>   <span class="k2">}</span>
<span class="number"> 160</span>   <a href="http://www.allegro.cc/manual/al_destroy_thread"><span class="a">al_destroy_thread</span></a><span class="k2">(</span>thread_1<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 161</span>   <a href="http://www.allegro.cc/manual/al_destroy_thread"><span class="a">al_destroy_thread</span></a><span class="k2">(</span>thread_2<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 162</span>
<span class="number"> 163</span>   <a href="http://www.allegro.cc/manual/al_destroy_bitmap"><span class="a">al_destroy_bitmap</span></a><span class="k2">(</span>bouncer<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 164</span>   <a href="http://www.allegro.cc/manual/al_destroy_timer"><span class="a">al_destroy_timer</span></a><span class="k2">(</span>timer<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 165</span>   <a href="http://www.allegro.cc/manual/al_destroy_display"><span class="a">al_destroy_display</span></a><span class="k2">(</span>display<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 166</span>   <a href="http://www.allegro.cc/manual/al_destroy_event_queue"><span class="a">al_destroy_event_queue</span></a><span class="k2">(</span>event_queue<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 167</span>
<span class="number"> 168</span>   <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 169</span><span class="k2">}</span>
<span class="number"> 170</span>
<span class="number"> 171</span>   <span class="k1">static</span> <span class="k1">void</span> <span class="k3">*</span>Func_Thread<span class="k2">(</span><a href="http://www.allegro.cc/manual/ALLEGRO_THREAD"><span class="a">ALLEGRO_THREAD</span></a> <span class="k3">*</span>thr, <span class="k1">void</span> <span class="k3">*</span>arg<span class="k2">)</span><span class="k2">{</span>
<span class="number"> 172</span>
<span class="number"> 173</span>   DATA <span class="k3">*</span>data  <span class="k3">=</span> <span class="k2">(</span>DATA<span class="k3">*</span><span class="k2">)</span> arg<span class="k2">;</span>
<span class="number"> 174</span>   <span class="k1">float</span> num   <span class="k3">=</span> <span class="n">0</span>.<span class="n">1</span><span class="k2">;</span>
<span class="number"> 175</span>
<span class="number"> 176</span>   <a href="http://www.allegro.cc/manual/al_lock_mutex"><span class="a">al_lock_mutex</span></a><span class="k2">(</span>data-&gt;mutex<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 177</span>
<span class="number"> 178</span>   <span class="k1">bool</span> modi_X <span class="k3">=</span> data-&gt;modi_X<span class="k2">;</span>
<span class="number"> 179</span>   data-&gt;ready <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 180</span>   <a href="http://www.allegro.cc/manual/al_broadcast_cond"><span class="a">al_broadcast_cond</span></a><span class="k2">(</span>data-&gt;cond<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 181</span>
<span class="number"> 182</span>   <a href="http://www.allegro.cc/manual/al_unlock_mutex"><span class="a">al_unlock_mutex</span></a><span class="k2">(</span>data-&gt;mutex<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 183</span>
<span class="number"> 184</span>   <span class="k1">while</span><span class="k2">(</span><span class="k3">!</span><a href="http://www.allegro.cc/manual/al_get_thread_should_stop"><span class="a">al_get_thread_should_stop</span></a><span class="k2">(</span>thr<span class="k2">)</span><span class="k2">)</span><span class="k2">{</span>
<span class="number"> 185</span>
<span class="number"> 186</span>      <a href="http://www.allegro.cc/manual/al_lock_mutex"><span class="a">al_lock_mutex</span></a><span class="k2">(</span>data-&gt;mutex<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 187</span>      <span class="k1">if</span><span class="k2">(</span>modi_X<span class="k2">)</span>
<span class="number"> 188</span>         data-&gt;posiX <span class="k3">+</span><span class="k3">=</span> num<span class="k2">;</span>
<span class="number"> 189</span>      <span class="k1">else</span>
<span class="number"> 190</span>         data-&gt;posiY <span class="k3">+</span><span class="k3">=</span> num<span class="k2">;</span>
<span class="number"> 191</span>      <a href="http://www.allegro.cc/manual/al_unlock_mutex"><span class="a">al_unlock_mutex</span></a><span class="k2">(</span>data-&gt;mutex<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 192</span>
<span class="number"> 193</span>      <a href="http://www.allegro.cc/manual/al_rest"><span class="a">al_rest</span></a><span class="k2">(</span><span class="n">0</span>.<span class="n">01</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 194</span>
<span class="number"> 195</span>   <span class="k2">}</span>
<span class="number"> 196</span>
<span class="number"> 197</span>
<span class="number"> 198</span>   <span class="k1">return</span> NULL<span class="k2">;</span>
<span class="number"> 199</span>   <span class="k2">}</span>
</div></div><p>

I would like to delete the &lt;stdio.h&gt; include and add the native dialogs addon but I think that would complicate a bit more things for a newbie.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (AMCerasoli)</author>
		<pubDate>Thu, 26 May 2011 19:56:52 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p><span class="source-code"><a href="http://www.allegro.cc/manual/al_wait_cond"><span class="a">al_wait_cond</span></a></span> is weird, but I get it. Except for:
</p><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/manual/5/al_wait_cond">The Manual</a> said:</div><div class="quote"><p>
al_wait_cond can return for other reasons than the condition becoming true (e.g. the process was signalled).</p></div></div><p>
Somebody wants to explain that to me, please?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (weapon_S)</author>
		<pubDate>Thu, 26 May 2011 20:51:12 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>it was told to by the system.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Neil Walker)</author>
		<pubDate>Thu, 26 May 2011 21:05:59 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Ha, I get it now <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" /><br />I&#39;m getting the image of an office where an employee is told by his boss to &quot;do something&quot;; even though the said employee has to wait for some copies to be done. He shrugs and resumes waiting.<br />When he gets the signal his copies are done, some other guy might have swiped them already, though.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (weapon_S)</author>
		<pubDate>Thu, 26 May 2011 21:15:24 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>When drawing the bitmap, you could do something like:
</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">float</span> x, y<span class="k2">;</span>
<a href="http://www.allegro.cc/manual/al_lock_mutex"><span class="a">al_lock_mutex</span></a><span class="k2">(</span>data.mutex<span class="k2">)</span><span class="k2">;</span>
x <span class="k3">=</span> data.posiX<span class="k2">;</span>
y <span class="k3">=</span> data.posiY<span class="k2">;</span>
<a href="http://www.allegro.cc/manual/al_unlock_mutex"><span class="a">al_unlock_mutex</span></a><span class="k2">(</span>data.mutex<span class="k2">)</span><span class="k2">;</span>
<a href="http://www.allegro.cc/manual/al_draw_bitmap"><span class="a">al_draw_bitmap</span></a><span class="k2">(</span>bouncer, x, y, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p>
It won&#39;t hold the mutex lock as long, and generally that&#39;s a good thing.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Matthew Leverton)</author>
		<pubDate>Thu, 26 May 2011 23:27:30 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I guess it&#39;s a good way to show the importance of blocking and unblocking the mutex the less possible. But it&#39;s really necessary do something like that in a real game?. Because that would imply creating a whole system to avoid having dispersed variables all over the code.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (AMCerasoli)</author>
		<pubDate>Fri, 27 May 2011 00:32:47 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>The entire example is contrived, so it really doesn&#39;t matter.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Matthew Leverton)</author>
		<pubDate>Fri, 27 May 2011 01:04:12 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/607420/919043#target">AMCerasoli</a> said:</div><div class="quote"><p>But it&#39;s really necessary do something like that in a real game?</p></div></div><p>Well, yea.  Threads are mean little beasts and they deserve your respect.  They&#39;re unpredictable and aren&#39;t prone to let you know if and when they crash.  If you don&#39;t go about it the right way, crashes can come out of nowhere and can be impossible to reproduce.  You should always approach threaded programming very defensively and take all the appropriate precautions.</p><p>Are you making progress on the cURL part of your problem? <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Mark Oates)</author>
		<pubDate>Fri, 27 May 2011 02:05:32 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Yes I already solve it... But it has a little isolated problem, I think it&#39;s my code fault.</p><p>when I open the window and libCurl download the data and then I close it nothing happens, but if I open the window and immediately close the window then the entire game get stuck again (as you can see at the end of the video). But I think it&#39;s because I&#39;m creating a new thread inside an object which is handled by a container which isn&#39;t in another thread, so the entire game needs to wait until the thread close. I might fix it, but I don&#39;t see it necessary.</p><p><div class="media-player youtube"><div style="margin: 1em 2em; background: url(/images/movie.png); width: 180px; height: 100px; text-align: center;"><a href="http://www.allegro.cc//www.youtube.com/watch?v=VKIpehG3Lvk" target="_blank"><img src="http://www.allegro.cc//djungxnpq2nug.cloudfront.net/image/object/4/8/48f3eb20e09f0ed626857af22f790a90.jpg" border="0" alt="video" title="Click to play video" /></a></div></div>	</p><p>I would need to kill the thread immediately. <img src="http://www.allegro.cc/forums/smileys/grin.gif" alt=";D" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (AMCerasoli)</author>
		<pubDate>Fri, 27 May 2011 15:38:23 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Fix it you dummy <img src="http://www.allegro.cc/forums/smileys/angry.gif" alt="&gt;:(" /> The times you actually know what&#39;s wrong, are the moments a programmer should live for!<br />Might I ask if by chance I&#39;ve learned the pthreads syntax while learning Allegro?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (weapon_S)</author>
		<pubDate>Mon, 30 May 2011 21:04:49 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>WTH... I thought this thread was death... It&#39;s like the other thread where I put a conclusion and now that I was looking for something that I wrote there I saw two more posts...</p><p>To fix this problem I would need to create an entire object of my class in another thread. And if I do it, I have no idea how could I use list to control them, I think I can&#39;t.</p><p>How can I call an object function from the parent thread using std::list? nahh too complicated. What I&#39;m going to do it&#39;s just don&#39;t let the user close the window until the data is downloaded or the error message appears. It&#39;s less than a second anyway.</p><p>Controlling a bunch of threads using a std::list would be good, though.</p><p>Imagine a pointer to an object, I created that object on a different thread. But I need to call one of the pointer functions from the parent thread. So, I would need to send some kind of data to the thread where I&#39;m going to store the address of the object that I have created on that thread, and then I would need to create a std::list of pointers on the parent thread, and I think I wouldn&#39;t need to use mutex, because if I call the function draw() of some object only that object would be using that part of the memory, right?... Hmmm.. interesting...</p><p>But everything would be different, draw() would only set a flag which is going to be used by the thread, since the thread would have its own loop... AHHHHH my brain!!!</p><p>I think that is not even possible... anyway, I got inspired for a moment... <img src="http://www.allegro.cc/forums/smileys/tongue.gif" alt=":P" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (AMCerasoli)</author>
		<pubDate>Tue, 31 May 2011 04:17:46 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/607420/919127#target">AMCerasoli</a> said:</div><div class="quote"><p>I&#39;m creating a new thread inside an object which is handled by a container which isn&#39;t in another thread, so the entire game needs to wait until the thread close.</p></div></div><p>
I didn&#39;t really pay enough attention to this sentence. I hope you know a STL container can copy it&#39;s elements, if it feels to. So I hope you didn&#39;t put your objects directly into the container, and the creation of threads into the classes constructor.<br />You plan on actually using objects in a (container) to dynamically add and remove threads...? Complicated!<br />Why don&#39;t you show what you have now? It should be good for a couple of laughs <img src="http://www.allegro.cc/forums/smileys/tongue.gif" alt=":P" />
</p><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/607420/919548#target">AMCerasoli</a> said:</div><div class="quote"><p>Imagine a pointer to an object, I created that object on a different thread. But I need to call one of the pointer functions from the parent thread. So, I would need to send some kind of data to the thread where I&#39;m going to store the address of the object that I have created on that thread, and then I would need to create a std::list of pointers on the parent thread, and I think I wouldn&#39;t need to use mutex, because if I call the function draw() of some object only that object would be using that part of the memory, right?... Hmmm.. interesting...</p></div></div><p>
The container aside, you want to create a thread that creates an object, that can be used in the main thread? How about just passing a pointer to a struct like this to your child thread?
</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">struct</span> <span class="k2">{</span>
   GameData<span class="k3">*</span> everything<span class="k2">;</span> <span class="c">//optional... beware of concurrency</span>
   ClassName<span class="k3">*</span> object_loaded_in_thread<span class="k2">;</span>
   <span class="k1">int</span> state<span class="k2">;</span> <span class="c">//Starting, object ready and running, failed or sumthin.</span>
   <a href="http://www.allegro.cc/manual/ALLEGRO_MUTEX"><span class="a">ALLEGRO_MUTEX</span></a><span class="k3">*</span> yeah_still_necessary<span class="k2">;</span>
<span class="k2">}</span>
</pre></div></div><p>
You want to run the other thread to? Loading objects concurrently might make sense, but I can&#39;t see what you&#39;d have to run in other thread besides that. What should the two threads tell eachother? (Remember I&#39;m a beginner to.)
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (weapon_S)</author>
		<pubDate>Tue, 31 May 2011 13:52:56 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/607420/919600#target">weapon_S</a> said:</div><div class="quote"><p>I didn&#39;t really pay enough attention to this sentence. I hope you know a STL container can copy it&#39;s elements, if it feels to. So I hope you didn&#39;t put your objects directly into the container, and the creation of threads into the classes constructor.</p></div></div><p>

No I&#39;m not putting the object directly inside the container. I&#39;m creating a container of pointers. And no I&#39;m not creating a new tread inside the constructor, hahaha that would be crazy, I&#39;m creating it inside the destructor... hahahaha... no really, I&#39;m creating it inside the object, another normal function.</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>You plan on actually using objects in a (container) to dynamically add and remove threads...? Complicated!</p></div></div><p>

Not in my game, I was just wondering how would it be. What I would like to know is how to create an object in another thread and then call its member functions in the parent thread. If the child thread, create a new object, the parent thread have no idea about that, so I would need to send to the child thread the object that I want to create plus a pointer of the same datatype to then add it to a container in the parent thread... Or something like that. <img src="http://www.allegro.cc/forums/smileys/tongue.gif" alt=":P" /></p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>The container aside, you want to create a thread that creates an object, that can be used in the main thread? How about just passing a pointer to a struct like this to your child thread?</p></div></div><p>

Yes, I think would be something like that.</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>You want to run the other thread to? Loading objects concurrently might make sense, but I can&#39;t see what you&#39;d have to run in other thread besides that. What should the two threads tell eachother? (Remember I&#39;m a beginner to.) </p></div></div><p>

Well, in my current game I&#39;m loading from the server for that reason I need another thread, but yhea I don&#39;t see another very useful having multi-thread system inside a normal game.</p><p>Wait man... I just release that in fact I&#39;m creating another thread inside the constructor... And what is the problem? because everything is working fine here... <img src="http://www.allegro.cc/forums/smileys/undecided.gif" alt=":-/" /></p><p>Check out if it work on your computer, download it, come on, just 1,5 Mb. Tell me if it work.</p><p>Press A to make appear a window and D to delete it. You should see &quot;Cargando..&quot; which is &quot;Loading..&quot; and then a bunch of name and time records. Or a error message if something went wrong.</p><p><b>Edit:</b> I mean, I&#39;m making the thread start in the constructor but the function itself is outside the constructor.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (AMCerasoli)</author>
		<pubDate>Tue, 31 May 2011 15:06:41 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Anything you do in the constructor should be considered, if using objects directly in an STL container. The program seems to work fine for me (@ 0.5FPS).
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (weapon_S)</author>
		<pubDate>Tue, 31 May 2011 17:16:45 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/607420/918673#target">AMCerasoli</a> said:</div><div class="quote"><p>
Does someone have really an example to show a very basic program using the Allegro 5 threading interface?
</p></div></div><p>

If you want to use threads in an easy manner, you need to code a worker class thread, into which you send events to it, which are executed in the context of the thread, and that you receive events from. </p><p>Assuming that you use c++ (from your reference to the std::string class), you first need to wrap the Allegro mutex into a class, like this:</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">class</span> Mutex <span class="k2">{</span>
public:
    Mutex<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span> mutex <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_mutex"><span class="a">al_create_mutex</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span><span class="k2">}</span>
    ~Mutex<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span> <a href="http://www.allegro.cc/manual/al_destroy_mutex"><span class="a">al_destroy_mutex</span></a><span class="k2">(</span>mutex<span class="k2">)</span><span class="k2">;</span> <span class="k2">}</span>
    <span class="k1">void</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_539.html" target="_blank">lock</a><span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span> <a href="http://www.allegro.cc/manual/al_lock_mutex"><span class="a">al_lock_mutex</span></a><span class="k2">(</span>mutex<span class="k2">)</span><span class="k2">;</span> <span class="k2">}</span>
    <span class="k1">void</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_539.html" target="_blank">lock</a><span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span> <a href="http://www.allegro.cc/manual/al_unlock_mutex"><span class="a">al_unlock_mutex</span></a><span class="k2">(</span>mutex<span class="k2">)</span><span class="k2">;</span> <span class="k2">}</span>
private:
    <a href="http://www.allegro.cc/manual/ALLEGRO_MUTEX"><span class="a">ALLEGRO_MUTEX</span></a> <span class="k3">*</span>mutex<span class="k2">;</span>
<span class="k2">}</span><span class="k2">;</span>
</pre></div></div><p>

Then you will also need a semaphore. Allegro does not contain one, so use pthreads:</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">class</span> Semaphore <span class="k2">{</span>
public:
    Semaphore<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span> sem_init<span class="k2">(</span><span class="k3">&amp;</span>m_sem, <span class="n">0</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span> <span class="k2">}</span>
    ~Semaphore<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span> sem_destroy<span class="k2">(</span><span class="k3">&amp;</span>m_sem<span class="k2">)</span><span class="k2">;</span> <span class="k2">}</span>
    <span class="k1">void</span> increment<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span> sem_post<span class="k2">(</span><span class="k3">&amp;</span>m_sem<span class="k2">)</span><span class="k2">;</span> <span class="k2">}</span>
    <span class="k1">void</span> decrement<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span> sem_wait<span class="k2">(</span><span class="k3">&amp;</span>m_sem<span class="k2">)</span><span class="k2">;</span> <span class="k2">}</span>
private:
   sem_t m_sem<span class="k2">;</span>
<span class="k2">}</span><span class="k2">;</span>
</pre></div></div><p>

With the above, you can make a nice event queue, like this:</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">class</span> Event <span class="k2">{</span>
<span class="number">  2</span>    <span class="k1">virtual</span> ~Event<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span><span class="k2">}</span>
<span class="number">  3</span>    <span class="k1">virtual</span> <span class="k1">void</span> exec<span class="k2">(</span><span class="k2">)</span> <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number">  4</span><span class="k2">}</span><span class="k2">;</span>
<span class="number">  5</span><span class="k1">typedef</span> std::shared_ptr<span class="k3">&lt;</span>Event&gt; EventPtr<span class="k2">;</span>
<span class="number">  6</span>
<span class="number">  7</span><span class="k1">class</span> EventQueue <span class="k2">{</span>
<span class="number">  8</span>public:
<span class="number">  9</span>    <span class="k1">void</span> put<span class="k2">(</span><span class="k1">const</span> EventPtr <span class="k3">&amp;</span>ev<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 10</span>        m_mutex.lock<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 11</span>        m_events.push_back<span class="k2">(</span>ev<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 12</span>        m_mutex.unlock<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 13</span>        m_sem.increment<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 14</span>    <span class="k2">}</span>
<span class="number"> 15</span>
<span class="number"> 16</span>    EventPtr get<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 17</span>        m_sem.wait<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 18</span>        m_mutex.lock<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 19</span>        EventPtr event <span class="k3">=</span> m_events.front
<span class="number"> 20</span>        m_events.pop_front<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 21</span>        m_mutex.unlock<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 22</span>        <span class="k1">return</span> event<span class="k2">;</span>
<span class="number"> 23</span>    <span class="k2">}</span>
<span class="number"> 24</span>
<span class="number"> 25</span>private:
<span class="number"> 26</span>    Semaphore m_sem<span class="k2">;</span>
<span class="number"> 27</span>    Mutex m_mutex<span class="k2">;</span>
<span class="number"> 28</span>    std::list<span class="k3">&lt;</span>EventPtr&gt; m_events<span class="k2">;</span>
<span class="number"> 29</span><span class="k2">}</span><span class="k2">;</span>
</div></div><p>

Now, with an event queue at hand, you can make your worker thread like this:</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">class</span> WorkerThread <span class="k2">{</span>
<span class="number">  2</span>public:
<span class="number">  3</span>    WorkerThread<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number">  4</span>        m_loop <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number">  5</span>        thread <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_thread"><span class="a">al_create_thread</span></a><span class="k2">(</span><span class="k3">&amp;</span>threadProc, <span class="k1">this</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  6</span>    <span class="k2">}</span>
<span class="number">  7</span>
<span class="number">  8</span>    ~WorkerThread<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number">  9</span>        m_loop <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 10</span>        <a href="http://www.allegro.cc/manual/al_join_thread"><span class="a">al_join_thread</span></a><span class="k2">(</span>thread<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 11</span>    <span class="k2">}</span>
<span class="number"> 12</span>    
<span class="number"> 13</span>    <span class="k1">void</span> put<span class="k2">(</span><span class="k1">const</span> EventPtr <span class="k3">&amp;</span>ev<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 14</span>        m_eventQueue.put<span class="k2">(</span>ev<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 15</span>    <span class="k2">}</span>
<span class="number"> 16</span>
<span class="number"> 17</span>private:
<span class="number"> 18</span>    <a href="http://www.allegro.cc/manual/ALLEGRO_THREAD"><span class="a">ALLEGRO_THREAD</span></a> <span class="k3">*</span>thread<span class="k2">;</span>
<span class="number"> 19</span>    <span class="k1">bool</span> m_loop<span class="k2">;</span>
<span class="number"> 20</span>    EventQueue m_eventQueue<span class="k2">;</span>
<span class="number"> 21</span>
<span class="number"> 22</span>    <span class="k1">void</span> run<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 23</span>        <span class="k1">while</span><span class="k2">(</span>m_loop<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 24</span>            EventPtr ev <span class="k3">=</span> m_eventQueue.get<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 25</span>            ev-&gt;exec<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 26</span>        <span class="k2">}</span>
<span class="number"> 27</span>    <span class="k2">}</span>
<span class="number"> 28</span>
<span class="number"> 29</span>    <span class="k1">static</span> <span class="k1">void</span> threadProc<span class="k2">(</span><span class="k1">void</span> <span class="k3">*</span>arg<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 30</span>        <span class="k2">(</span>WorkerThread <span class="k3">*</span><span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>run<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 31</span>        <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 32</span>    <span class="k2">}</span>
<span class="number"> 33</span><span class="k2">}</span><span class="k2">;</span>
</div></div><p>

The above worker thread implementation is very simple: it waits on the event queue. If an event is received, it executes it, until the flag &#39;loop&#39; is sent to false.</p><p>With the above, you can do subclasses of the class &#39;Event&#39; to be executed in the context of the worker thread.</p><p>Or, if you use a modern version of c++, you can use c++ function objects as events, like this:</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">class</span> FunctionEvent <span class="k2">:</span> <span class="k1">public</span> Event <span class="k2">{</span>
public:
    FunctionEvent<span class="k2">(</span><span class="k1">const</span> std::function<span class="k3">&lt;</span><span class="k1">void</span><span class="k2">(</span><span class="k2">)</span><span class="k3">&gt;</span> <span class="k3">&amp;</span>f<span class="k2">)</span> <span class="k2">:</span> m_function<span class="k2">(</span>f<span class="k2">)</span> <span class="k2">{</span><span class="k2">}</span>
    <span class="k1">virtual</span> <span class="k1">void</span> exec<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span> m_function<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> <span class="k2">}</span>

private:
    std::function<span class="k3">&lt;</span><span class="k1">void</span><span class="k2">(</span><span class="k2">)</span><span class="k3">&gt;</span> m_function<span class="k2">;</span>
<span class="k2">}</span><span class="k2">;</span>

EventPtr event<span class="k2">(</span><span class="k1">const</span> std::function<span class="k3">&lt;</span><span class="k1">void</span><span class="k2">(</span><span class="k2">)</span><span class="k3">&gt;</span> <span class="k3">&amp;</span>f<span class="k2">)</span> <span class="k2">{</span>
    <span class="k1">return</span> EventPtr<span class="k2">(</span><span class="k1">new</span> FunctionEvent<span class="k2">(</span>f<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="k2">}</span>
</pre></div></div><p> </p><p>Now, you can send any code to the worker thread. Assuming you have the function:</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">void</span> myFunction<span class="k2">(</span><span class="k1">const</span> std::string <span class="k3">&amp;</span>str<span class="k2">)</span> <span class="k2">{</span>
    cout <span class="k3">&lt;</span><span class="k3">&lt;</span> str<span class="k2">;</span>
<span class="k2">}</span>
</pre></div></div><p>

You can tell the thread to execute the function with a parameter like this:</p><div class="source-code snippet"><div class="inner"><pre>myWorkerThread.put<span class="k2">(</span>event<span class="k2">(</span>std::bind<span class="k2">(</span><span class="k3">&amp;</span>myFunction, <span class="s">"the quick brown fox"</span><span class="k2">)</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p>

Finally, if you want to get a result from the thread, for example, be notified when a I/O operation has finished, you can send an Allegro event from the function, assuming you also pass the Allegro event queue to the function. </p><p>For example, you can do this:</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">void</span> receive<span class="k2">(</span>CURL <span class="k3">*</span>curl, <a href="http://www.allegro.cc/manual/ALLEGRO_EVENT_QUEUE"><span class="a">ALLEGRO_EVENT_QUEUE</span></a> <span class="k3">*</span>queue<span class="k2">)</span> <span class="k2">{</span>
    curl_easy_perform<span class="k2">(</span>curl<span class="k2">)</span><span class="k2">;</span>
    <a href="http://www.allegro.cc/manual/ALLEGRO_USER_EVENT"><span class="a">ALLEGRO_USER_EVENT</span></a> <span class="k3">*</span>myEvent <span class="k3">=</span> <span class="k1">new</span> <a href="http://www.allegro.cc/manual/ALLEGRO_USER_EVENT"><span class="a">ALLEGRO_USER_EVENT</span></a><span class="k2">;</span>
    myEvent-&gt;type <span class="k3">=</span> MYEVENT<span class="k2">;</span>
    <a href="http://www.allegro.cc/manual/al_emit_user_event"><span class="a">al_emit_user_event</span></a><span class="k2">(</span>queue, myEvent, myEventDestructor<span class="k2">)</span><span class="k2">;</span>
<span class="k2">}</span>

myWorkerThread.put<span class="k2">(</span>event<span class="k2">(</span>std::bind<span class="k2">(</span><span class="k3">&amp;</span>receive, curl, queue<span class="k2">)</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p>

And, in the main event loop:</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">switch</span> <span class="k2">(</span>event.type<span class="k2">)</span> <span class="k2">{</span>
    ...
    <span class="k1">case</span> MYEVENT:
        <span class="c">//bla bla do something with the event</span>
        <span class="k1">break</span><span class="k2">;</span>
<span class="k2">}</span>
</pre></div></div><p>

Caveats:</p><ul><li><p>don&#39;t use the same data from the main thread and any worker threads. I.e. if you send a string to a worker thread, don&#39;t use it from the main thread (or any other thread).</p></li></ul><p>Advantages: </p><ul><li><p>you don&#39;t have to worry about synchronization ever again.
</p></li></ul></div>]]>
		</description>
		<author>no-reply@allegro.cc (axilmar)</author>
		<pubDate>Tue, 31 May 2011 18:59:51 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Why aren&#39;t you using any condition variables? Those are easier to understand than semaphores and you can build semaphores with them. And it makes you not depend on pthreads.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Elias)</author>
		<pubDate>Tue, 31 May 2011 19:10:20 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/607420/919612#target">Elias</a> said:</div><div class="quote"><p> Why aren&#39;t you using any condition variables? Those are easier to understand than semaphores and you can build semaphores with them. And it makes you not depend on pthreads.</p></div></div><p>I haven&#39;t read the whole thread, but IIRC the reason for pthreads is to prevent different cores from reading various values for the same variable from their respective caches.  I believe pthreads on x86-like processors uses the asm xchg mem,reg instruction for semaphores etc. because xchg forces the variable to be written directly to uncached memory.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Arthur Kalliokoski)</author>
		<pubDate>Tue, 31 May 2011 19:15:23 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Yes, all threading APIs will do that (Allegro just uses pthreads anyway). Skipping Allegro/pthreads completely and using atomic operations directly for some things would allow implementing certain things with higher performance than using mutexes. But premature optimization...</p><p>As I understand it we have ALLEGRO_COND in Allegro for the sole reason that you do <b>not</b> have to use semaphores for anything though, so just saying an example on how you use Allegro&#39;s threading API should not have those sem_ functions in it.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Elias)</author>
		<pubDate>Tue, 31 May 2011 19:21:03 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/607420/919612#target">Elias</a> said:</div><div class="quote"><p>
Why aren&#39;t you using any condition variables? Those are easier to understand than semaphores and you can build semaphores with them. And it makes you not depend on pthreads.
</p></div></div><p>

Condition variables are not suitable for event queues: suppose two events are put in the queue while the worker thread is busy; the condition variable is set twice, but the worker thread is woken up once; what we need is the worker thread to be waken up twice.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (axilmar)</author>
		<pubDate>Tue, 31 May 2011 20:37:09 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/607420/919626#target">axilmar</a> said:</div><div class="quote"><p>Condition variables are not suitable for event queues: suppose two events are put in the queue while the worker thread is busy; the condition variable is set twice, but the worker thread is woken up once; what we need is the worker thread to be waken up twice.</p></div></div><p>Or just have the worker get both events out of the queue.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Thomas Fjellstrom)</author>
		<pubDate>Tue, 31 May 2011 22:45:32 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Something like this (just written by looking at Matthew&#39;s earlier example):</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">class</span> Worker <span class="k2">{</span>
<span class="number">  2</span>    Queue events<span class="k2">;</span>
<span class="number">  3</span>    <a href="http://www.allegro.cc/manual/ALLEGRO_MUTEX"><span class="a">ALLEGRO_MUTEX</span></a> mutex<span class="k2">;</span>
<span class="number">  4</span>    <a href="http://www.allegro.cc/manual/ALLEGRO_COND"><span class="a">ALLEGRO_COND</span></a> cond<span class="k2">;</span>
<span class="number">  5</span>
<span class="number">  6</span>    <span class="k1">void</span> run<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number">  7</span>        <span class="k1">while</span> <span class="k2">(</span><span class="k3">!</span><a href="http://www.allegro.cc/manual/al_get_thread_should_stop"><span class="a">al_get_thread_should_stop</span></a><span class="k2">(</span>thread<span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number">  8</span>            <a href="http://www.allegro.cc/manual/al_lock_mutex"><span class="a">al_lock_mutex</span></a><span class="k2">(</span>mutex<span class="k2">)</span><span class="k2">;</span>
<span class="number">  9</span>            <span class="k1">while</span> <span class="k2">(</span>events.is_empty<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 10</span>                <a href="http://www.allegro.cc/manual/al_wait_cond"><span class="a">al_wait_cond</span></a><span class="k2">(</span>cond, mutex<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 11</span>            <span class="k2">}</span>
<span class="number"> 12</span>            Event event <span class="k3">=</span> events.pop<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 13</span>            <a href="http://www.allegro.cc/manual/al_unlock_mutex"><span class="a">al_unlock_mutex</span></a><span class="k2">(</span>mutex<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 14</span>            event.work<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 15</span>        <span class="k2">}</span>
<span class="number"> 16</span>    <span class="k2">}</span>
<span class="number"> 17</span>
<span class="number"> 18</span>    <span class="k1">void</span> put<span class="k2">(</span>Event event<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 19</span>        <a href="http://www.allegro.cc/manual/al_lock_mutex"><span class="a">al_lock_mutex</span></a><span class="k2">(</span>mutex<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 20</span>        events.add<span class="k2">(</span>event<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 21</span>        <a href="http://www.allegro.cc/manual/al_broadcast_cond"><span class="a">al_broadcast_cond</span></a><span class="k2">(</span>cond<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 22</span>        <a href="http://www.allegro.cc/manual/al_unlock_mutex"><span class="a">al_unlock_mutex</span></a><span class="k2">(</span>mutex<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 23</span>    <span class="k2">}</span>
<span class="number"> 24</span><span class="k2">}</span>
</div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Elias)</author>
		<pubDate>Tue, 31 May 2011 23:52:45 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Wow, thanks axilmar and Elias, I&#39;ll be reading that the next few days. </p><p>&lt;quotes&gt;Anything you do in the constructor should be considered, if using objects directly in an STL container. The program seems to work fine for me (@ 0.5FPS).&lt;/quotes&gt;</p><p>Indeed, I was doing too many thing inside the constructor, now that I&#39;m checking the game in older computers and not so older computers I can see a very bad performance. I should be doing that all the time, and not rely only on mine.</p><p>What does mean the (@ 0.5FPS)? I don&#39;t have a FPS counter.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (AMCerasoli)</author>
		<pubDate>Wed, 01 Jun 2011 16:19:59 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/607420/919650#target">Elias</a> said:</div><div class="quote"><p>
Something like this (just written by looking at Matthew&#39;s earlier example):
</p></div></div><p>

Doesn&#39;t it have the problem of blocking, even if there is an event in the queue? for example, could the following take place?</p><ol><li><p>worker thread enters &#39;al_wait_cond&#39;
</p></li><li><p>worker thread unlocks the mutex &#39;mutex&#39;.
</p></li><li><p>another thread invokes function &#39;put&#39;. According to <a>the pthreads documentation</a>, &quot;if no threads are waiting on cond, nothing happens&quot;. At this point the worker thread is not waiting on the condition, so nothing happens.
</p></li><li><p>worker thread blocks on the condition &#39;cond&#39;.</p></li></ol><p>While the docs say that the operation condition wait operation is atomic, it also says &quot;pthread_cond_wait atomically unlocks the mutex (as per pthread_unlock_mutex)&quot;, so if it uses that function to unlock the mutex, another thread may signal the condition before the worker thread gets a chance to block on the condition.</p><p>Is the above possible?</p><p>EDIT:</p><p>According to <a href="http://pubs.opengroup.org/onlinepubs/007908799/xsh/pthread_cond_wait.html">this</a>:</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>These functions atomically release mutex and cause the calling thread to block on the condition variable cond; atomically here means &quot;atomically with respect to access by another thread to the mutex and then the condition variable&quot;. That is, if another thread is able to acquire the mutex after the about-to-block thread has released it, then a subsequent call to pthread_cond_signal() or pthread_cond_broadcast() in that thread behaves as if it were issued after the about-to-block thread has blocked.</p></div></div><p>

So, it seems like the solution posted above will work.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (axilmar)</author>
		<pubDate>Wed, 01 Jun 2011 16:53:16 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Yes. Basically, both the al_signal_cond and the al_wait_cond are protected by the mutex (a condition variable always needs an associated mutex). And that mutex behaves in the way the pthreads documentation says.</p><p>When someone calls put(), they first need to acquire the mutex. They can either do that because the worker thread is working and outside the locked section, in which case the new event is simply added. The subsequent signal will not be &quot;received&quot; by anyone.</p><p>Or alternatively, a put() call can get the mutex when the worker thread blocks in the al_cond_wait() call. In that case, the worker thread wakes up (after the al_unlock_mutex() in put), with the mutex locked. It now will re-check if the queue is empty and if it&#39;s not grab the next event.</p><p>However, I think the kernel scheduler is free to wake up any thread blocking on the mutex. So if there&#39;s 10 threads calling put() at the same time and 10 worker threads waiting on the condition variable, after the first put() signals one of the worker threads, any of the remaining 10 contenders for the lock (other 9 put() threads and the waked up worker) may run, not necessarily the worker thread. Not 100% sure on this, but I edited my post and changed al_signal_cond() to al_broadcast_cond() just in case <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" /> With broadcast(), all worker threads wake up, so now no matter in which order the (now 19) contenders obtain the lock, each worker will be working on one event after all the put() calls have been made.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Elias)</author>
		<pubDate>Wed, 01 Jun 2011 17:34:43 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Is the broadcast necessary? there is one wait condition per worker thread. No other thread will wait on that condition.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (axilmar)</author>
		<pubDate>Wed, 01 Jun 2011 19:06:09 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Depends on how the threads are scheduled. E.g. if at some point this happens with the * where each thread is, i.e. two threads call put and two workers are blocking:</p><p>thread1: * lock / put / signal / unlock<br />thread2: * lock / put / signal / unlock<br />worker1: lock / * wait / get / unlock<br />worker2: lock / * wait / get / unlock</p><p>Then what might happen, if things are implemented that way, is that thread1 is first called, signals worker1, unlocks the mutex and now thread2 obtains the mutex (not worker1), signals (randomly) worker1 again and unlocks. Now worker1 wakes up because it was signalled and takes one event. With broadcast this can&#39;t happen because worker2 always would have been signalled as well.</p><p>Most likely when worker 1 is signalled its state is changed from waiting to signalled and so thread2 would then wake worker2 with its signal (and not signal worker1 again). So broadcast would not be necessary. It can&#39;t hurt either though.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Elias)</author>
		<pubDate>Wed, 01 Jun 2011 19:25:28 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/607420/919729#target">Elias</a> said:</div><div class="quote"><p>
thread2 obtains the mutex (not worker1), signals (randomly) worker1 again and unlocks
</p></div></div><p>

I don&#39;t think that can happen. If thread2 signals cond2, then worker2 will be signaled, not worker1. </p><p>Unless you meant something else.</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
It can&#39;t hurt either though.
</p></div></div><p>

What about performance? internally, at the lowest level, when multiple threads are about to be awakened, there is a loop somewhere over the thread structures blocked on the wait condition. Whereas, when there is only one thread to awake, there is no such loop. </p><p>Granted, the difference is minor, but I think the fast path is on awakening 1 thread, not many. </p><p>It might make a difference somewhere, perhaps on lower-spec&#39;d machines like phones.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (axilmar)</author>
		<pubDate>Wed, 01 Jun 2011 20:01:23 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I have a (maybe stupid) question. </p><p>But, if I&#39;m completely sure that one thread is not going to be using the data that another thread is changing and stuff, I don&#39;t need to use mutex, right?</p><p>I don&#39;t want to stop the hole process but I&#39;m not going be touching the data that the other tread is manipulating until is done. So since the parent thread is going to be waiting for a flag to become true, using an <span class="source-code"><span class="k1">if</span></span> statement the only variable that I&#39;m going to lock using mutex is that one (the flag), right?.</p><p>Here is a scratch code, to get the idea.</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="number">  2</span><span class="k1">class</span> DATOS_SALONF_W<span class="k2">{</span>
<span class="number">  3</span>
<span class="number">  4</span>   public:
<span class="number">  5</span>
<span class="number">  6</span>      <a href="http://www.allegro.cc/manual/ALLEGRO_MUTEX"><span class="a">ALLEGRO_MUTEX</span></a>     <span class="k3">*</span>mutex<span class="k2">;</span>
<span class="number">  7</span>      <a href="http://www.allegro.cc/manual/ALLEGRO_COND"><span class="a">ALLEGRO_COND</span></a>      <span class="k3">*</span>cond<span class="k2">;</span>
<span class="number">  8</span>      <a href="http://www.allegro.cc/manual/ALLEGRO_USTR"><span class="a">ALLEGRO_USTR</span></a>      <span class="k3">*</span>names<span class="k2">[</span><span class="n">15</span><span class="k2">]</span><span class="k2">;</span>
<span class="number">  9</span>      <a href="http://www.allegro.cc/manual/ALLEGRO_USTR"><span class="a">ALLEGRO_USTR</span></a>      <span class="k3">*</span>tieme<span class="k2">[</span><span class="n">15</span><span class="k2">]</span><span class="k2">;</span>
<span class="number"> 10</span>      <a href="http://www.allegro.cc/manual/ALLEGRO_FONT"><span class="a">ALLEGRO_FONT</span></a>      <span class="k3">*</span><a href="http://www.allegro.cc/manual/font"><span class="a">font</span></a><span class="k2">;</span>
<span class="number"> 11</span>      std::string        string<span class="k2">;</span>
<span class="number"> 12</span>      <span class="k1">bool</span>               ready<span class="k2">;</span>
<span class="number"> 13</span>
<span class="number"> 14</span>      DATOS_SALONF_W<span class="k2">(</span><span class="k2">)</span> <span class="k2">:</span> mutex<span class="k2">(</span><a href="http://www.allegro.cc/manual/al_create_mutex"><span class="a">al_create_mutex</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">)</span>,
<span class="number"> 15</span>                         cond <span class="k2">(</span><a href="http://www.allegro.cc/manual/al_create_cond"><span class="a">al_create_cond</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">)</span>,
<span class="number"> 16</span>                         ready<span class="k2">(</span><span class="k1">false</span><span class="k2">)</span> <span class="k2">{</span><span class="k2">}</span>
<span class="number"> 17</span>
<span class="number"> 18</span><span class="k2">}</span><span class="k2">;</span>
<span class="number"> 19</span>
<span class="number"> 20</span><span class="k1">int</span> main<span class="k2">(</span><span class="k2">)</span><span class="k2">{</span>
<span class="number"> 21</span>
<span class="number"> 22</span>DATOS_SALONF_W data<span class="k2">;</span>
<span class="number"> 23</span>
<span class="number"> 24</span><a href="http://www.allegro.cc/manual/al_start_thread"><span class="a">al_start_thread</span></a><span class="k2">(</span>func_t,<span class="k3">&amp;</span>data<span class="k2">)</span>
<span class="number"> 25</span>
<span class="number"> 26</span>lock_mutex<span class="k2">(</span>data.mutex<span class="k2">)</span>
<span class="number"> 27</span>
<span class="number"> 28</span><span class="k1">if</span><span class="k2">(</span>data.ready<span class="k2">)</span><span class="k2">{</span>
<span class="number"> 29</span>
<span class="number"> 30</span>   
<span class="number"> 31</span>   <span class="c">// Here I will be using the data that the another thread processed,</span>
<span class="number"> 32</span>   <span class="c">// But I'm not going to use mutex anymore, because I know the thread</span>
<span class="number"> 33</span>   <span class="c">// Isn't running anymore.</span>
<span class="number"> 34</span>
<span class="number"> 35</span><span class="k2">}</span>
<span class="number"> 36</span>unlock_mutex<span class="k2">(</span>data.mutex<span class="k2">)</span> <span class="c">// I don't know where should I put this in case I want</span>
<span class="number"> 37</span>                         <span class="c">// To do something like this... Because while the child</span>
<span class="number"> 38</span>                         <span class="c">// thread is "alive" this is useful, but once the child</span>
<span class="number"> 39</span>                         <span class="c">// thread is "dead" I'm going to be locking a flag</span>
<span class="number"> 40</span>                         <span class="c">// that is going to be true until the program close...</span>
<span class="number"> 41</span>                         <span class="c">// so I think there is something wrong with my implementation.</span>
</div></div><p>

I think, <span class="source-code"><a href="http://www.allegro.cc/manual/al_wait_cond"><span class="a">al_wait_cond</span></a></span> in this case isn&#39;t useful, because I don&#39;t want to stop the hole thread. I want to show something while another thread is processing the rest, but I&#39;m 100% sure that there is another way... I need the concept. And the worker thread and semaphores is too complicated for such simple task, I think... </p><p><b>Edit:</b> I want to do this, to avoid using too many <span class="source-code"><a href="http://www.allegro.cc/manual/al_lock_mutex"><span class="a">al_lock_mutex</span></a></span> otherwise I could have more than one flag, and show resources when they&#39;re loaded, something like:</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="number">  2</span><a href="http://www.allegro.cc/manual/al_lock_mutex"><span class="a">al_lock_mutex</span></a><span class="k2">(</span><span class="k2">)</span>
<span class="number">  3</span><span class="k1">if</span><span class="k2">(</span>data.flag_bitmap<span class="k2">)</span><span class="k2">{</span>
<span class="number">  4</span>
<span class="number">  5</span><a href="http://www.allegro.cc/manual/al_draw_bitmap"><span class="a">al_draw_bitmap</span></a><span class="k2">(</span><span class="k2">)</span>
<span class="number">  6</span>
<span class="number">  7</span><span class="k2">}</span>
<span class="number">  8</span><a href="http://www.allegro.cc/manual/al_unlock_mutex"><span class="a">al_unlock_mutex</span></a><span class="k2">(</span><span class="k2">)</span>
<span class="number">  9</span>
<span class="number"> 10</span>
<span class="number"> 11</span><a href="http://www.allegro.cc/manual/al_lock_mutex"><span class="a">al_lock_mutex</span></a><span class="k2">(</span><span class="k2">)</span>
<span class="number"> 12</span><span class="k1">if</span><span class="k2">(</span>data.flag_fonts_ustr<span class="k2">)</span><span class="k2">{</span>
<span class="number"> 13</span>
<span class="number"> 14</span><a href="http://www.allegro.cc/manual/al_draw_text"><span class="a">al_draw_text</span></a><span class="k2">(</span><span class="k2">)</span>
<span class="number"> 15</span><a href="http://www.allegro.cc/manual/al_draw_ustr"><span class="a">al_draw_ustr</span></a><span class="k2">(</span><span class="k2">)</span>
<span class="number"> 16</span>
<span class="number"> 17</span><span class="k2">}</span>
<span class="number"> 18</span><a href="http://www.allegro.cc/manual/al_unlock_mutex"><span class="a">al_unlock_mutex</span></a><span class="k2">(</span><span class="k2">)</span>
<span class="number"> 19</span>
<span class="number"> 20</span>etc...
</div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (AMCerasoli)</author>
		<pubDate>Fri, 03 Jun 2011 17:58:03 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Quite strangely formed question, I might say. I&#39;d like to help you, but you are not very clear. </p><p>Here is what I understood so far: you want one thread to process some data and another thread to wait on the data and use them, right? So, for this to happen using flags, you don&#39;t need actually any mutexes or wait conditions, provided that the data are not processed by two or more threads at the same time.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (axilmar)</author>
		<pubDate>Fri, 03 Jun 2011 18:19:58 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>You got it right! <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" /></p><p>Thanks that is what I wanted know.</p><p>But the other thing that want to do, is not use mutex anymore once the data is loaded because I don&#39;t need it anymore. but I guess is impossible, I would need to make a Pre-load-code and a Post-load-code, and I think that is worst.</p><p>Right now I have not too muck time to explain myself but I&#39;ll come back with a conclusion. <img src="http://www.allegro.cc/forums/smileys/grin.gif" alt=";D" /></p><p><b>Edit:</b> <span class="source-code"><a href="http://www.allegro.cc/manual/al_lock_mutex"><span class="a">al_lock_mutex</span></a></span> is too slow? because I realize that is my problem. I don&#39;t want to use <span class="source-code"><a href="http://www.allegro.cc/manual/al_lock_mutex"><span class="a">al_lock_mutex</span></a></span> not even to check the flag variable once I have loaded all the resources <img src="http://www.allegro.cc/forums/smileys/rolleyes.gif" alt="::)" /> ... But I guess there is no problem doing so.</p><p>And, if I load all the data in another thread because is too slow to load it in the object constructor, then I need to destroy the resources in another thread, or destroying is faster? oh oh...  <img src="http://www.allegro.cc/forums/smileys/undecided.gif" alt=":-/" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (AMCerasoli)</author>
		<pubDate>Fri, 03 Jun 2011 19:07:12 +0000</pubDate>
	</item>
</rss>
