<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>A5 threads - is it what I need ?</title>
		<link>http://www.allegro.cc/forums/view/608120</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Thu, 18 Aug 2011 09:00:40 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>hi Guys,</p><p>I&#39;ve got some code which uses three bitmaps and scrolls them past the screen from bottom to top.</p><p>A maximum of two of these bitmaps have parts which get drawn to the screen at any one time. The third one hangs in waiting. A time comes when one of bitmaps needs to be remade (by a function that uses random numbers to make all the bitmaps). When a bitmap has scrolled all the way past the screen - it gets remade. The thing is, when the bitmap is being remade the scrolling jerks becaise it takes time to make.</p><p>I thought perhaps I could use an ALLEGRO_THREAD to start making the bitmap at the earliest moment so it&#39;s ready when it&#39;s needed.</p><p>Is this possible ? Am I thinking along the right lines ?</p><p>I&#39;ve no idea how to do it. I&#39;ve looked at the example on the wiki but don&#39;t understand it.</p><p>Any help for this would be greatly appreciated.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (William Labbett)</author>
		<pubDate>Thu, 18 Aug 2011 03:08:21 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>It sounds like you could use a thread. Something like this should get you started:</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">void</span> <span class="k3">*</span>make_bitmap<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>data<span class="k2">)</span>
<span class="number">  2</span><span class="k2">{</span>
<span class="number">  3</span>  <a href="http://www.allegro.cc/manual/ALLEGRO_BITMAP"><span class="a">ALLEGRO_BITMAP</span></a> <span class="k3">*</span>bmp <span class="k3">=</span> <span class="k2">(</span><a href="http://www.allegro.cc/manual/ALLEGRO_BITMAP"><span class="a">ALLEGRO_BITMAP</span></a> <span class="k3">*</span><span class="k2">)</span> data<span class="k2">;</span>
<span class="number">  4</span>  <span class="c">// al_lock_bitmap()</span>
<span class="number">  5</span>  <span class="c">// draw on bitmap</span>
<span class="number">  6</span>  <span class="c">// al_unlock_bitmap()</span>
<span class="number">  7</span>  <span class="k1">return</span> NULL<span class="k2">;</span>
<span class="number">  8</span><span class="k2">}</span>
<span class="number">  9</span>
<span class="number"> 10</span><span class="c">// when it's okay to build the bitmap:</span>
<span class="number"> 11</span><a href="http://www.allegro.cc/manual/ALLEGRO_BITMAP"><span class="a">ALLEGRO_BITMAP</span></a> <span class="k3">*</span>bmp <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><span class="n">640</span>,<span class="n">480</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 12</span><a href="http://www.allegro.cc/manual/ALLEGRO_THREAD"><span class="a">ALLEGRO_THREAD</span></a> <span class="k3">*</span>t <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>make_bitmap, bmp<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 13</span><a href="http://www.allegro.cc/manual/al_start_thread"><span class="a">al_start_thread</span></a><span class="k2">(</span>t<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 14</span>
<span class="number"> 15</span><span class="c">// when you need the bitmap:</span>
<span class="number"> 16</span><a href="http://www.allegro.cc/manual/al_join_thread"><span class="a">al_join_thread</span></a><span class="k2">(</span>t, NULL<span class="k2">)</span><span class="k2">;</span>  <span class="c">// hopefully the bitmap is already created by now. if not, it will wait for the thread to end</span>
<span class="number"> 17</span><a href="http://www.allegro.cc/manual/al_draw_bitmap"><span class="a">al_draw_bitmap</span></a><span class="k2">(</span>bmp, <span class="n">0</span>,<span class="n">0</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
</div></div><p>

If your &quot;make_bitmap&quot; needs more than one parameter, then you could create a struct and pass that instead:</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">typedef</span> <span class="k1">struct</span> MAKE_BMP_ARGS <span class="k2">{</span>
  <a href="http://www.allegro.cc/manual/ALLEGRO_BITMAP"><span class="a">ALLEGRO_BITMAP</span></a> <span class="k3">*</span>bmp<span class="k2">;</span>
  <span class="k1">int</span> param1<span class="k2">;</span>
<span class="k2">}</span> MAKE_BMP_ARGS<span class="k2">;</span>

MAKE_BMP_ARGS args<span class="k2">;</span>
args.bmp <span class="k3">=</span> bmp<span class="k2">;</span>
args.param1 <span class="k3">=</span> foo<span class="k2">;</span>

<a href="http://www.allegro.cc/manual/ALLEGRO_THREAD"><span class="a">ALLEGRO_THREAD</span></a> <span class="k3">*</span>t <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>make_bitmap, args<span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Matthew Leverton)</author>
		<pubDate>Thu, 18 Aug 2011 03:14:41 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Thanks Matthew.</p><p>If I use a class method for the function pointer can I use class member variables or should do what you said and use a struct ?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (William Labbett)</author>
		<pubDate>Thu, 18 Aug 2011 03:34:44 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>You won&#39;t be able to use a class method directly, unless it&#39;s static. You could do something like this instead:</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">void</span> <span class="k3">*</span>make_bitmap<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>data<span class="k2">)</span>
