<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Patrick Leblanc's Blog &#187; Threads</title>
	<atom:link href="http://www.pleblanc.com/tag/threads/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.pleblanc.com</link>
	<description></description>
	<lastBuildDate>Wed, 25 Aug 2010 22:00:36 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Managing multiple threads in C# with a GUI</title>
		<link>http://www.pleblanc.com/2009/06/managing-multiple-threads-in-c-with-a-gui/</link>
		<comments>http://www.pleblanc.com/2009/06/managing-multiple-threads-in-c-with-a-gui/#comments</comments>
		<pubDate>Sun, 21 Jun 2009 21:19:24 +0000</pubDate>
		<dc:creator>Patrick Leblanc</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[Delegates]]></category>
		<category><![CDATA[GUI]]></category>
		<category><![CDATA[Threads]]></category>

		<guid isPermaLink="false">http://www.pleblanc.com/?p=39</guid>
		<description><![CDATA[Objective: manage multiple threads from]]></description>
			<content:encoded><![CDATA[<p><strong>Objective</strong>: manage multiple threads from C# with a responsive GUI<br />
<strong>Description:</strong>: In this example, I simulate encoding from a source that is splittable in segments. It could be the b-frames between I-frames in a video or even some sort of audio codec. To simulate the workload, I use Thread.Sleep(TimeInMs).</p>
<p><a href="http://www.pleblanc.com/wp-content/uploads/2009/06/bggui.png"><img src="http://www.pleblanc.com/wp-content/uploads/2009/06/bggui-150x150.png" alt="bggui" title="bggui" width="150" height="150" class="alignnone size-thumbnail wp-image-47" /></a></p>
<p>For this code, I have 4 threads working on a source to encode of 10 segments. Each threads will take a slice to encode, process it and reassemble the end result in an array, that can be utilized by another process to unify the encoded version, for example.</p>
<p>A word of caution though: although working with threads can be useful in some cases it also complicates the code quite a bit, especially at debugging. It&#8217;s much harder to keep track of what is going on.</p>
<p>Here is the code in the windows form (download the whole project in VS2008 at the end):</p>
<p><span id="more-39"></span></p>

<div class="wp_syntax"><div class="code"><pre class="csharp" style="font-family:monospace;">&nbsp;
<span style="color: #0600FF;">namespace</span> bgGUI
<span style="color: #000000;">&#123;</span>
&nbsp;
<span style="color: #0600FF;">using</span> <span style="color: #008080;">System</span><span style="color: #008000;">;</span>
<span style="color: #0600FF;">using</span> <span style="color: #008080;">System.Collections</span><span style="color: #008000;">;</span>
<span style="color: #0600FF;">using</span> <span style="color: #008080;">System.ComponentModel</span><span style="color: #008000;">;</span>
<span style="color: #0600FF;">using</span> <span style="color: #008080;">System.Data</span><span style="color: #008000;">;</span>
<span style="color: #0600FF;">using</span> <span style="color: #008080;">System.Drawing</span><span style="color: #008000;">;</span>
<span style="color: #0600FF;">using</span> <span style="color: #008080;">System.Linq</span><span style="color: #008000;">;</span>
<span style="color: #0600FF;">using</span> <span style="color: #008080;">System.Text</span><span style="color: #008000;">;</span>
<span style="color: #0600FF;">using</span> <span style="color: #008080;">System.Windows.Forms</span><span style="color: #008000;">;</span>
<span style="color: #0600FF;">using</span> <span style="color: #008080;">System.Threading</span><span style="color: #008000;">;</span>
&nbsp;
    <span style="color: #0600FF;">public</span> <span style="color: #0600FF;">partial</span> <span style="color: #FF0000;">class</span> Form1 <span style="color: #008000;">:</span> Form
    <span style="color: #000000;">&#123;</span>
        <span style="color: #FF0000;">delegate</span> <span style="color: #0600FF;">void</span> setTextBoxTextCallback<span style="color: #000000;">&#40;</span>ArrayList a<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #FF0000;">delegate</span> <span style="color: #0600FF;">void</span> setLabelTextCallback<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">string</span> s, Label l<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span> <span style="color: #008080; font-style: italic;">//delegate used to set the text on a label in a Invoke operation</span>
        ArrayList videoSegments<span style="color: #008000;">;</span> <span style="color: #008080; font-style: italic;">//Imagine this as a collection video/audio segments we need to compute.</span>
        <span style="color: #FF0000;">int</span> workingIndex<span style="color: #008000;">;</span> <span style="color: #008080; font-style: italic;">// This is to track where we're at in the videoSegments during the process.</span>
        <span style="color: #FF0000;">object</span> lockObject <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> <span style="color: #FF0000;">object</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span> <span style="color: #008080; font-style: italic;">// the lock object used for the thread to safely pick a new segment to compute.</span>
&nbsp;
        <span style="color: #0600FF;">public</span> Form1<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>
            InitializeComponent<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #000000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF;">private</span> <span style="color: #0600FF;">void</span> Form1_Load<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">object</span> sender, EventArgs e<span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>
            <span style="color: #008080; font-style: italic;">//Here we're gonna fake that the stack of videoSegements is full of 10 slice to encode.</span>
            videoSegments <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> ArrayList<span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
            <span style="color: #0600FF;">for</span> <span style="color: #000000;">&#40;</span><span style="color: #FF0000;">int</span> i <span style="color: #008000;">=</span> <span style="color: #FF0000;">0</span><span style="color: #008000;">;</span> i <span style="color: #008000;">&lt;</span> <span style="color: #FF0000;">20</span><span style="color: #008000;">;</span> i<span style="color: #008000;">++</span><span style="color: #000000;">&#41;</span>
            <span style="color: #000000;">&#123;</span>
                videoSegments.<span style="color: #0000FF;">Add</span><span style="color: #000000;">&#40;</span><span style="color: #666666;">&quot;this is segement &quot;</span> <span style="color: #008000;">+</span> i<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span><span style="color: #008080; font-style: italic;">//for the purpose of the demonstration I'm adding a string and its index.</span>
            <span style="color: #000000;">&#125;</span>
&nbsp;
            workingIndex <span style="color: #008000;">=</span> videoSegments.<span style="color: #0000FF;">Count</span> <span style="color: #008000;">-</span> <span style="color: #FF0000;">1</span><span style="color: #008000;">;</span>
            label5.<span style="color: #0000FF;">Text</span> <span style="color: #008000;">=</span> videoSegments.<span style="color: #0000FF;">Count</span>.<span style="color: #0000FF;">ToString</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
            <span style="color: #008080; font-style: italic;">//We're starting 4 different thread with parameters (hence the use of the ParameterizedThreadStart Delegate)</span>
            <span style="color: #008080; font-style: italic;">//Becareful though as ParameterizedThreadStart Start method only takes an objet argument. Therefore it's not type safe.</span>
            <span style="color: #008080; font-style: italic;">//an alternative, type safe way of doing it is to create an helper class. and start it with ThreadStart</span>
            <span style="color: #008080; font-style: italic;">//more details here: http://msdn.microsoft.com/en-us/library/ts553s52.aspx</span>
            <span style="color: #008080; font-style: italic;">//In my example, I pass as argument an anonymous object containing a Label and an int which is the a time interval in ms. </span>
            <span style="color: #008080; font-style: italic;">//(the interval is used to simulate heavy load.)</span>
            Thread t1 <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> Thread<span style="color: #000000;">&#40;</span><span style="color: #008000;">new</span> ParameterizedThreadStart<span style="color: #000000;">&#40;</span>tsChangeLabelText<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            t1.<span style="color: #0000FF;">Start</span><span style="color: #000000;">&#40;</span><span style="color: #008000;">new</span> <span style="color: #FF0000;">object</span><span style="color: #000000;">&#91;</span><span style="color: #000000;">&#93;</span> <span style="color: #000000;">&#123;</span> label1, <span style="color: #FF0000;">2500</span> <span style="color: #000000;">&#125;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
            Thread t2 <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> Thread<span style="color: #000000;">&#40;</span><span style="color: #008000;">new</span> ParameterizedThreadStart<span style="color: #000000;">&#40;</span>tsChangeLabelText<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            t2.<span style="color: #0000FF;">Start</span><span style="color: #000000;">&#40;</span><span style="color: #008000;">new</span> <span style="color: #FF0000;">object</span><span style="color: #000000;">&#91;</span><span style="color: #000000;">&#93;</span> <span style="color: #000000;">&#123;</span> label2, <span style="color: #FF0000;">3500</span> <span style="color: #000000;">&#125;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
            Thread t3 <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> Thread<span style="color: #000000;">&#40;</span><span style="color: #008000;">new</span> ParameterizedThreadStart<span style="color: #000000;">&#40;</span>tsChangeLabelText<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            t3.<span style="color: #0000FF;">Start</span><span style="color: #000000;">&#40;</span><span style="color: #008000;">new</span> <span style="color: #FF0000;">object</span><span style="color: #000000;">&#91;</span><span style="color: #000000;">&#93;</span> <span style="color: #000000;">&#123;</span> label3, <span style="color: #FF0000;">1000</span> <span style="color: #000000;">&#125;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
            Thread t4 <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> Thread<span style="color: #000000;">&#40;</span><span style="color: #008000;">new</span> ParameterizedThreadStart<span style="color: #000000;">&#40;</span>tsChangeLabelText<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
            t4.<span style="color: #0000FF;">Start</span><span style="color: #000000;">&#40;</span><span style="color: #008000;">new</span> <span style="color: #FF0000;">object</span><span style="color: #000000;">&#91;</span><span style="color: #000000;">&#93;</span> <span style="color: #000000;">&#123;</span> label4, <span style="color: #FF0000;">1250</span> <span style="color: #000000;">&#125;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
        <span style="color: #000000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF;">private</span> <span style="color: #0600FF;">void</span> tsChangeLabelText<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">object</span> o<span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>
&nbsp;
            <span style="color: #008080; font-style: italic;">//we cast the object as an array.</span>
            <span style="color: #008080; font-style: italic;">//then we extract the first object at index[x], then we cast it to what we want</span>
            <span style="color: #008080; font-style: italic;">//as i said earlier, it's not type safe. use it with caution!</span>
            Label l <span style="color: #008000;">=</span> <span style="color: #000000;">&#40;</span>Label<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#40;</span><span style="color: #FF0000;">object</span><span style="color: #000000;">&#91;</span><span style="color: #000000;">&#93;</span><span style="color: #000000;">&#41;</span>o<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#91;</span><span style="color: #FF0000;">0</span><span style="color: #000000;">&#93;</span><span style="color: #008000;">;</span>
            <span style="color: #FF0000;">int</span> ms <span style="color: #008000;">=</span> <span style="color: #000000;">&#40;</span><span style="color: #FF0000;">int</span><span style="color: #000000;">&#41;</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#40;</span><span style="color: #FF0000;">object</span><span style="color: #000000;">&#91;</span><span style="color: #000000;">&#93;</span><span style="color: #000000;">&#41;</span>o<span style="color: #000000;">&#41;</span><span style="color: #000000;">&#91;</span><span style="color: #FF0000;">1</span><span style="color: #000000;">&#93;</span><span style="color: #008000;">;</span><span style="color: #008080; font-style: italic;">// the ms is just to simulate heavy load on the thread</span>
&nbsp;
            <span style="color: #FF0000;">int</span> insideIndex <span style="color: #008000;">=</span> <span style="color: #FF0000;">0</span><span style="color: #008000;">;</span> <span style="color: #008080; font-style: italic;">// This will be the index we're going to compute</span>
&nbsp;
            <span style="color: #0600FF;">while</span> <span style="color: #000000;">&#40;</span>workingIndex <span style="color: #008000;">&gt;=</span> <span style="color: #FF0000;">0</span><span style="color: #000000;">&#41;</span> <span style="color: #008080; font-style: italic;">// the thread will go on until all the segments have been computed</span>
            <span style="color: #000000;">&#123;</span>
                <span style="color: #0600FF;">lock</span> <span style="color: #000000;">&#40;</span>lockObject<span style="color: #000000;">&#41;</span> <span style="color: #008080; font-style: italic;">// we request a lock on the object. If successful, all the other threads will wait for this to unlock.</span>
                <span style="color: #000000;">&#123;</span>
                    <span style="color: #008080; font-style: italic;">//We have to check again if there are segments remaining!</span>
                    <span style="color: #008080; font-style: italic;">//indeed, another thread could have snatched the last one between our 'while' and this lock!</span>
&nbsp;
                    <span style="color: #0600FF;">if</span> <span style="color: #000000;">&#40;</span>workingIndex <span style="color: #008000;">&gt;</span> <span style="color: #008000;">-</span><span style="color: #FF0000;">1</span><span style="color: #000000;">&#41;</span>
                    <span style="color: #000000;">&#123;</span>
                        insideIndex <span style="color: #008000;">=</span> workingIndex<span style="color: #008000;">;</span> <span style="color: #008080; font-style: italic;">//We're going to compute the segment located at this index in our collection;</span>
                        workingIndex<span style="color: #008000;">--;</span><span style="color: #008080; font-style: italic;">//The other threads will be able to go to the next one after the end of the lock</span>
                    <span style="color: #000000;">&#125;</span>
                <span style="color: #000000;">&#125;</span><span style="color: #008080; font-style: italic;">// now all other threads (those waiting for permission to use the lock)</span>
                <span style="color: #008080; font-style: italic;">// will be able to check what the working index is and pick the next segment.</span>
&nbsp;
                <span style="color: #008080; font-style: italic;">//we display infos on the GUI using invoke since it's not the owner thread.</span>
                setLabelTextCallback d <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> setLabelTextCallback<span style="color: #000000;">&#40;</span>setLabelText<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
                setTextBoxTextCallback z <span style="color: #008000;">=</span> <span style="color: #008000;">new</span> setTextBoxTextCallback<span style="color: #000000;">&#40;</span>setTextBoxText<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
                <span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">Invoke</span><span style="color: #000000;">&#40;</span>d, <span style="color: #008000;">new</span> <span style="color: #FF0000;">object</span><span style="color: #000000;">&#91;</span><span style="color: #000000;">&#93;</span> <span style="color: #000000;">&#123;</span> <span style="color: #666666;">&quot;Working on segment #&quot;</span> <span style="color: #008000;">+</span> insideIndex, l <span style="color: #000000;">&#125;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
                <span style="color: #008080; font-style: italic;">//---------------------------</span>
                Thread.<span style="color: #0000FF;">Sleep</span><span style="color: #000000;">&#40;</span>ms<span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span> <span style="color: #008080; font-style: italic;">// simulate the heavy load of the Encoding</span>
                <span style="color: #008080; font-style: italic;">//---------------------------</span>
&nbsp;
                <span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">Invoke</span><span style="color: #000000;">&#40;</span>d, <span style="color: #008000;">new</span> <span style="color: #FF0000;">object</span><span style="color: #000000;">&#91;</span><span style="color: #000000;">&#93;</span> <span style="color: #000000;">&#123;</span> <span style="color: #666666;">&quot;DONE WITH segment #&quot;</span> <span style="color: #008000;">+</span> insideIndex, l <span style="color: #000000;">&#125;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
                videoSegments<span style="color: #000000;">&#91;</span>insideIndex<span style="color: #000000;">&#93;</span> <span style="color: #008000;">=</span> <span style="color: #000000;">&#40;</span><span style="color: #FF0000;">string</span><span style="color: #000000;">&#41;</span>videoSegments<span style="color: #000000;">&#91;</span>insideIndex<span style="color: #000000;">&#93;</span> <span style="color: #008000;">+</span> <span style="color: #666666;">&quot; - COMPUTED&quot;</span><span style="color: #008000;">;</span> <span style="color: #008080; font-style: italic;">// let's say that we replaced the old segement with the new one</span>
                <span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">Invoke</span><span style="color: #000000;">&#40;</span>z, <span style="color: #008000;">new</span> <span style="color: #FF0000;">object</span><span style="color: #000000;">&#91;</span><span style="color: #000000;">&#93;</span> <span style="color: #000000;">&#123;</span> videoSegments <span style="color: #000000;">&#125;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
                <span style="color: #0600FF;">this</span>.<span style="color: #0000FF;">Invoke</span><span style="color: #000000;">&#40;</span>d, <span style="color: #008000;">new</span> <span style="color: #FF0000;">object</span><span style="color: #000000;">&#91;</span><span style="color: #000000;">&#93;</span> <span style="color: #000000;">&#123;</span> <span style="color: #000000;">&#40;</span>workingIndex <span style="color: #008000;">+</span> <span style="color: #FF0000;">1</span><span style="color: #000000;">&#41;</span>.<span style="color: #0000FF;">ToString</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span>, label5 <span style="color: #000000;">&#125;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
&nbsp;
                Thread.<span style="color: #0000FF;">Sleep</span><span style="color: #000000;">&#40;</span><span style="color: #FF0000;">3000</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span><span style="color: #008080; font-style: italic;">//this is only for you to see what's going on</span>
&nbsp;
            <span style="color: #000000;">&#125;</span>
&nbsp;
        <span style="color: #000000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF;">private</span> <span style="color: #0600FF;">void</span> setLabelText<span style="color: #000000;">&#40;</span><span style="color: #FF0000;">string</span> s, Label l<span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>
            l.<span style="color: #0000FF;">Text</span> <span style="color: #008000;">=</span> s.<span style="color: #0000FF;">ToString</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #000000;">&#125;</span>
        <span style="color: #0600FF;">private</span> <span style="color: #0600FF;">void</span> setTextBoxText<span style="color: #000000;">&#40;</span>ArrayList a<span style="color: #000000;">&#41;</span>
        <span style="color: #000000;">&#123;</span>
            <span style="color: #008080; font-style: italic;">//to check the order of the ouput</span>
            textBox1.<span style="color: #0000FF;">Text</span> <span style="color: #008000;">=</span> <span style="color: #666666;">&quot;&quot;</span><span style="color: #008000;">;</span>
            <span style="color: #0600FF;">for</span> <span style="color: #000000;">&#40;</span><span style="color: #FF0000;">int</span> i <span style="color: #008000;">=</span> <span style="color: #FF0000;">0</span><span style="color: #008000;">;</span> i <span style="color: #008000;">&lt;</span> a.<span style="color: #0000FF;">Count</span><span style="color: #008000;">;</span> i<span style="color: #008000;">++</span><span style="color: #000000;">&#41;</span>
            <span style="color: #000000;">&#123;</span>
                textBox1.<span style="color: #0000FF;">Text</span> <span style="color: #008000;">+=</span> a<span style="color: #000000;">&#91;</span>i<span style="color: #000000;">&#93;</span>.<span style="color: #0000FF;">ToString</span><span style="color: #000000;">&#40;</span><span style="color: #000000;">&#41;</span> <span style="color: #008000;">+</span> Environment.<span style="color: #0000FF;">NewLine</span><span style="color: #008000;">;</span>
            <span style="color: #000000;">&#125;</span>
&nbsp;
        <span style="color: #000000;">&#125;</span>
&nbsp;
    <span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span></pre></div></div>

<p><a href='http://www.pleblanc.com/wp-content/uploads/2009/06/bggui.zip'>Download this Project!</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.pleblanc.com/2009/06/managing-multiple-threads-in-c-with-a-gui/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
