<?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>.NET - In Fine - Le Blog</title>
	<atom:link href="https://blog.infine.com/tag/net/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.infine.com</link>
	<description>Le blog des technos de demain !</description>
	<lastBuildDate>Tue, 21 Jun 2011 12:54:22 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.5.7</generator>

<image>
	<url>https://blog.infine.com/wp-content/uploads/2021/03/cropped-vignette-32x32.png</url>
	<title>.NET - In Fine - Le Blog</title>
	<link>https://blog.infine.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Kinect for Windows SDK: Released!</title>
		<link>https://blog.infine.com/kinect-for-windows-sdk-released-947?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=kinect-for-windows-sdk-released</link>
					<comments>https://blog.infine.com/kinect-for-windows-sdk-released-947#respond</comments>
		
		<dc:creator><![CDATA[David Taing]]></dc:creator>
		<pubDate>Tue, 21 Jun 2011 12:52:48 +0000</pubDate>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[News]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[Kinect]]></category>
		<category><![CDATA[microsoft]]></category>
		<category><![CDATA[SDK]]></category>
		<guid isPermaLink="false">https://blog.infine.com/?p=947</guid>

					<description><![CDATA[<p><span class="rt-reading-time" style="display: block;"><span class="rt-label rt-prefix">Temps de lecture : </span> <span class="rt-time">2</span> <span class="rt-label rt-postfix">min.</span></span> Dévoilé durant le MIX11 qui s'est déroulé à Las Vegas en avril, c'est finalement à la date du 16 juin 2011 que Microsoft a décidé de mettre à disposition le kit de développement (SDK) Kinect pour Windows. Les développeurs en herbe ou passionnés peuvent désormais se donner à coeur joie dans la conception d'applications exploitant les fonctionnalités interactives de la machine. Espérons voir fleurir rapidement sur la toile bon nombre d'outils qui sauront tirer partie de ce petit bijou technologique !</p>
<p>The post <a href="https://blog.infine.com/kinect-for-windows-sdk-released-947">Kinect for Windows SDK: Released!</a> first appeared on <a href="https://blog.infine.com">In Fine - Le Blog</a>.</p>]]></description>
										<content:encoded><![CDATA[<span class="rt-reading-time" style="display: block;"><span class="rt-label rt-prefix">Temps de lecture : </span> <span class="rt-time">2</span> <span class="rt-label rt-postfix">min.</span></span><p>Dévoilé durant le MIX11 qui s&#8217;est déroulé à Las Vegas en avril dernier, c&#8217;est finalement à la date du 16 juin 2011 que Microsoft a décidé de mettre à disposition le kit de développement (SDK) Kinect pour Windows. Les développeurs en herbe ou passionnés peuvent désormais se donner à coeur joie dans la conception d&#8217;applications exploitant les fonctionnalités interactives de la machine. Espérons voir fleurir rapidement sur la toile bon nombre d&#8217;outils qui sauront tirer partie de ce petit bijou technologique !</p>
<figure id="attachment_952" aria-describedby="caption-attachment-952" style="width: 300px" class="wp-caption aligncenter"><a href="https://blog.infine.com/wp-content/uploads/2011/06/SDK-Kinect-windows.jpg" class="fancyboxgroup" rel="gallery-947"><img fetchpriority="high" decoding="async" class="size-full wp-image-952" src="https://blog.infine.com/wp-content/uploads/2011/06/SDK-Kinect-windows.jpg" alt="Kinect pour Windows" width="300" height="245" /></a><figcaption id="caption-attachment-952" class="wp-caption-text">Sortie du SDK Kinect pour Windows</figcaption></figure>
<p>Initialement dénommé &#8220;Project Natal&#8221;, le Kinect possède désormais une place d&#8217;honneur dans le World Guiness Book comme étant l'&#8221;accessoire High-Tech le plus vendu dans un court laps de temps&#8221; (dixit. World Guiness Book). Initialement conçu pour la console de Microsoft, la Xbox 360, le Kinect s&#8217;est voulu être une nouvelle façon de jouer aux jeux vidéos sans manettes appelé également <em>Motion Gaming</em>. Il a rapidement réussi à attiser la sympathie du public avec son concept de commande à la fois ludique et innovante et offrant alors de nouvelles possibilités en terme d&#8217;intéractions. Disposant de deux caméras, un capteur de champ par infra-rouge et d&#8217;un microphone, le Kinect fonctionne par reconnaissance spatiale d&#8217;un corps en mouvement.</p>
<p>Mais les curieux n&#8217;avaient pas attendu cette sortie pour mettre au point un pilote compatible Windows pour faire leurs premiers essais. C&#8217;est ainsi que le kit <a title="CL-NUI Platform" href="http://codelaboratories.com/nui">CL-NUI Platform</a> a sévi sur internet et proposait déjà de prendre le contrôle sur les capteurs vidéos de l&#8217;appareil. On a pu voir apparaître quelques démos techniques (des exemples sur <a title="Kinect Hack" href="http://kinecthacks.net/">http://kinecthacks.net/</a>) prenant en compte la détection de mouvements qui laisse présager d&#8217;autres innovations dans la conception d&#8217;interfaces interractives différentes du mythique combo clavier/souris ou plus récemment écran tactile : robotique, réalité augmenté, &#8230; Minority Report, ça vous rappelle des souvenirs ?</p>
<p><span id="more-947"></span></p>
<p><strong>Prérequis:</strong><br />
<strong> Matériel</strong></p>
<ul>
<li>Dispositif Kinect pour Xbox 360</li>
<li>PC avec processeur dual-core, 2.66-GHz ou plus</li>
<li>Windows 7–carte graphique compatible DirectX® 9.0c</li>
<li>2-Go RAM (4-Go RAM recommandé)</li>
</ul>
<p><strong>Logiciel</strong></p>
<ul>
<li>Windows 7 (x86 ou x64)</li>
<li><a href="http://www.microsoft.com/express/downloads/">Visual Studio 2010 Express</a> (ou autre édition 2010)</li>
<li><a href="http://msdn.microsoft.com/en-us/netframework/aa569263">Microsoft .NET Framework 4.0</a></li>
</ul>
<p><strong>Et pour bien commencer&#8230;</strong></p>
<p><span style="text-decoration: underline">En C#</span></p>
<p>Avec votre Visual Studio préféré, ajouter la référence &#8220;Microsoft.Research.Kinect&#8221; depuis la GAC (Global Assembly Cache) et appeler l&#8217;assembly dans vos codes projets.</p>
<p>Pour l&#8217;API NUI<br />
using Microsoft.Research.Kinect.Nui</p>
<p>Pour l&#8217;API Audio<br />
using Microsoft.Research.Kinect.Audio<br />
<span style="text-decoration: underline"> </span></p>
<p><span style="text-decoration: underline">En C++</span></p>
<ul>
<li>Ne pas compiler vos projets C++ avec w_char comme type de séparateur.</li>
<li>Pour utiliser l&#8217;API NUI, faire un include de MSR_NuiApi.h.<br />
Localisation : Program Files\Microsoft Research KinectSDK\inc</li>
<li>Pour utiliser l&#8217;API Kinect Audio, faire un include de MSRKinectAudio.h.<br />
Localisation : Program Files\Microsoft Research KinectSDK\inc</li>
<li>Faire le lien vers MSRKinectNUI.lib.<br />
Localisation :  Program Files\Microsoft Research KinectSDK\lib</li>
<li>Enfin, s&#8217;assurer que les dlls du SDK de Kinect sont présents dans le bon répertoire lors de l&#8217;exécution du projet.<br />
Localisation: Program Files\Microsoft Research KinectSD</li>
</ul>
<p>Pour plus de détails, je vous recommande de lire la documentation fournie avec le kit de développement (<a title="Documentation SDK Kinect" href="http://research.microsoft.com/en-us/um/redmond/projects/kinectsdk/docs/ProgrammingGuide_KinectSDK.pdf">disponible ici</a>) ainsi que de vous appuyer sur les différentes applications démos présentes dans le répertoire &#8220;Mes documents\Microsoft Research KinectSDK Samples&#8221;.</p>
<p>Have fun <img src="https://s.w.org/images/core/emoji/15.0.3/72x72/1f609.png" alt="😉" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p style="text-align: center"><a title="Télécharger le SDK Kinect for Windows" href="http://research.microsoft.com/en-us/um/redmond/projects/kinectsdk/" target="_blank">Télécharger le SDK Kinect for Windows</a></p><p>The post <a href="https://blog.infine.com/kinect-for-windows-sdk-released-947">Kinect for Windows SDK: Released!</a> first appeared on <a href="https://blog.infine.com">In Fine - Le Blog</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://blog.infine.com/kinect-for-windows-sdk-released-947/feed</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Détecter les deadlocks en C# / .NET grâce au pattern IDisposable</title>
		<link>https://blog.infine.com/detecter-les-deadlocks-en-c-net-grace-au-pattern-idisposable-427?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=detecter-les-deadlocks-en-c-net-grace-au-pattern-idisposable</link>
					<comments>https://blog.infine.com/detecter-les-deadlocks-en-c-net-grace-au-pattern-idisposable-427#comments</comments>
		
		<dc:creator><![CDATA[Nicolas Lecrique]]></dc:creator>
		<pubDate>Wed, 09 Feb 2011 14:05:24 +0000</pubDate>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[deadlock]]></category>
		<category><![CDATA[Dispose]]></category>
		<category><![CDATA[IDisposable]]></category>
		<category><![CDATA[lock]]></category>
		<category><![CDATA[mutex]]></category>
		<category><![CDATA[RAII]]></category>
		<category><![CDATA[using]]></category>
		<guid isPermaLink="false">https://blog.infine.com/?p=427</guid>

					<description><![CDATA[<p><span class="rt-reading-time" style="display: block;"><span class="rt-label rt-prefix">Temps de lecture : </span> <span class="rt-time">5</span> <span class="rt-label rt-postfix">min.</span></span> Détecter les deadlocks en C# / .NET grâce au pattern IDisposable Si vous êtes développeur en environnement multithread, alors vous vous êtes déjà posé cette question : Où est ce deadlock ? ! Bien sûr, ce deadlock est non-reproductible, il survient chez l’utilisateur, et l’on peut passer des heures à le chercher. Sans jamais être sur &#8230;</p>
<p>The post <a href="https://blog.infine.com/detecter-les-deadlocks-en-c-net-grace-au-pattern-idisposable-427">Détecter les deadlocks en C# / .NET grâce au pattern IDisposable</a> first appeared on <a href="https://blog.infine.com">In Fine - Le Blog</a>.</p>]]></description>
										<content:encoded><![CDATA[<span class="rt-reading-time" style="display: block;"><span class="rt-label rt-prefix">Temps de lecture : </span> <span class="rt-time">5</span> <span class="rt-label rt-postfix">min.</span></span><h1>Détecter les deadlocks en C# / .NET grâce au pattern IDisposable<br />
</h1>
<p>Si vous êtes développeur en environnement multithread, alors vous vous êtes déjà posé cette question : Où est ce deadlock ? !</p>
<p>Bien sûr, ce deadlock est non-reproductible, il survient chez l’utilisateur, et l’on peut passer des heures à le chercher. Sans jamais être sur d’avoir trouvé LE deadlock qui pose problème !</p>
<p>Vous trouverez dans ce post un exemple de lock qui a pour objectif de</p>
<ol>
<li>Pouvoir détecter les deadlocks</li>
<li>Proposer une syntaxe claire et concise</li>
<li> Ajouter un overhead minimum en terme de performance à la syntaxe lock C# classique</li>
</ol>
<h2>Petit rappel : qu’est-ce  qu&#8217;un deadlock ?</h2>
<p>Un deadlock (interblocage dans sa version française que personne n’utilise) est la situation dans laquelle 2 threads s’attendent mutuellement. Cas concret :</p>
<ol>
<li>Un thread T1 acquiert une ressource R1</li>
<li>Un thread T2 acquiert une ressource R2</li>
<li>T1 demande la ressource R2</li>
<li>T2 demande la ressource R1</li>
</ol>
<p>Avec un schéma :</p>
<p><a href="https://blog.infine.com/wp-content/uploads/2010/12/deadlock1.jpg" class="fancyboxgroup" rel="gallery-427"><img decoding="async" class="alignnone size-full wp-image-431" src="https://blog.infine.com/wp-content/uploads/2010/12/deadlock1.jpg" alt="" width="800" height="600" srcset="https://blog.infine.com/wp-content/uploads/2010/12/deadlock1.jpg 960w, https://blog.infine.com/wp-content/uploads/2010/12/deadlock1-300x225.jpg 300w" sizes="(max-width: 800px) 100vw, 800px" /></a></p>
<p>Exemple de code provoquant un deadlock</p>
<pre class="brush: csharp; title: ; notranslate">

void CreateDeadLock()
{
   Object R1 = new object();
   Object R2 = new object();

   Thread T1 = new Thread(delegate() { Work(R1, R2); });
   Thread T2 = new Thread(delegate() { Work(R2, R1); });

   T1.Start();
   T2.Start();
}

void Work(Object acquire, Object demand)
{
   lock (acquire)//T1 take R1 and T2 take R2
   {
      Thread.Sleep(1000);//To ensure that the ressources are taken
      lock (demand)
      {
      }
    }
}

</pre>
<p>NB : Bien sûr, les situations réelles sont souvent plus compliquées, impliquant par exemple plus de 2 threads ou des locks implicites (écriture dans un fichier…).</p>
<p><span id="more-427"></span></p>
<h2>Le lock C#</h2>
<p>Quand en C# on écrit la syntaxe suivante :</p>
<pre class="brush: csharp; title: ; notranslate">

lock (ressource)
{
}

</pre>
<p>Il se passe en fait à peu près ça :</p>
<pre class="brush: csharp; title: ; notranslate">

Object temp = ressource;
Monitor.Enter(temp);
try
{
}
finally
{
   Monitor.Exit(temp);
}

</pre>
<p>Monitor.Enter acquière le lock, Monitor.Exit le relâche, Le block try-finally est là pour s&#8217;assurer que la ressource sera libérée même en cas d&#8217;exception. Quant à la référence &#8220;temp&#8221;, il garantit que c&#8217;est bien l&#8217;objet acquis qui sera libéré (l&#8217;utilisateur ne peut pas la modifier l&#8217;objet vers lequel &#8220;temp&#8221; pointe).</p>
<h1>Prévenir les deadlocks avec un Timeout</h1>
<p>Le principe pour prévenir les deadlocks implique l’introduction d’un timeout avec un log ou une levée d’exception dans le cas ou le thread échoue à acquérir la ressource demandée.</p>
<p>Voici un exemple de code résolvant le problème.</p>
<pre class="brush: csharp; title: ; notranslate">

if (Monitor.TryEnter(ressource, 10000))
{
   try
   {
      //Work
   }
   finally
   {
      Monitor.Exit();
   }
}
else
{
   // Log, stack trace display...
   throw new TimeoutException(&quot;Lock acquiring failed&quot;);
}

</pre>
<p>Dans une application avec de nombreux locks, vous conviendrez que cette syntaxe est plus lourde et moins lisible que le lock classique.</p>
<p>Plus grave, elle laisse la possibilité « d’oublier » la libération de la ressource puisque celle-ci incombe au programmeur à chaque utilisation (sisi, ça peut arriver !).</p>
<h1>Une solution plus « User-friendly »</h1>
<p>L’objectif est de garder le bénéfice du timeout, tout en bénéficiant d’une syntaxe plus concise et claire.</p>
<p>L’idée ici est d’utiliser un Pattern bien connu des programmeurs C++, mais moins des développeurs C# ou JAVA, le principe RAII (Ressource Acquisition Is Initialization).</p>
<h2>Le principe RAII</h2>
<p>En C++, il y a un moyen simple de s’assurer qu’une ressource sera toujours libérée à la sortie d’une méthode, c’est de l’encapsuler dans un objet créé sur la pile, et de la libérer dans le destructeur de cet objet. En effet, lorsque la méthode se termine (que ce soit par return ou exception), le destructeur de l’objet est appelé et la ressource toujours libérée.</p>
<p>En C# cependant, on ne peut pas appliquer directement cet idiome. En effet :</p>
<p>-L’appel du destructeur d’une classe n’est pas déterministe (il est réalisé par le Garbage Collector)</p>
<p>-Les structures, équivalent C# des objets créé sur la pile en C++, ne peuvent pas avoir de destructeur.</p>
<h2>Implémentation du lock par l’utilisation du pattern IDisposable</h2>
<p>Pour contourner cette limitation du langage, on peut utiliser le pattern IDisposable.</p>
<p>Voici une première implémentation :</p>
<pre class="brush: csharp; title: ; notranslate">

public class LockCookie : IDisposable
{
private const int TIMEOUT = 10000;
private Object _ressource;

public LockCookie(Object ressource)
{
   if (Monitor.TryEnter(ressource, TIMEOUT))
   {
      _ressource = ressource;
   }
   else
   {
      // Log, stack trace display...
      throw new TimeoutException(&quot;Lock acquiring failed&quot;);
   }
}

public void Dispose()
{
   if (_ressource != null)
   {
      Monitor.Exit(_ressource);
   }
}

}

</pre>
<p>Et son utilisation :</p>
<pre class="brush: csharp; title: ; notranslate">

using (new LockCookie(ressource))
{
   //Work
}

</pre>
<p>Avec ce pattern, une seule ligne permet d’acquérir la ressource, la libération est systématique à l’accolade fermante (même en cas d’exception) et le traitement en cas d’échec n’est pas dupliqué.</p>
<p>CQFD ? Pas tout à fait. Même si l’on peut se satisfera de cette solution dans la plupart des cas, elle créé un overhead non négligeable : il y a création d’objet à chaque acquisition de la ressource (et qui dit création d’objet dit également plus de travail pour le Garbage Collector !).</p>
<h2>Optimisation de la solution</h2>
<p>Eliminons tout de suite une première piste : transformer notre classe LockCookie en type struct n’optimise pas la solution. Pourquoi ? Parce qu’à l’accolade fermante du using, la méthode Dispose de l’interface IDisposable est appelée, et appeler une méthode d’interface à partir d’un type struct implique un boxing.</p>
<p>Une autre piste consiste à faire de notre classe LockCookie l’objet même de synchronisation. Voici le code qui en résulte.</p>
<pre class="brush: csharp; title: ; notranslate">

public class LockCookie : IDisposable
{
private const int TIMEOUT = 10000;
private bool _ressourceAcquired;

public LockCookie Get()
{
   _ressourceAcquired = Monitor.TryEnter(this, TIMEOUT);
   if (!_ressourceAcquired)
   {
      throw new TimeoutException(&quot;Lock acquiring failed&quot;);
   }
   return this;
}

public void Dispose()
{
   if (_ressourceAcquired)
   {
      //NB : the 2 next lines must be in is order to prevent _ressourceAcquired
      //to be set to true by Get() then reset by this call to dispose
      _ressourceAcquired = false;
      Monitor.Exit(this);
   }
}

}

</pre>
<p>Et son utilisation :</p>
<pre class="brush: csharp; title: ; notranslate">
//For instance, ressource is a class field : LockCookie _ressource = new LockCookie();
using (_ressource.Get())
{
   //Work
}
</pre>
<p>L’utilisation est sans doute un peu moins évidente, mais aucun objet n’est créé et la libération de la ressource reste implicite et systématique.</p>
<p>Sur le plan des performances, un lock classique coûte selon mes tests 40 ns (40 milliardièmes de secondes), avec la première solution (avec création d’objet), le coût monte à 50 ns, soit un overhead de 25%, la seconde solution descent à 44 ns, soit un overhead de 10%. Le code des tests de performances sont disponibles en bas de l’article.</p>
<h3>Conclusion</h3>
<p>Ces 2 solutions apportent une réponse centralisée et efficace aux problèmes liés aux acquisitions de ressources en général et aux deadlocks en particulier. Le coût en terme de performance peut paraître important à certains, mais gardons à l’esprit que le temps d’acquisition d’un lock est souvent négligeable en comparaison du temps ou un thread est effectivement bloqué en l’attente d’une ressource. Je suis par ailleurs curieux de connaître d’éventuelles améliorations ou corrections que vous pourriez apporter.</p>
<p>Code d&#8217;analyse de la performance :</p>
<p>void TestPerf()<br />
{<br />
   TestPerf(ClassicLock,&#8221;ClassicLock&#8221;);<br />
   TestPerf(LockCookieCreation,&#8221;LockCookieCreation&#8221;);<br />
   TestPerf(LockCookieGet,&#8221;LockCookieGet&#8221;);<br />
}</p>
<p>public static void ClassicLock(){ lock (_lockObject) { }  }<br />
public static void UseLockCookie(){using (new LockCookie(ressource)){ } }<br />
public static void UseLockCookie() { using (ressource.Get()) { } }</p>
<p>public delegate void TestPerfDelegate();<br />
public static void TestPerf(TestPerfDelegate testPerfDelegate, string testName)<br />
{<br />
   const long nbIteration = 10000000;//10 millions times<br />
   const long nanoSecCoeff = 1000000;//1 ms contains 1 million ns</p>
<p>   Stopwatch stopwatch = new Stopwatch();<br />
   GC.Collect();//Prevent from garbage collection during loop<br />
   stopwatch.Start();<br />
   for (int i = 0; i < nbIteration; i++)
   {
      testPerfDelegate();
   }
   stopwatch.Stop();
   double ellapsedNanoSec = (double)(stopwatch.ElapsedMilliseconds * nanoSecCoeff) / nbIteration;
   Console.WriteLine(testName.PadRight(50) + ellapsedNanoSec);
}

}
[/sourcecode]
</p><p>The post <a href="https://blog.infine.com/detecter-les-deadlocks-en-c-net-grace-au-pattern-idisposable-427">Détecter les deadlocks en C# / .NET grâce au pattern IDisposable</a> first appeared on <a href="https://blog.infine.com">In Fine - Le Blog</a>.</p>]]></content:encoded>
					
					<wfw:commentRss>https://blog.infine.com/detecter-les-deadlocks-en-c-net-grace-au-pattern-idisposable-427/feed</wfw:commentRss>
			<slash:comments>5</slash:comments>
		
		
			</item>
	</channel>
</rss>