<span class="k2">{</span>
  MyClass <span class="k3">*</span>obj  <span class="k3">=</span> <span class="k2">(</span>MyClass <span class="k3">*</span><span class="k2">)</span> data<span class="k2">;</span>
  obj-&gt;doSomething<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
  <span class="k1">return</span> NULL<span class="k2">;</span>
<span class="k2">}</span>

MyClass <span class="k3">*</span>obj <span class="k3">=</span> <span class="k1">new</span> MyClass<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
obj-&gt;bmp <span class="k3">=</span> bmp<span class="k2">;</span>
<a href="http://www.allegro.cc/manual/ALLEGRO_THREAD"><span class="a">ALLEGRO_THREAD</span></a> <span class="k3">*</span>t <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>make_bitmap, obj<span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p>

You could turn <span class="source-code">make_bitmap</span> into a static method of the class, but it would still need to work like the above example.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Matthew Leverton)</author>
		<pubDate>Thu, 18 Aug 2011 03:38:01 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>See my response about using a class method <a href="http://www.allegro.cc/forums/thread/608082/928004#target">over in this thread</a>.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Thu, 18 Aug 2011 03:40:13 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Thanks. I can&#39;t quite see how to do it yet (unless I go the struct way).</p><p>Here&#39;s the method :-</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">void</span> Backdrop::Update_Position<span class="k2">(</span><span class="k1">void</span><span class="k2">)</span>
<span class="number">  3</span><span class="k2">{</span>
<span class="number">  4</span>   
<span class="number">  5</span>   <a href="http://www.allegro.cc/manual/ALLEGRO_THREAD"><span class="a">ALLEGRO_THREAD</span></a> <span class="k3">*</span>t<span class="k2">;</span>
<span class="number">  6</span>
<span class="number">  7</span>   <span class="k3">+</span><span class="k3">+</span>bottom_backdrop_draw_from<span class="k2">;</span>
<span class="number">  8</span>   
<span class="number">  9</span>   <span class="k1">if</span><span class="k2">(</span>bottom_backdrop_draw_from <span class="k3">&gt;</span> BACKDROP_HEIGHT_IN_PIXELS<span class="k2">)</span>
<span class="number"> 10</span>   <span class="k2">{</span>
<span class="number"> 11</span>      
<span class="number"> 12</span>   
<span class="number"> 13</span>      bottom_backdrop_draw_from <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 14</span>    
<span class="number"> 15</span>    dinkle_set_up_tiles<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 16</span>    
<span class="number"> 17</span>      <span class="k1">switch</span><span class="k2">(</span>current_bottom_backdrop<span class="k2">)</span>
<span class="number"> 18</span>    <span class="k2">{</span>
<span class="number"> 19</span>       <span class="k1">case</span> <span class="n">0</span><span class="k2">:</span>
<span class="number"> 20</span>     
<span class="number"> 21</span>        b1 <span class="k3">=</span> dinkle_get_connecting_blot<span class="k2">(</span>backdrop_width, backdrop_height, <span class="k3">&amp;</span>ratios, b3_tiles, b1_tiles, bg_colors<span class="k2">[</span><span class="n">0</span><span class="k2">]</span>, bg_colors<span class="k2">[</span><span class="n">1</span><span class="k2">]</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 22</span>            <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 23</span>     <span class="k1">case</span> <span class="n">1</span><span class="k2">:</span>
<span class="number"> 24</span>          b2 <span class="k3">=</span> dinkle_get_connecting_blot<span class="k2">(</span>backdrop_width, backdrop_height, <span class="k3">&amp;</span>ratios, b1_tiles, b2_tiles, bg_colors<span class="k2">[</span><span class="n">0</span><span class="k2">]</span>, bg_colors<span class="k2">[</span><span class="n">1</span><span class="k2">]</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 25</span>      <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 26</span>         <span class="k1">case</span> <span class="n">2</span><span class="k2">:</span>
<span class="number"> 27</span>        b3 <span class="k3">=</span> dinkle_get_connecting_blot<span class="k2">(</span>backdrop_width, backdrop_height, <span class="k3">&amp;</span>ratios, b2_tiles, b3_tiles, bg_colors<span class="k2">[</span><span class="n">0</span><span class="k2">]</span>, bg_colors<span class="k2">[</span><span class="n">1</span><span class="k2">]</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 28</span>            <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 29</span>    <span class="k2">}</span>
<span class="number"> 30</span>    
<span class="number"> 31</span>    dinkle_free_tiles<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 32</span>    
<span class="number"> 33</span>      <span class="k3">+</span><span class="k3">+</span>current_bottom_backdrop<span class="k2">;</span>
<span class="number"> 34</span>      <span class="k1">if</span><span class="k2">(</span>current_bottom_backdrop <span class="k3">&gt;</span> <span class="n">2</span><span class="k2">)</span> current_bottom_backdrop <span class="k3">=</span> <span class="n">0</span><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="number"> 38</span><span class="k2">}</span>
</div></div><p>



What I need to happen in the thread is one of the three lines like this :-</p><p> b1 = dinkle_get_connecting_blot(backdrop_width, backdrop_height, &amp;ratios, b3_tiles, b1_tiles, bg_colors[0], bg_colors[1]);</p><p>b1 is a member of Backdrop as are all the arguments to dinkle_get_connecting_blot().
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (William Labbett)</author>
		<pubDate>Thu, 18 Aug 2011 03:47:11 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>What calls <span class="source-code">Backdrop::Update_Position</span>? Is that the single function that is slowing everything down?</p><p>If so, then take my example and call <span class="source-code"><span class="k3">-</span><span class="k3">&gt;</span>Update_Position<span class="k2">(</span><span class="k2">)</span></span> on the <span class="source-code"><span class="k1">void</span> <span class="k3">*</span></span> argument that the thread function gets.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Matthew Leverton)</author>
		<pubDate>Thu, 18 Aug 2011 03:52:44 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Thanks again guys. I&#39;ve gone for Matthews way as I understand it.</p><p>I&#39;ve made some progress - here&#39;s what I&#39;ve got. Something&#39;s going wrong though I think because the Update function is taking less time now - I&#39;m not sure the thread finishes before another one starts.</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">void</span> Backdrop::Update_Position<span class="k2">(</span><span class="k1">void</span><span class="k2">)</span>
<span class="number">  2</span><span class="k2">{</span>
<span class="number">  3</span>   <span class="k3">+</span><span class="k3">+</span>bottom_backdrop_draw_from<span class="k2">;</span>
<span class="number">  4</span>   
<span class="number">  5</span>   <span class="k1">if</span><span class="k2">(</span>bottom_backdrop_draw_from <span class="k3">&gt;</span> BACKDROP_HEIGHT_IN_PIXELS<span class="k2">)</span>
<span class="number">  6</span>   <span class="k2">{</span>
<span class="number">  7</span>      bottom_backdrop_draw_from <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number">  8</span>    
<span class="number">  9</span>    <a href="http://www.allegro.cc/manual/ALLEGRO_THREAD"><span class="a">ALLEGRO_THREAD</span></a> <span class="k3">*</span>t<span class="k2">;</span>
<span class="number"> 10</span>    
<span class="number"> 11</span>    t <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>make_bitmap, <span class="k1">this</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 12</span>    <a href="http://www.allegro.cc/manual/al_start_thread"><span class="a">al_start_thread</span></a><span class="k2">(</span>t<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 13</span>    
<span class="number"> 14</span>      <span class="k3">+</span><span class="k3">+</span>current_bottom_backdrop<span class="k2">;</span>
<span class="number"> 15</span>      <span class="k1">if</span><span class="k2">(</span>current_bottom_backdrop <span class="k3">&gt;</span> <span class="n">2</span><span class="k2">)</span> current_bottom_backdrop <span class="k3">=</span> <span class="n">0</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="number"> 19</span><span class="k2">}</span>
<span class="number"> 20</span>
<span class="number"> 21</span>
<span class="number"> 22</span>
<span class="number"> 23</span><span class="k1">void</span> Backdrop::Make_New_Blot<span class="k2">(</span><span class="k2">)</span>
<span class="number"> 24</span><span class="k2">{</span>
<span class="number"> 25</span>    dinkle_set_up_tiles<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 26</span>    
<span class="number"> 27</span>      <span class="k1">switch</span><span class="k2">(</span>current_bottom_backdrop<span class="k2">)</span>
<span class="number"> 28</span>    <span class="k2">{</span>
<span class="number"> 29</span>       <span class="k1">case</span> <span class="n">0</span><span class="k2">:</span>
<span class="number"> 30</span>        b1 <span class="k3">=</span> dinkle_get_connecting_blot<span class="k2">(</span>backdrop_width, backdrop_height, <span class="k3">&amp;</span>ratios, b3_tiles, b1_tiles, bg_colors<span class="k2">[</span><span class="n">0</span><span class="k2">]</span>, bg_colors<span class="k2">[</span><span class="n">1</span><span class="k2">]</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 31</span>            <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 32</span>     <span class="k1">case</span> <span class="n">1</span><span class="k2">:</span>
<span class="number"> 33</span>          b2 <span class="k3">=</span> dinkle_get_connecting_blot<span class="k2">(</span>backdrop_width, backdrop_height, <span class="k3">&amp;</span>ratios, b1_tiles, b2_tiles, bg_colors<span class="k2">[</span><span class="n">0</span><span class="k2">]</span>, bg_colors<span class="k2">[</span><span class="n">1</span><span class="k2">]</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 34</span>      <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 35</span>         <span class="k1">case</span> <span class="n">2</span><span class="k2">:</span>
<span class="number"> 36</span>        b3 <span class="k3">=</span> dinkle_get_connecting_blot<span class="k2">(</span>backdrop_width, backdrop_height, <span class="k3">&amp;</span>ratios, b2_tiles, b3_tiles, bg_colors<span class="k2">[</span><span class="n">0</span><span class="k2">]</span>, bg_colors<span class="k2">[</span><span class="n">1</span><span class="k2">]</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 37</span>            <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 38</span>    <span class="k2">}</span>
<span class="number"> 39</span>    
<span class="number"> 40</span>    dinkle_free_tiles<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 41</span>
<span class="number"> 42</span>  
<span class="number"> 43</span>
<span class="number"> 44</span><span class="k2">}</span>
<span class="number"> 45</span>
<span class="number"> 46</span>
<span class="number"> 47</span>
<span class="number"> 48</span>
<span class="number"> 49</span>
<span class="number"> 50</span><span class="k1">void</span> <span class="k3">*</span>make_bitmap<span class="k2">(</span><a href="http://www.allegro.cc/manual/ALLEGRO_THREAD"><span class="a">ALLEGRO_THREAD</span></a> <span class="k3">*</span>t, <span class="k1">void</span> <span class="k3">*</span>data<span class="k2">)</span>
<span class="number"> 51</span><span class="k2">{</span>
<span class="number"> 52</span>   Backdrop <span class="k3">*</span>obj <span class="k3">=</span> <span class="k2">(</span>Backdrop <span class="k3">*</span><span class="k2">)</span> data<span class="k2">;</span>
<span class="number"> 53</span>
<span class="number"> 54</span>   obj-&gt;Make_New_Blot<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 55</span>
<span class="number"> 56</span>   <span class="k1">return</span> NULL<span class="k2">;</span>
<span class="number"> 57</span><span class="k2">}</span>
</div></div><p>


EDIT : I put an al_join_thread in there but the problem&#39;s still there so it&#39;s something else.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (William Labbett)</author>
		<pubDate>Thu, 18 Aug 2011 04:30:16 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Think about when you need to have the thread finished by, and call al_join_thread then. Don&#39;t forget to use al_destroy_thread or you&#39;re leaking memory (Make the thread a class member).
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Thu, 18 Aug 2011 08:52:41 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I cannot tell from your code exactly how things are working. For it to be effective, you must let the thread do its thing while you continue on with the other stuff.</p><p>For example this does nothing useful, as you are not doing anything in between the start and join:
</p><div class="source-code snippet"><div class="inner"><pre>t <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>make_bitmap, <span class="k1">this</span><span class="k2">)</span><span class="k2">;</span>
<a href="http://www.allegro.cc/manual/al_start_thread"><span class="a">al_start_thread</span></a><span class="k2">(</span>t<span class="k2">)</span><span class="k2">;</span>
<a href="http://www.allegro.cc/manual/al_join_thread"><span class="a">al_join_thread</span></a><span class="k2">(</span>t, NULL<span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Matthew Leverton)</author>
		<pubDate>Thu, 18 Aug 2011 09:00:40 +0000</pubDate>
	</item>
</rss>
