<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-6238714725528798977</id><updated>2011-11-27T17:00:41.931-08:00</updated><category term='C#'/><category term='C++'/><category term='Crystal Reports'/><category term='Shell'/><category term='Mobile'/><category term='Reflection'/><category term='JNI'/><category term='PressKey'/><category term='webcast'/><category term='stdargs'/><category term='SQL'/><category term='C'/><category term='.Net'/><category term='Visual'/><category term='multithreading'/><category term='FAXCOMLib'/><category term='varargs'/><category term='Windows'/><category term='Java'/><category term='Event'/><title type='text'>Lost in the matrix</title><subtitle type='html'>C/C++/C#/Java, Multithreading</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://johannes-fetz.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6238714725528798977/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://johannes-fetz.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Johannes Fetz</name><uri>http://www.blogger.com/profile/06529824680182774898</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://1.bp.blogspot.com/_hm-8HpFJuDs/TG-yB2CwfoI/AAAAAAAAAH0/1zpAykiGiVA/S220/fetz_j.PNG'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>38</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-6238714725528798977.post-984909686971088885</id><published>2011-06-04T23:46:00.000-07:00</published><updated>2011-06-04T23:46:39.602-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='FAXCOMLib'/><title type='text'>FAXCOMLib &amp; Acrobat Reader 10</title><content type='html'>&lt;a href="http://4.bp.blogspot.com/-CJKH-RkAk4c/TesfZW2V8pI/AAAAAAAAAJ8/NpxLYpSh5hw/s1600/acrobat_reader_logo.jpg" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-CJKH-RkAk4c/TesfZW2V8pI/AAAAAAAAAJ8/NpxLYpSh5hw/s1600/acrobat_reader_logo.jpg" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;La FAXCOMLib est un bon moyen pour envoyer des fax à partir d'une application en C#/.Net. Toutefois, il faut savoir qu'elle utilise le lecteur PDF par défaut de l'utilisateur de son contexte. Ainsi, le comportement de la FAXCOMLib peut varier en fonction de ce lecteur. En effet, depuis la version 10 de Acrobat Reader, les fax envoyés à partir de la FAXCOMLib ne &amp;nbsp;partent plus.&lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;Lors de l'envoie d'un fax, une exception "&lt;b&gt;System.Runtime.InteropServices.COMException (0x80070102):Operation failed&lt;/b&gt;" est lancée au bout d'un certain temps.&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;Grâce à mon précédent article &lt;a href="http://johannes-fetz.blogspot.com/2011/06/interpreter-une-exception-com-sous.html"&gt;"Interpréter une exceptionCOM sous Windows"&lt;/a&gt;, nous savons qu'il s'agit d'un "&lt;b&gt;timeout&lt;/b&gt;". Ce "timeout" est dû au fait qu'&lt;b&gt;Acrobat Reader&lt;/b&gt; a changé son fonctionnement et &lt;b&gt;essaie de lancer son IHM (GUI)&lt;/b&gt;. La &lt;b&gt;FAXCOMLib n'étant pas capable de gérer ce changement de protocole&lt;/b&gt;, elle "timeout" au bout de cinq minutes, le comportement à adopter dans cette situation.&lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;u&gt;solutions:&lt;/u&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Installer une autre version d'Acrobat Reader (&lt;a href="http://get.adobe.com/fr/reader/otherversions/"&gt;9 par exemple&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;Installer un lecteur alternatif (exemple : &lt;a href="http://www.foxitsoftware.com/products/reader/"&gt;Foxit Reader&lt;/a&gt;)&lt;/li&gt;&lt;/ul&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6238714725528798977-984909686971088885?l=johannes-fetz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johannes-fetz.blogspot.com/feeds/984909686971088885/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://johannes-fetz.blogspot.com/2011/06/faxcomlib-acrobat-reader-10.html#comment-form' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6238714725528798977/posts/default/984909686971088885'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6238714725528798977/posts/default/984909686971088885'/><link rel='alternate' type='text/html' href='http://johannes-fetz.blogspot.com/2011/06/faxcomlib-acrobat-reader-10.html' title='FAXCOMLib &amp; Acrobat Reader 10'/><author><name>Johannes Fetz</name><uri>http://www.blogger.com/profile/06529824680182774898</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://1.bp.blogspot.com/_hm-8HpFJuDs/TG-yB2CwfoI/AAAAAAAAAH0/1zpAykiGiVA/S220/fetz_j.PNG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-CJKH-RkAk4c/TesfZW2V8pI/AAAAAAAAAJ8/NpxLYpSh5hw/s72-c/acrobat_reader_logo.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6238714725528798977.post-4717723655161294611</id><published>2011-06-04T11:41:00.000-07:00</published><updated>2011-06-04T11:41:20.978-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><title type='text'>Interpréter une exception COM sous Windows</title><content type='html'>&lt;a href="http://1.bp.blogspot.com/-SPKiNB77tdg/Tepe7wt1OTI/AAAAAAAAAJ4/idUN4XA1WaI/s1600/windows-com-mini.jpg" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-SPKiNB77tdg/Tepe7wt1OTI/AAAAAAAAAJ4/idUN4XA1WaI/s1600/windows-com-mini.jpg" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;Parfois, il nous arrive d'utiliser des composants "Bas Niveau" dans nos applications (utilisation du fax par exemple). Cependant, du fait que le code est souvent non-managé, il est difficile d'interpréter les erreurs remontées par ces composants. Par conséquent, voici une petite astuce à connaître :&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;Pour notre exemple, nous allons considérer que nous avons une application en .Net et que nous utilisons le composant FAXCOMLib pour envoyer un fax. Enfin, nous allons considérer que l'exception suivante est survenue lors de l'exécution du programme :&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;System.Runtime.InteropServices.COMException (0x80070102): Operation failed&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;b&gt;1&lt;/b&gt;) De cette exception nous allons extraire le code de l'erreur : 0x80070102&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;b&gt;2&lt;/b&gt;) Puis extraire les 4 chiffres suivant le chiffre 7 : 0x8007&lt;b&gt;&lt;span class="Apple-style-span" style="color: #0b5394;"&gt;0102&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;b&gt;3&lt;/b&gt;) Convertir le nombre de la base 16 (hexadecimal) à la base 10 : &lt;b&gt;&lt;span class="Apple-style-span" style="color: #0b5394;"&gt;258&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;u&gt;&lt;br /&gt;&lt;/u&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;u&gt;Astuce :&lt;/u&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt; utiliser un site pour éffectuer la conversion, tel que :&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;a href="http://www.statman.info/conversions/hexadecimal.html"&gt;http://www.statman.info/conversions/hexadecimal.html&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;a href="http://www.statman.info/conversions/hexadecimal.html"&gt;&lt;/a&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;b&gt;4&lt;/b&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;) Ouvrir un invité de commandes (cmd.exe) et taper : "net helpmsg &lt;span class="Apple-style-span" style="color: #0b5394;"&gt;&lt;b&gt;258&lt;/b&gt;&lt;/span&gt;"&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; border-collapse: collapse; font-family: Verdana, sans-serif; font-size: 13px; line-height: 18px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px; border-collapse: collapse; font-family: Verdana, sans-serif; font-size: 13px; line-height: 18px;"&gt;Cette commande affiche &lt;span class="Apple-style-span" style="color: #cc0000;"&gt;"The wait operation timed out."&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;u&gt;Astuce :&lt;/u&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt; la liste des codes d'erreur de Windows est disponible à cette adresse :&lt;/span&gt;&lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms681382(v=vs.85).aspx"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;http://msdn.microsoft.com/en-us/library/ms681382(v=vs.85).aspx&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/ms681382(v=vs.85).aspx"&gt;&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;Les erreurs COM sont maintenant lisibles :)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6238714725528798977-4717723655161294611?l=johannes-fetz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johannes-fetz.blogspot.com/feeds/4717723655161294611/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://johannes-fetz.blogspot.com/2011/06/interpreter-une-exception-com-sous.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6238714725528798977/posts/default/4717723655161294611'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6238714725528798977/posts/default/4717723655161294611'/><link rel='alternate' type='text/html' href='http://johannes-fetz.blogspot.com/2011/06/interpreter-une-exception-com-sous.html' title='Interpréter une exception COM sous Windows'/><author><name>Johannes Fetz</name><uri>http://www.blogger.com/profile/06529824680182774898</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://1.bp.blogspot.com/_hm-8HpFJuDs/TG-yB2CwfoI/AAAAAAAAAH0/1zpAykiGiVA/S220/fetz_j.PNG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-SPKiNB77tdg/Tepe7wt1OTI/AAAAAAAAAJ4/idUN4XA1WaI/s72-c/windows-com-mini.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6238714725528798977.post-8602880847434425115</id><published>2011-02-27T03:38:00.000-08:00</published><updated>2011-02-27T03:38:07.441-08:00</updated><title type='text'>Téléchargement anormalement lent sur Steam</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="https://lh5.googleusercontent.com/-t0Wl4klZZ5I/TWozcu3oEKI/AAAAAAAAAJo/bL82MbNhKfQ/s1600/SteamLogo.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;img border="0" height="200" src="https://lh5.googleusercontent.com/-t0Wl4klZZ5I/TWozcu3oEKI/AAAAAAAAAJo/bL82MbNhKfQ/s200/SteamLogo.png" width="200" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;Voici, un petit hors-serie sur Steam qui,&amp;nbsp;je l'espère devrait résourdre les problèmes de lenteur&amp;nbsp;chez certain.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;b&gt;1)&lt;/b&gt; Fermer Steam (vérifier le cas échéant dans le gestionnaire de tâches).&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;b&gt;2)&lt;/b&gt; Supprimer le fichier "&lt;b&gt;&lt;span class="Apple-style-span" style="color: #0b5394;"&gt;ClientRegistry.blob&lt;/span&gt;&lt;/b&gt;" qui se trouve à la racine du répertoire d'installation de Steam. Exemple:&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #0b5394; font-family: Verdana, sans-serif;"&gt;&lt;b&gt;C:\Program Files (x86)\Steam\ClientRegistry.blob&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;Ce fichier contient entre-autres diverses informations sur votre connexion (ex: Client Bandwidth Stats)&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;b&gt;3)&lt;/b&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&amp;nbsp;Redémarrer Steam (Steam devrait vous re-demander vos identifiants, sinon recommencer à l'étape 1).&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;b&gt;4)&lt;/b&gt; Relancer vos téléchargements.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6238714725528798977-8602880847434425115?l=johannes-fetz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johannes-fetz.blogspot.com/feeds/8602880847434425115/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://johannes-fetz.blogspot.com/2011/02/telechargement-anormalement-lent-sur.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6238714725528798977/posts/default/8602880847434425115'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6238714725528798977/posts/default/8602880847434425115'/><link rel='alternate' type='text/html' href='http://johannes-fetz.blogspot.com/2011/02/telechargement-anormalement-lent-sur.html' title='Téléchargement anormalement lent sur Steam'/><author><name>Johannes Fetz</name><uri>http://www.blogger.com/profile/06529824680182774898</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://1.bp.blogspot.com/_hm-8HpFJuDs/TG-yB2CwfoI/AAAAAAAAAH0/1zpAykiGiVA/S220/fetz_j.PNG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='https://lh5.googleusercontent.com/-t0Wl4klZZ5I/TWozcu3oEKI/AAAAAAAAAJo/bL82MbNhKfQ/s72-c/SteamLogo.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6238714725528798977.post-2726949941720107811</id><published>2011-01-04T01:55:00.000-08:00</published><updated>2011-01-04T01:55:43.365-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Crystal Reports'/><title type='text'>Ajouter une image dynamiquement dans un rapport avec Crystal Reports XI</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span class="Apple-style-span" style="color: #073763; font-family: Verdana, sans-serif;"&gt;&lt;img border="0" height="144" src="http://4.bp.blogspot.com/_hm-8HpFJuDs/TSLrbMSqR-I/AAAAAAAAAJY/q_TdstqfGXI/s200/crystal-reports-11.jpg" width="200" /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span class="Apple-style-span" style="color: #073763; font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_hm-8HpFJuDs/TSLrUb_qRJI/AAAAAAAAAIw/53uc7P6hVzM/s1600/1.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;span class="Apple-style-span" style="color: #073763; font-family: Verdana, sans-serif;"&gt;&lt;img border="0" height="440" src="http://3.bp.blogspot.com/_hm-8HpFJuDs/TSLrUb_qRJI/AAAAAAAAAIw/53uc7P6hVzM/s640/1.png" width="640" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="color: #073763; font-family: Verdana, sans-serif; font-size: small;"&gt;1) Lancer Crystal Reports XI&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_hm-8HpFJuDs/TSLrU7ZHS-I/AAAAAAAAAI0/V4IRvM5OUSI/s1600/2.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;span class="Apple-style-span" style="color: #073763; font-family: Verdana, sans-serif;"&gt;&lt;img border="0" height="440" src="http://4.bp.blogspot.com/_hm-8HpFJuDs/TSLrU7ZHS-I/AAAAAAAAAI0/V4IRvM5OUSI/s640/2.png" width="640" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="color: #073763; font-family: Verdana, sans-serif; font-size: small;"&gt;2) Créer un nouveau rapport vide&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_hm-8HpFJuDs/TSLrVsY7nhI/AAAAAAAAAI4/_iu4Il4YmJw/s1600/3.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;span class="Apple-style-span" style="color: #073763; font-family: Verdana, sans-serif;"&gt;&lt;img border="0" height="502" src="http://1.bp.blogspot.com/_hm-8HpFJuDs/TSLrVsY7nhI/AAAAAAAAAI4/_iu4Il4YmJw/s640/3.png" width="640" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="color: #073763; font-family: Verdana, sans-serif; font-size: small;"&gt;3) Cliquer sur l'icône "Insérer une image"&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_hm-8HpFJuDs/TSLrWI8HrHI/AAAAAAAAAI8/HqX_zL_6MeI/s1600/4.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;span class="Apple-style-span" style="color: #073763; font-family: Verdana, sans-serif;"&gt;&lt;img border="0" height="217" src="http://4.bp.blogspot.com/_hm-8HpFJuDs/TSLrWI8HrHI/AAAAAAAAAI8/HqX_zL_6MeI/s400/4.png" width="400" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="color: #073763; font-family: Verdana, sans-serif; font-size: small;"&gt;4) Sélectionner une image arbitraire&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_hm-8HpFJuDs/TSLrXOmuGPI/AAAAAAAAAJA/8P4AEg3GRig/s1600/5.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;span class="Apple-style-span" style="color: #073763; font-family: Verdana, sans-serif;"&gt;&lt;img border="0" height="502" src="http://3.bp.blogspot.com/_hm-8HpFJuDs/TSLrXOmuGPI/AAAAAAAAAJA/8P4AEg3GRig/s640/5.png" width="640" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="color: #073763; font-family: Verdana, sans-serif; font-size: small;"&gt;5) Placer l'image&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_hm-8HpFJuDs/TSLrYIFAQUI/AAAAAAAAAJE/Kky7YSC5_NI/s1600/6.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;span class="Apple-style-span" style="color: #073763; font-family: Verdana, sans-serif;"&gt;&lt;img border="0" height="502" src="http://2.bp.blogspot.com/_hm-8HpFJuDs/TSLrYIFAQUI/AAAAAAAAAJE/Kky7YSC5_NI/s640/6.png" width="640" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="color: #073763; font-family: Verdana, sans-serif; font-size: small;"&gt;6) Ajouter un nouveau paramètre correspondant au chemin du fichier image&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_hm-8HpFJuDs/TSLrYxySOQI/AAAAAAAAAJI/Qz29Kgit7ds/s1600/7.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;span class="Apple-style-span" style="color: #073763; font-family: Verdana, sans-serif;"&gt;&lt;img border="0" height="534" src="http://1.bp.blogspot.com/_hm-8HpFJuDs/TSLrYxySOQI/AAAAAAAAAJI/Qz29Kgit7ds/s640/7.png" width="640" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="color: #073763; font-family: Verdana, sans-serif; font-size: small;"&gt;7) Ajouter un paramètre de type de &lt;/span&gt;&lt;span class="Apple-style-span" style="color: #4c1130; font-family: Verdana, sans-serif; font-size: small;"&gt;"Chaîne"&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #073763; font-family: Verdana, sans-serif; font-size: small;"&gt;, ici nommé &lt;/span&gt;&lt;span class="Apple-style-span" style="color: #4c1130; font-family: Verdana, sans-serif; font-size: small;"&gt;"Image"&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_hm-8HpFJuDs/TSLrZgikNMI/AAAAAAAAAJM/whH7AqCjE4k/s1600/8.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;span class="Apple-style-span" style="color: #073763; font-family: Verdana, sans-serif;"&gt;&lt;img border="0" height="502" src="http://4.bp.blogspot.com/_hm-8HpFJuDs/TSLrZgikNMI/AAAAAAAAAJM/whH7AqCjE4k/s640/8.png" width="640" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="color: #073763; font-family: Verdana, sans-serif; font-size: small;"&gt;8) Clique droit sur l'image, puis cliquer sur &lt;/span&gt;&lt;span class="Apple-style-span" style="color: #4c1130; font-family: Verdana, sans-serif; font-size: small;"&gt;"Mettre en forme le graphique"&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_hm-8HpFJuDs/TSLraLd9WQI/AAAAAAAAAJQ/6ctmmTuCdLY/s1600/9.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"&gt;&lt;span class="Apple-style-span" style="color: #073763; font-family: Verdana, sans-serif;"&gt;&lt;img border="0" height="640" src="http://3.bp.blogspot.com/_hm-8HpFJuDs/TSLraLd9WQI/AAAAAAAAAJQ/6ctmmTuCdLY/s640/9.png" width="518" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="tr-caption" style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="color: #073763; font-family: Verdana, sans-serif; font-size: small;"&gt;9) Cliquer sur le bouton "formule" (X+2)&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_hm-8HpFJuDs/TSLra2PtwoI/AAAAAAAAAJU/z7udk0Gxhx0/s1600/10.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;span class="Apple-style-span" style="color: #073763; font-family: Verdana, sans-serif;"&gt;&lt;img border="0" height="250" src="http://3.bp.blogspot.com/_hm-8HpFJuDs/TSLra2PtwoI/AAAAAAAAAJU/z7udk0Gxhx0/s640/10.png" width="640" /&gt;&lt;/span&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span class="Apple-style-span" style="color: #073763; font-family: Verdana, sans-serif;"&gt;10) Mettre la formule &lt;/span&gt;&lt;span class="Apple-style-span" style="color: #4c1130; font-family: Verdana, sans-serif;"&gt;"{?Image}"&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #073763; font-family: Verdana, sans-serif;"&gt; ou &lt;/span&gt;&lt;span class="Apple-style-span" style="color: #4c1130; font-family: Verdana, sans-serif;"&gt;"Image"&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #073763; font-family: Verdana, sans-serif;"&gt; est le nom du paramètre&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;span class="Apple-style-span" style="color: #073763; font-family: Verdana, sans-serif;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="color: #073763; font-family: Verdana, sans-serif;"&gt;---&lt;/span&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;span class="Apple-style-span" style="color: #073763; font-family: Verdana, sans-serif;"&gt;Il ne reste plus qu'a tester le modèle.&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6238714725528798977-2726949941720107811?l=johannes-fetz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johannes-fetz.blogspot.com/feeds/2726949941720107811/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://johannes-fetz.blogspot.com/2011/01/ajouter-une-image-dynamiquement-dans-un.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6238714725528798977/posts/default/2726949941720107811'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6238714725528798977/posts/default/2726949941720107811'/><link rel='alternate' type='text/html' href='http://johannes-fetz.blogspot.com/2011/01/ajouter-une-image-dynamiquement-dans-un.html' title='Ajouter une image dynamiquement dans un rapport avec Crystal Reports XI'/><author><name>Johannes Fetz</name><uri>http://www.blogger.com/profile/06529824680182774898</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://1.bp.blogspot.com/_hm-8HpFJuDs/TG-yB2CwfoI/AAAAAAAAAH0/1zpAykiGiVA/S220/fetz_j.PNG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_hm-8HpFJuDs/TSLrbMSqR-I/AAAAAAAAAJY/q_TdstqfGXI/s72-c/crystal-reports-11.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6238714725528798977.post-7902136758528968148</id><published>2010-08-29T13:00:00.000-07:00</published><updated>2010-08-29T13:00:43.792-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>Savoir si une machine est "pingable" en C sous Windows</title><content type='html'>Ceci est une version très basique de la fonction Ping.&lt;br /&gt;Elle ne gère pas tous les cas, mais je vais poster une version améliorée bientôt.&lt;br /&gt;&lt;pre class="brush: cpp"&gt;#include &amp;lt;winsock2.h&amp;gt;&lt;br /&gt;#include &amp;lt;Ipexport.h&amp;gt;&lt;br /&gt;#include &amp;lt;icmpapi.h&amp;gt;&lt;br /&gt;&lt;br /&gt;#pragma comment(lib, &amp;quot;iphlpapi.lib&amp;quot;)&lt;br /&gt;#pragma comment(lib, &amp;quot;ws2_32.lib&amp;quot;)&lt;br /&gt;&lt;br /&gt;int IsPingable(const char *host, int timeout)&lt;br /&gt;{&lt;br /&gt; IP_OPTION_INFORMATION ioi;&lt;br /&gt; ICMP_ECHO_REPLY       ier;&lt;br /&gt; LPHOSTENT             Host;&lt;br /&gt; WSADATA               wsaData;&lt;br /&gt; IN_ADDR               iaAddr;&lt;br /&gt; HANDLE                hIcmp;&lt;br /&gt;&lt;br /&gt; if (WSAStartup(MAKEWORD(2, 2), &amp;amp;wsaData) != 0)&lt;br /&gt; {&lt;br /&gt;  WSACleanup();&lt;br /&gt;  return (0);&lt;br /&gt; }&lt;br /&gt; iaAddr.s_addr = inet_addr(host);&lt;br /&gt; if (iaAddr.s_addr == INADDR_NONE)&lt;br /&gt;  Host = gethostbyname(host);&lt;br /&gt; else&lt;br /&gt;  Host = gethostbyaddr((char *)&amp;amp;iaAddr, sizeof(IN_ADDR), AF_INET);&lt;br /&gt; if (Host == NULL)&lt;br /&gt; {&lt;br /&gt;  WSACleanup();&lt;br /&gt;  return (0);&lt;br /&gt; }&lt;br /&gt; hIcmp = IcmpCreateFile();&lt;br /&gt; ioi.Ttl = 255;&lt;br /&gt; ioi.Tos = 0;&lt;br /&gt; ioi.Flags = 0;&lt;br /&gt; ioi.OptionsSize = 0;&lt;br /&gt; ioi.OptionsData = NULL;&lt;br /&gt; IcmpSendEcho(hIcmp, *(DWORD *)(*Host-&amp;gt;h_addr_list), NULL, 0, &amp;amp;ioi, &amp;amp;ier, sizeof(ICMP_ECHO_REPLY), timeout);&lt;br /&gt; IcmpCloseHandle(hIcmp);&lt;br /&gt; WSACleanup();&lt;br /&gt; return (ier.Status == 0);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;Exemple:&lt;br /&gt;&lt;pre class="brush: cpp"&gt;int main(int argc, char **argv)&lt;br /&gt;{&lt;br /&gt; printf(&amp;quot;IsPingable : %d\n&amp;quot;, IsPingable(&amp;quot;clustrmaps.com&amp;quot;, 5000));&lt;br /&gt; getchar();&lt;br /&gt; return (EXIT_SUCCESS);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6238714725528798977-7902136758528968148?l=johannes-fetz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johannes-fetz.blogspot.com/feeds/7902136758528968148/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://johannes-fetz.blogspot.com/2010/08/savoir-si-une-machine-est-pingable-en-c.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6238714725528798977/posts/default/7902136758528968148'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6238714725528798977/posts/default/7902136758528968148'/><link rel='alternate' type='text/html' href='http://johannes-fetz.blogspot.com/2010/08/savoir-si-une-machine-est-pingable-en-c.html' title='Savoir si une machine est &quot;pingable&quot; en C sous Windows'/><author><name>Johannes Fetz</name><uri>http://www.blogger.com/profile/06529824680182774898</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://1.bp.blogspot.com/_hm-8HpFJuDs/TG-yB2CwfoI/AAAAAAAAAH0/1zpAykiGiVA/S220/fetz_j.PNG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6238714725528798977.post-442535581764462966</id><published>2010-08-24T12:50:00.000-07:00</published><updated>2010-08-24T12:50:23.151-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='.Net'/><title type='text'>Editer les sous-objets dans une PropertyGrid (C# / .Net)</title><content type='html'>Aujourd'hui, je suis tombé sur un problème avec le contrôle PropertyGrid, car je voulais éditer les propriétés d'un objet ainsi que ses sous-objets. Toutefois, j'ai eu quelques soucis, car la PropertyGrid ne permet pas (de base) d'éditer les sous-objets et ceux-ci apparaissent grisés.&lt;br /&gt;&lt;br /&gt;Voici mon code:&lt;br /&gt;&lt;pre class="brush: csharp"&gt;using System.Drawing;&lt;br /&gt;using System.Windows.Forms;&lt;br /&gt;&lt;br /&gt;namespace WindowsFormsApplication&lt;br /&gt;{&lt;br /&gt;    public partial class PropertyGridTest : Form&lt;br /&gt;    {&lt;br /&gt;        public PropertyGridTest()&lt;br /&gt;        {&lt;br /&gt;            InitializeComponent();&lt;br /&gt;            this.propertyGrid1.SelectedObject = new Car();&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public class Driver&lt;br /&gt;    {&lt;br /&gt;        public string Name { get; set; }&lt;br /&gt;        public bool HasDriverLicence { get; set; }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public class Car&lt;br /&gt;    {&lt;br /&gt;        public Car()&lt;br /&gt;        {&lt;br /&gt;            this.Driver = new Driver()&lt;br /&gt;            {&lt;br /&gt;                Name = "Johannes Fetz",&lt;br /&gt;                HasDriverLicence = false&lt;br /&gt;            };&lt;br /&gt;            this.Color = Color.Red;&lt;br /&gt;            this.Kind = "Sedan";&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        public string Kind { get; set; }&lt;br /&gt;        public Color Color { get; set; }&lt;br /&gt;        public Driver Driver { get; set; }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;qui donne le résultat suivant:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_hm-8HpFJuDs/THQg6I_9VWI/AAAAAAAAAIU/M6BsnAdDjCA/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_hm-8HpFJuDs/THQg6I_9VWI/AAAAAAAAAIU/M6BsnAdDjCA/s320/1.png" /&gt;&lt;/a&gt;&lt;/div&gt;Après quelques recherches, j'ai trouvé comment résoudre ce problème. En effet, il suffit d'indiquer à la PropertyGrid que "Driver" est un objet "Expandable". Pour cela, il faut ajouter un using :&lt;br /&gt;&lt;pre class="brush: csharp"&gt;using System.ComponentModel;&lt;br /&gt;&lt;/pre&gt;et un attribut au dessus de la classe "Driver" :&lt;br /&gt;&lt;pre class="brush: csharp"&gt;[TypeConverterAttribute(typeof(ExpandableObjectConverter))]&lt;br /&gt;public class Driver&lt;br /&gt;{&lt;br /&gt;&lt;/pre&gt;Ce qui donne le résultat suivant:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_hm-8HpFJuDs/THQiC-bbNJI/AAAAAAAAAIc/B6ZPZ4TVk8Q/s1600/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_hm-8HpFJuDs/THQiC-bbNJI/AAAAAAAAAIc/B6ZPZ4TVk8Q/s320/2.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6238714725528798977-442535581764462966?l=johannes-fetz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johannes-fetz.blogspot.com/feeds/442535581764462966/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://johannes-fetz.blogspot.com/2010/08/editer-les-sous-objets-dans-une.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6238714725528798977/posts/default/442535581764462966'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6238714725528798977/posts/default/442535581764462966'/><link rel='alternate' type='text/html' href='http://johannes-fetz.blogspot.com/2010/08/editer-les-sous-objets-dans-une.html' title='Editer les sous-objets dans une PropertyGrid (C# / .Net)'/><author><name>Johannes Fetz</name><uri>http://www.blogger.com/profile/06529824680182774898</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://1.bp.blogspot.com/_hm-8HpFJuDs/TG-yB2CwfoI/AAAAAAAAAH0/1zpAykiGiVA/S220/fetz_j.PNG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_hm-8HpFJuDs/THQg6I_9VWI/AAAAAAAAAIU/M6BsnAdDjCA/s72-c/1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6238714725528798977.post-4042297953218570997</id><published>2010-05-23T14:29:00.000-07:00</published><updated>2010-08-24T12:02:37.291-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C'/><title type='text'>Pseudo delegate en langage C</title><content type='html'>Voici une petite démonstration d'une implémentation des delegates que j'ai fait en langage C :)&lt;br /&gt;Dans ce code, une fonction est déclarée en locale avec un nom unique, composé du mot&lt;br /&gt;"__delegate__" et du numéro de la ligne courrante (__LINE__). Puis, l'adresse est stockée&lt;br /&gt;dans la variable de l'utilisateur sous forme d'un pointeur sur fonction de type "Delegate".&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: cpp"&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;&lt;br /&gt;#define CONCAT2(s1, s2) s1##s2&lt;br /&gt;#define CONCAT(s1, s2) CONCAT2(s1, s2)&lt;br /&gt;#define NewDelegate(Ptr, Expr) void \&lt;br /&gt;        CONCAT(__delegate__, __LINE__)() Expr \&lt;br /&gt;        Ptr = (Delegate)&amp;amp;CONCAT(__delegate__, __LINE__)&lt;br /&gt;&lt;br /&gt;typedef void (*Delegate)(void);&lt;br /&gt;&lt;br /&gt;void    PseudoDelegateTest()&lt;br /&gt;{       &lt;br /&gt;        int  i;&lt;br /&gt;        Delegate my_delegate;&lt;br /&gt;&lt;br /&gt;        NewDelegate(my_delegate,&lt;br /&gt;        {&lt;br /&gt;           printf("i = %d\n", i);&lt;br /&gt;        });&lt;br /&gt;&lt;br /&gt;        for (i = 0; i &amp;lt; 5; ++i)&lt;br /&gt;            my_delegate();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int main(int argc, char **argv)&lt;br /&gt;{&lt;br /&gt;  PseudoDelegateTest();&lt;br /&gt;  getchar();&lt;br /&gt;  return (0);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6238714725528798977-4042297953218570997?l=johannes-fetz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johannes-fetz.blogspot.com/feeds/4042297953218570997/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://johannes-fetz.blogspot.com/2010/05/pseudo-delegate-en-langage-c.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6238714725528798977/posts/default/4042297953218570997'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6238714725528798977/posts/default/4042297953218570997'/><link rel='alternate' type='text/html' href='http://johannes-fetz.blogspot.com/2010/05/pseudo-delegate-en-langage-c.html' title='Pseudo delegate en langage C'/><author><name>Johannes Fetz</name><uri>http://www.blogger.com/profile/06529824680182774898</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://1.bp.blogspot.com/_hm-8HpFJuDs/TG-yB2CwfoI/AAAAAAAAAH0/1zpAykiGiVA/S220/fetz_j.PNG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6238714725528798977.post-5096868609801499267</id><published>2010-05-19T03:12:00.000-07:00</published><updated>2010-05-19T06:22:16.563-07:00</updated><title type='text'>Débuter avec Vim</title><content type='html'>&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_hm-8HpFJuDs/S_O3kvx3xbI/AAAAAAAAAG4/x4JmW2ozEKI/s1600/vim_logo.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="100" src="http://3.bp.blogspot.com/_hm-8HpFJuDs/S_O3kvx3xbI/AAAAAAAAAG4/x4JmW2ozEKI/s200/vim_logo.png" width="100" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Cela fait pas mal de temps que je m'intéresse à cet éditeur dont les possibilités sont infinies. En effet, j'ai eu l'occasion grâce à un ami, de le voir à l'oeuvre. Toutefois, il n'est pas toujours évident d'utiliser un autre éditeur quand on est habitué à un autre (personnellement j'utilise Emacs). Cet éditeur offre réellement une plus-value pour celui qui le maîtrise. Notamment grâce à son système de macros très bien pensé. Ainsi, j'ai appris les commandes de base et j'ai rédigé un document avec la liste des commandes élémentaires pour commencer avec Vim.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_hm-8HpFJuDs/S_Pl1dzHq7I/AAAAAAAAAHY/tYrNTo-Q87Q/s1600/vi.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="640" src="http://2.bp.blogspot.com/_hm-8HpFJuDs/S_Pl1dzHq7I/AAAAAAAAAHY/tYrNTo-Q87Q/s640/vi.png" width="548" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Voici le lien vers le document complet (pdf ou txt) :&amp;nbsp;&lt;a href="http://www.scribd.com/doc/31596904"&gt;Commandes élémentaires de Vim&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_hm-8HpFJuDs/S_O5WpY3cEI/AAAAAAAAAHA/d7b59vDdpCc/s1600/vim.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="255" src="http://3.bp.blogspot.com/_hm-8HpFJuDs/S_O5WpY3cEI/AAAAAAAAAHA/d7b59vDdpCc/s400/vim.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;Lien vers le site officiel de Vim :&amp;nbsp;&lt;a href="http://www.vim.org/"&gt;www.vim.org&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6238714725528798977-5096868609801499267?l=johannes-fetz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johannes-fetz.blogspot.com/feeds/5096868609801499267/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://johannes-fetz.blogspot.com/2010/05/debuter-avec-vim.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6238714725528798977/posts/default/5096868609801499267'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6238714725528798977/posts/default/5096868609801499267'/><link rel='alternate' type='text/html' href='http://johannes-fetz.blogspot.com/2010/05/debuter-avec-vim.html' title='Débuter avec Vim'/><author><name>Johannes Fetz</name><uri>http://www.blogger.com/profile/06529824680182774898</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://1.bp.blogspot.com/_hm-8HpFJuDs/TG-yB2CwfoI/AAAAAAAAAH0/1zpAykiGiVA/S220/fetz_j.PNG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_hm-8HpFJuDs/S_O3kvx3xbI/AAAAAAAAAG4/x4JmW2ozEKI/s72-c/vim_logo.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6238714725528798977.post-3913281242216614439</id><published>2010-04-20T06:18:00.000-07:00</published><updated>2010-08-24T12:06:27.691-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Crystal Reports'/><title type='text'>Corriger le problème de lenteur du "ApplyLogOnInfo" dans Crystal Reports</title><content type='html'>A la place de :&lt;br /&gt;&lt;br /&gt;&lt;pre class="brush: csharp"&gt;ConnectionInfo crConnectionInfo = new ConnectionInfo();&lt;br /&gt;crConnectionInfo.Type = ConnectionInfoType.SQL;&lt;br /&gt;crConnectionInfo.ServerName = &amp;quot;ODBCsource&amp;quot;;&lt;br /&gt;crConnectionInfo.DatabaseName = &amp;quot;DataBase&amp;quot;;&lt;br /&gt;crConnectionInfo.UserID = &amp;quot;Login&amp;quot;;&lt;br /&gt;crConnectionInfo.Password = &amp;quot;Password&amp;quot;;&lt;br /&gt;foreach (CrystalDecisions.CrystalReports.Engine.Table tmpTable in doc.Database.Tables)&lt;br /&gt;{&lt;br /&gt;     tmpTable.LogOnInfo.ConnectionInfo = crConnectionInfo;&lt;br /&gt;     tmpTable.ApplyLogOnInfo(tmpTable.LogOnInfo);&lt;br /&gt;     tmpTable.Location = tmpTable.Name;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;Il suffit de faire :&lt;br /&gt;&lt;pre class="brush: csharp"&gt;doc.DataSourceConnections[0].SetConnection(&amp;quot;ODBCsource&amp;quot;, &amp;quot;DataBase&amp;quot;, &amp;quot;Login&amp;quot;, &amp;quot;Password&amp;quot;);&lt;br /&gt;doc.Refresh();&lt;br /&gt;&lt;/pre&gt;Où la variable "doc" est du type "ReportDocument".&lt;br /&gt;Attention j'ai pris l'index 0 dans "DataSourceConnections" à titre d'exemple.&lt;br /&gt;La valeur peut changer en fonction du modèle.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6238714725528798977-3913281242216614439?l=johannes-fetz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johannes-fetz.blogspot.com/feeds/3913281242216614439/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://johannes-fetz.blogspot.com/2010/04/corriger-le-probleme-de-lenteur-du.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6238714725528798977/posts/default/3913281242216614439'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6238714725528798977/posts/default/3913281242216614439'/><link rel='alternate' type='text/html' href='http://johannes-fetz.blogspot.com/2010/04/corriger-le-probleme-de-lenteur-du.html' title='Corriger le problème de lenteur du &quot;ApplyLogOnInfo&quot; dans Crystal Reports'/><author><name>Johannes Fetz</name><uri>http://www.blogger.com/profile/06529824680182774898</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://1.bp.blogspot.com/_hm-8HpFJuDs/TG-yB2CwfoI/AAAAAAAAAH0/1zpAykiGiVA/S220/fetz_j.PNG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6238714725528798977.post-5938818663791944824</id><published>2010-04-20T06:01:00.000-07:00</published><updated>2010-08-24T12:08:49.514-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Indexe à valeurs multiples en C#</title><content type='html'>Voici une petite astuce dont je ne vois pas l'utilité immédiate, mais qui peut intéresser certain.&lt;br /&gt;&lt;pre class="brush: csharp"&gt;public int this[string val1, string val2]&lt;br /&gt;{&lt;br /&gt;    set&lt;br /&gt;    {&lt;br /&gt;       Console.WriteLine(&amp;quot;{0} - {1}&amp;quot;, val1, val2);&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6238714725528798977-5938818663791944824?l=johannes-fetz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johannes-fetz.blogspot.com/feeds/5938818663791944824/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://johannes-fetz.blogspot.com/2010/04/indexe-valeurs-multiples-en-c.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6238714725528798977/posts/default/5938818663791944824'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6238714725528798977/posts/default/5938818663791944824'/><link rel='alternate' type='text/html' href='http://johannes-fetz.blogspot.com/2010/04/indexe-valeurs-multiples-en-c.html' title='Indexe à valeurs multiples en C#'/><author><name>Johannes Fetz</name><uri>http://www.blogger.com/profile/06529824680182774898</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://1.bp.blogspot.com/_hm-8HpFJuDs/TG-yB2CwfoI/AAAAAAAAAH0/1zpAykiGiVA/S220/fetz_j.PNG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6238714725528798977.post-5703044107855161133</id><published>2010-03-29T11:38:00.000-07:00</published><updated>2010-03-29T11:38:32.090-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Crystal Reports'/><title type='text'>Win32Exception : "The operation completed successfully" et Crystal Reports</title><content type='html'>Aujourd'hui, j'ai eu un problème lors de l'impression d'un rapport avec le composant Crystal Reports.&lt;br /&gt;Lors de l'appel de la méthode "ReportDocument.PrintToPrinter" une étrange erreur&lt;br /&gt;"Win32Exception : The operation completed successfully" est apparue. Après une longue recherche,&lt;br /&gt;je me suis aperçu, que le problème était en réalité lié au pilote (Driver) de mon imprimante sous&lt;br /&gt;Windows 7 64 bits. En effet, le programme fonctionne très bien sous Windows Vista 64 bits&lt;br /&gt;avec la même imprimante. De plus, un de mes collègue à strictement le même problème&lt;br /&gt;avec la même configuration. Cependant, le problème est particulièrement vicieux, car j'arrive à imprimer&lt;br /&gt;certains documents à partir de mon poste, avec le Bloc Note de Windows par exemple.&lt;br /&gt;Quelle péripétie!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6238714725528798977-5703044107855161133?l=johannes-fetz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johannes-fetz.blogspot.com/feeds/5703044107855161133/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://johannes-fetz.blogspot.com/2010/03/win32exception-operation-completed.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6238714725528798977/posts/default/5703044107855161133'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6238714725528798977/posts/default/5703044107855161133'/><link rel='alternate' type='text/html' href='http://johannes-fetz.blogspot.com/2010/03/win32exception-operation-completed.html' title='Win32Exception : &quot;The operation completed successfully&quot; et Crystal Reports'/><author><name>Johannes Fetz</name><uri>http://www.blogger.com/profile/06529824680182774898</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://1.bp.blogspot.com/_hm-8HpFJuDs/TG-yB2CwfoI/AAAAAAAAAH0/1zpAykiGiVA/S220/fetz_j.PNG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6238714725528798977.post-3255524390747291844</id><published>2010-03-22T08:39:00.000-07:00</published><updated>2010-08-24T12:10:31.948-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Crystal Reports'/><title type='text'>Problème de lenteur avec le contrôle CrystalReportViewer</title><content type='html'>Je viens de trouver dans mon code pourquoi ma fenêtre de pré-visualisation Crystal Report&lt;br /&gt;était très lente. J'ai supprimé la ligne ci-dessous dans la méthode "InitializeComponent" de&lt;br /&gt;mon formulaire (.Designer.cs) :&lt;br /&gt;&lt;pre class="brush: csharp"&gt;this.crystalReportViewer1.SelectionFormula = &amp;quot;&amp;quot;;&lt;br /&gt;&lt;/pre&gt;Cela m'a permis de gagner neuf secondes à l'affichage.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6238714725528798977-3255524390747291844?l=johannes-fetz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johannes-fetz.blogspot.com/feeds/3255524390747291844/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://johannes-fetz.blogspot.com/2010/03/probleme-de-lenteur-avec-le-controle.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6238714725528798977/posts/default/3255524390747291844'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6238714725528798977/posts/default/3255524390747291844'/><link rel='alternate' type='text/html' href='http://johannes-fetz.blogspot.com/2010/03/probleme-de-lenteur-avec-le-controle.html' title='Problème de lenteur avec le contrôle CrystalReportViewer'/><author><name>Johannes Fetz</name><uri>http://www.blogger.com/profile/06529824680182774898</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://1.bp.blogspot.com/_hm-8HpFJuDs/TG-yB2CwfoI/AAAAAAAAAH0/1zpAykiGiVA/S220/fetz_j.PNG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6238714725528798977.post-2906294844667833025</id><published>2010-03-15T06:15:00.000-07:00</published><updated>2010-08-24T12:12:33.595-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Reflection'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Récupérer les plateformes supportées par l'Assembly en C#</title><content type='html'>&lt;pre class="brush: csharp"&gt;using System.Reflection;&lt;br /&gt;&lt;br /&gt;public sealed class AssemblyInfo&lt;br /&gt;{&lt;br /&gt;    #region Ctors&lt;br /&gt;&lt;br /&gt;    static AssemblyInfo()&lt;br /&gt;    {&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private AssemblyInfo()&lt;br /&gt;    {&lt;br /&gt;        PortableExecutableKinds peKind;&lt;br /&gt;        ImageFileMachine machine;&lt;br /&gt;&lt;br /&gt;        Assembly.GetCallingAssembly().ManifestModule.GetPEKind(out peKind, out machine);&lt;br /&gt;        this.Kind = peKind;&lt;br /&gt;        this.Machine = machine;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    #endregion&lt;br /&gt;&lt;br /&gt;    #region Public Methods&lt;br /&gt;&lt;br /&gt;    public bool Is(PortableExecutableKinds kind)&lt;br /&gt;    {&lt;br /&gt;        return ((this.Kind &amp;amp; kind) != 0);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public bool Is(ImageFileMachine machine)&lt;br /&gt;    {&lt;br /&gt;        return ((this.Machine &amp;amp; machine) != 0);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    #endregion&lt;br /&gt;&lt;br /&gt;    #region Properties&lt;br /&gt;&lt;br /&gt;    public static AssemblyInfo Instance&lt;br /&gt;    {&lt;br /&gt;        get&lt;br /&gt;        {&lt;br /&gt;            return (AssemblyInfo._instance);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    public PortableExecutableKinds Kind { get; private set; }&lt;br /&gt;&lt;br /&gt;    public ImageFileMachine Machine { get; private set; }&lt;br /&gt;&lt;br /&gt;    #endregion&lt;br /&gt;&lt;br /&gt;    #region Fields&lt;br /&gt;&lt;br /&gt;    private static readonly AssemblyInfo _instance = new AssemblyInfo();&lt;br /&gt;&lt;br /&gt;    #endregion&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;Exemple d'utilisation:&lt;br /&gt;&lt;pre class="brush: csharp"&gt;if (AssemblyInfo.Instance.Is(PortableExecutableKinds.Required32Bit))&lt;br /&gt;{&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6238714725528798977-2906294844667833025?l=johannes-fetz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johannes-fetz.blogspot.com/feeds/2906294844667833025/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://johannes-fetz.blogspot.com/2010/03/recuperer-les-plateformes-supportees.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6238714725528798977/posts/default/2906294844667833025'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6238714725528798977/posts/default/2906294844667833025'/><link rel='alternate' type='text/html' href='http://johannes-fetz.blogspot.com/2010/03/recuperer-les-plateformes-supportees.html' title='Récupérer les plateformes supportées par l&apos;Assembly en C#'/><author><name>Johannes Fetz</name><uri>http://www.blogger.com/profile/06529824680182774898</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://1.bp.blogspot.com/_hm-8HpFJuDs/TG-yB2CwfoI/AAAAAAAAAH0/1zpAykiGiVA/S220/fetz_j.PNG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6238714725528798977.post-1170724547835217547</id><published>2010-03-10T06:34:00.000-08:00</published><updated>2010-03-10T06:49:11.669-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Différence entre deux dates en C#</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: monospace; white-space: pre;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: monospace; white-space: pre;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: monospace; white-space: pre;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: monospace; white-space: pre;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: monospace; white-space: pre;"&gt;&lt;pre&gt;&lt;span class="Apple-style-span" style="color: #38761d;"&gt;&lt;br /&gt;/// &amp;lt;summary&amp;gt;&lt;br /&gt;/// Différence entre deux dates en minute.&lt;br /&gt;/// &amp;lt;/summary&amp;gt;&lt;br /&gt;/// &amp;lt;param name="start"&amp;gt;Date de début&amp;lt;/param&amp;gt;&lt;br /&gt;/// &amp;lt;param name="end"&amp;gt;Date de fin&amp;lt;/param&amp;gt;&lt;br /&gt;/// &amp;lt;returns&amp;gt;La différence en minute&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;public static int&lt;/span&gt; GetMinuteDiff(&lt;span class="Apple-style-span" style="color: #3d85c6;"&gt;DateTime&lt;/span&gt; start, &lt;span class="Apple-style-span" style="color: #3d85c6;"&gt;DateTime&lt;/span&gt; end)&lt;br /&gt;{&lt;br /&gt;   &lt;span class="Apple-style-span" style="color: blue;"&gt;if&lt;/span&gt; (start &amp;gt; end)&lt;br /&gt;      &lt;span class="Apple-style-span" style="color: blue;"&gt;return&lt;/span&gt; (-((&lt;span class="Apple-style-span" style="color: blue;"&gt;int&lt;/span&gt;)start.Subtract(end).TotalMinutes));&lt;br /&gt;   &lt;span class="Apple-style-span" style="color: blue;"&gt;return&lt;/span&gt; ((&lt;span class="Apple-style-span" style="color: blue;"&gt;int&lt;/span&gt;)end.Subtract(start).TotalMinutes);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6238714725528798977-1170724547835217547?l=johannes-fetz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johannes-fetz.blogspot.com/feeds/1170724547835217547/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://johannes-fetz.blogspot.com/2010/03/difference-entre-deux-dates-en-c.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6238714725528798977/posts/default/1170724547835217547'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6238714725528798977/posts/default/1170724547835217547'/><link rel='alternate' type='text/html' href='http://johannes-fetz.blogspot.com/2010/03/difference-entre-deux-dates-en-c.html' title='Différence entre deux dates en C#'/><author><name>Johannes Fetz</name><uri>http://www.blogger.com/profile/06529824680182774898</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://1.bp.blogspot.com/_hm-8HpFJuDs/TG-yB2CwfoI/AAAAAAAAAH0/1zpAykiGiVA/S220/fetz_j.PNG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6238714725528798977.post-3765668223254168233</id><published>2010-02-11T15:11:00.001-08:00</published><updated>2010-02-11T15:49:56.325-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='multithreading'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>Intel Threading Building Blocks</title><content type='html'>&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span"  style="color:#0000EE;"&gt;&lt;u&gt;&lt;br /&gt;&lt;/u&gt;&lt;/span&gt;&lt;/div&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_hm-8HpFJuDs/S3SOw__pIEI/AAAAAAAAAFk/-Zss6nVm7Ms/s1600-h/intel.png"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 100px; height: 59px;" src="http://3.bp.blogspot.com/_hm-8HpFJuDs/S3SOw__pIEI/AAAAAAAAAFk/-Zss6nVm7Ms/s400/intel.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5437127622606266434" /&gt;&lt;/a&gt;&lt;p class="MsoNormal" style="text-align:justify"&gt;&lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span style="color:#31849B;"&gt;Introduction&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align:justify;text-indent:35.4pt"&gt;Depuis l’avènement en 2005 des processeurs multi-cœurs dans nos appareils domestiques, nous, développeur, avons dû changer notre façon de concevoir les applications afin d’exploiter cette technologie. Tout le monde est concerné, directement ou indirectement. Les domaines d’utilisation sont vastes. Ils ne se limitent plus aux super calculateurs comme c’est le cas depuis plus de 20 ans, mais notamment aux jeux vidéos, et aux multimédias en générale. Ainsi nous avons vu apparaître un grand nombre de solution qui permette la parallélisation des traitements au sein d’un programme.&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align:justify;text-indent:35.4pt"&gt;Mais en premier lieu, Il a fallu reconcevoir (ou concevoir) les kernels(noyaux) et les drivers(pilotes) des systèmes d’exploitation modernes pour supporter les nouvelles architectures multi-cœurs. Puis ce fut le tour des applications. Ce qui a par conséquent poussé Intel à développer TBB.&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align:justify"&gt;&lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span style="color:#31849B;"&gt;TBB en résumé&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align:justify;text-indent:35.4pt"&gt;TBB est une bibliothèque de programmation portable écrite en C++ qui permet la parallélisation des&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;données au sein d’un code C++ (ou compatible C++). TBB est arrivé en 2006 et fournit un haut niveau d’abstraction des&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;threads grâce à sa conception qui combine le « Task Programming » et le « Data Parallelism ». De plus, TBB est compatible avec les autres bibliothèques de programmation telle qu’OpenMP, les POSIX Threads, les fibres, les (co)routines et les Protothreads.&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align:justify;text-indent:35.4pt"&gt;Au niveau des compilateurs, il n’y a pas de restrictions particulières. N’importe quel compilateur compatible ISO C++ peut être utilisé (Intel Compiler, VC++, G++, DM, …) contrairement à Open MP qui est directement intégré au compilateur.&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align:justify;text-indent:35.4pt"&gt;Au niveau des processeurs, seuls les processeurs IA 32/64, AMD 32/64 et Sparc sont supportés pour l’instant.&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align:justify"&gt;Au niveau de la licence, elle est « open source » sous licence GPL version 2.&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align:justify"&gt;&lt;u&gt;Remarque :&lt;/u&gt; TBB n’est pas compatible avec Mono.&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align:justify"&gt;&lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span style="color:#31849B;"&gt;Quelle est la raison d’être de TBB ?&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align:justify;text-indent:35.4pt"&gt;Intel s’est&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;fixé plusieurs objectifs tels que :&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left:71.4pt;text-align:justify;text-indent: -18.0pt;mso-list:l0 level1 lfo1"&gt;&lt;span style=";font-family:Wingdings;color:#31849B;"&gt;&lt;span style="mso-list:Ignore"&gt;Ø&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Donner aux développeurs la possibilité d’utiliser le Multithreading sans en être un expert.&lt;span style="color:#31849B;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left:71.4pt;text-align:justify;text-indent: -18.0pt;mso-list:l0 level1 lfo1"&gt;&lt;span style=";font-family:Wingdings;color:#31849B;"&gt;&lt;span style="mso-list:Ignore"&gt;Ø&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Obtenir des gains de performance sur les architectures multi-cœur.&lt;span style="color:#31849B;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left:71.4pt;text-align:justify;text-indent: -18.0pt;mso-list:l0 level1 lfo1"&gt;&lt;span style=";font-family:Wingdings;color:#31849B;"&gt;&lt;span style="mso-list:Ignore"&gt;Ø&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Privilégier le « Data Parallelism » plutôt que le « Functional Parallelism ».&lt;/p&gt;  &lt;span style="line-height: 115%; font-family: Calibri, sans-serif; font-family:&amp;quot;;font-size:11.0pt;"&gt;  &lt;/span&gt;  &lt;p class="MsoNormal" style="text-align:justify"&gt;&lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span style="color:#31849B;"&gt;Quelle est la différence entre le « Data Parallelism » et le « Functional Parallelism » ?&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align:justify"&gt;Supposons le code ci-dessous :&lt;/p&gt;&lt;pre&gt;&lt;p&gt;&lt;/p&gt;  &lt;table class="MsoNormalTable" border="1" cellspacing="0" cellpadding="0" style="margin-left:5.4pt;border-collapse:collapse;border:none;mso-border-alt:  solid #78C0D4 1.0pt;mso-yfti-tbllook:1184;mso-padding-alt:0cm 5.4pt 0cm 5.4pt;  mso-border-insideh:1.0pt solid #78C0D4;mso-border-insidev:1.0pt solid #78C0D4"&gt;  &lt;tbody&gt;&lt;tr style="mso-yfti-irow:0;mso-yfti-firstrow:yes;mso-yfti-lastrow:yes;   height:30.75pt"&gt;   &lt;td width="595" valign="top" style="width:446.55pt;border:solid #78C0D4 1.0pt;   background:#D2EAF1;padding:0cm 5.4pt 0cm 5.4pt;height:30.75pt"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="line-height:115%;Courier New&amp;quot;;mso-bidi-font-weight:boldfont-family:&amp;quot;;font-size:8.0pt;"&gt;Func1() ;&lt;br /&gt;Func2() ;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt;  &lt;p class="MsoNormal" style="text-align:justify"&gt;&lt;span style=" line-height:115%;font-size:12.0pt;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;/pre&gt;&lt;br /&gt;Le « Functional Parallelism » consiste à séparer chaque fonction dans un contexte différent.&lt;p&gt;&lt;/p&gt;  &lt;table class="MsoNormalTable" border="1" cellspacing="0" cellpadding="0" style="margin-left:5.4pt;border-collapse:collapse;border:none;mso-border-alt:  solid #78C0D4 1.0pt;mso-yfti-tbllook:1184;mso-padding-alt:0cm 5.4pt 0cm 5.4pt;  mso-border-insideh:1.0pt solid #78C0D4;mso-border-insidev:1.0pt solid #78C0D4"&gt;  &lt;tbody&gt;&lt;tr style="mso-yfti-irow:0;mso-yfti-firstrow:yes;height:26.85pt"&gt;   &lt;td width="298" style="width:223.25pt;border:solid #78C0D4 1.0pt;background:   #D2EAF1;padding:0cm 5.4pt 0cm 5.4pt;height:26.85pt"&gt;   &lt;p class="MsoNormal"&gt;&lt;b&gt;&lt;span style="line-height:115%;font-size:12.0pt;"&gt;&lt;span style="mso-spacerun:yes"&gt; &lt;/span&gt;Thread 1&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="298" style="width:223.3pt;border:solid #78C0D4 1.0pt;border-left:   none;mso-border-left-alt:solid #78C0D4 1.0pt;background:#D2EAF1;padding:0cm 5.4pt 0cm 5.4pt;   height:26.85pt"&gt;   &lt;p class="MsoNormal"&gt;&lt;b&gt;&lt;span style="line-height:115%;font-size:12.0pt;"&gt;Thread   2&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt;  &lt;tr style="mso-yfti-irow:1;mso-yfti-lastrow:yes;height:26.85pt"&gt;   &lt;td width="298" style="width:223.25pt;border:solid #78C0D4 1.0pt;border-top:   none;mso-border-top-alt:solid #78C0D4 1.0pt;background:#A5D5E2;padding:0cm 5.4pt 0cm 5.4pt;   height:26.85pt"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="line-height:115%;Courier New&amp;quot;;mso-bidi-font-weight:boldfont-family:&amp;quot;;font-size:8.0pt;"&gt;Func1() ;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="298" style="width:223.3pt;border-top:none;border-left:none;   border-bottom:solid #78C0D4 1.0pt;border-right:solid #78C0D4 1.0pt;   mso-border-top-alt:solid #78C0D4 1.0pt;mso-border-left-alt:solid #78C0D4 1.0pt;   background:#A5D5E2;padding:0cm 5.4pt 0cm 5.4pt;height:26.85pt"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="line-height:115%;Courier New&amp;quot;font-family:&amp;quot;;font-size:8.0pt;"&gt;Func2() ;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt;  &lt;p class="MsoNormal" style="text-align:justify"&gt;&lt;span style=" line-height:115%;font-size:12.0pt;"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align:justify"&gt;&lt;!--[if gte vml 1]&gt;&lt;v:shapetype id="_x0000_t32" coordsize="21600,21600" spt="32" oned="t" path="m,l21600,21600e" filled="f"&gt;  &lt;v:path arrowok="t" fillok="f" connecttype="none"&gt;  &lt;o:lock ext="edit" shapetype="t"&gt; &lt;/v:shapetype&gt;&lt;v:shape id="_x0000_s1026" type="#_x0000_t32" style="'position:absolute;" connectortype="straight"&gt;&lt;![endif]--&gt;&lt;span style="mso-ignore:vglayout;position:absolute;z-index:251658240;left:0px; margin-left:2px;margin-top:5px;width:594px;height:2px"&gt;&lt;img width="594" height="2" src="file:///C:/Users/MINDSL~1/AppData/Local/Temp/msohtmlclip1/01/clip_image001.gif" shapes="_x0000_s1026" /&gt;&lt;/span&gt;&lt;span style=" line-height:115%;font-size:12.0pt;"&gt;&lt;br /&gt;&lt;/span&gt;Par opposition, si nous prenons le code ci-dessous :&lt;/p&gt;&lt;pre&gt;&lt;p&gt;&lt;/p&gt;  &lt;div style="text-align: auto;"&gt;&lt;span class="Apple-style-span"  style="border-collapse: collapse; font-size:medium;"&gt;&lt;table class="MsoNormalTable" border="1" cellspacing="0" cellpadding="0" style="margin-left:5.4pt;border-collapse:collapse;border:none;mso-border-alt:  solid #78C0D4 1.0pt;mso-yfti-tbllook:1184;mso-padding-alt:0cm 5.4pt 0cm 5.4pt;  mso-border-insideh:1.0pt solid #78C0D4;mso-border-insidev:1.0pt solid #78C0D4"&gt;  &lt;tbody&gt;&lt;tr style="mso-yfti-irow:0;mso-yfti-firstrow:yes;mso-yfti-lastrow:yes"&gt;   &lt;td width="595" valign="top" style="width:446.55pt;border:solid #78C0D4 1.0pt;   background:#D2EAF1;padding:0cm 5.4pt 0cm 5.4pt"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="line-height:115%;Courier New&amp;quot;;mso-bidi-font-weight:boldfont-family:&amp;quot;;font-size:8.0pt;"&gt;&lt;span class="Apple-style-span"  style="color:#3333FF;"&gt;For&lt;/span&gt; (i = 0 ; i &amp;lt; 42 ; ++i)&lt;br /&gt; &lt;span style="mso-spacerun:yes"&gt;         &lt;/span&gt;Func(i);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/span&gt;&lt;/div&gt;  &lt;p class="MsoNormal" style="text-align:justify"&gt;&lt;/p&gt;&lt;/pre&gt;&lt;br /&gt;Le « Data Parallelism » consiste à scinder un &lt;b style="mso-bidi-font-weight: normal"&gt;&lt;u&gt;block&lt;/u&gt;&lt;/b&gt; de donnée en &lt;b style="mso-bidi-font-weight:normal"&gt;&lt;u&gt;N block&lt;/u&gt;&lt;/b&gt; et de les traités dans un contexte différent.&lt;pre&gt;&lt;p&gt;&lt;/p&gt;  &lt;table class="MsoNormalTable" border="1" cellspacing="0" cellpadding="0" style="margin-left:5.4pt;border-collapse:collapse;border:none;mso-border-alt:  solid #78C0D4 1.0pt;mso-yfti-tbllook:1184;mso-padding-alt:0cm 5.4pt 0cm 5.4pt;  mso-border-insideh:1.0pt solid #78C0D4;mso-border-insidev:1.0pt solid #78C0D4"&gt;  &lt;tbody&gt;&lt;tr&gt;   &lt;td width="300" valign="top" style="width:224.9pt;border:solid #78C0D4 1.0pt;   background:#D2EAF1;padding:0cm 5.4pt 0cm 5.4pt"&gt;   &lt;p class="MsoNormal"&gt;&lt;b&gt;&lt;span style="line-height:115%;font-size:12.0pt;"&gt;&lt;span class="Apple-style-span"  style="color:#3333FF;"&gt;Thread   1&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="296" valign="top" style="width:221.65pt;border:solid #78C0D4 1.0pt;   border-left:none;mso-border-left-alt:solid #78C0D4 1.0pt;background:#D2EAF1;   padding:0cm 5.4pt 0cm 5.4pt"&gt;   &lt;p class="MsoNormal"&gt;&lt;b&gt;&lt;span style="line-height:115%;font-size:12.0pt;"&gt;&lt;span class="Apple-style-span"  style="color:#3333FF;"&gt;Thread   2&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt;  &lt;tr style="mso-yfti-irow:1;mso-yfti-lastrow:yes"&gt;   &lt;td width="300" valign="top" style="width:224.9pt;border:solid #78C0D4 1.0pt;   border-top:none;mso-border-top-alt:solid #78C0D4 1.0pt;background:#A5D5E2;   padding:0cm 5.4pt 0cm 5.4pt"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="line-height:115%;Courier New&amp;quot;;mso-bidi-font-weight:boldfont-family:&amp;quot;;font-size:8.0pt;"&gt;&lt;span class="Apple-style-span"  style="color:#3333FF;"&gt;for&lt;/span&gt; (i = &lt;span style="color:red;"&gt;0&lt;/span&gt; ;   i &lt; &lt;span style="color:red;"&gt;21&lt;/span&gt; ; ++i)&lt;br /&gt;&lt;span style="mso-spacerun:yes"&gt;         &lt;/span&gt;Func(i);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td width="296" valign="top" style="width:221.65pt;border-top:none;border-left:   none;border-bottom:solid #78C0D4 1.0pt;border-right:solid #78C0D4 1.0pt;   mso-border-top-alt:solid #78C0D4 1.0pt;mso-border-left-alt:solid #78C0D4 1.0pt;   background:#A5D5E2;padding:0cm 5.4pt 0cm 5.4pt"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="line-height:115%;Courier New&amp;quot;font-family:&amp;quot;;font-size:8.0pt;"&gt;&lt;span class="Apple-style-span"  style="color:#3333FF;"&gt;for&lt;/span&gt; (i = &lt;span style="color:red;"&gt;21&lt;/span&gt; ; i &lt; &lt;span style="color:red;"&gt;42&lt;/span&gt; ; ++i)&lt;br /&gt;&lt;span style="mso-spacerun:yes"&gt;   &lt;/span&gt;&lt;span style="mso-spacerun:yes"&gt;      &lt;/span&gt;Func(i);&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt;  &lt;p class="MsoNormal" style="text-align:justify"&gt;&lt;span style=" line-height:115%;font-size:12.0pt;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;/pre&gt;&lt;br /&gt;Le grand avantage du « Data Parallelism » c’est qu’il est beaucoup plus évolutif dans ma mesure que l’on peut changer la taille des blocks à traité, sans devoir réécrire le code. De plus on peut facilement imaginer un scheduler (ordonnanceur de tâches) qui va définir&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;la taille des blocks et leurs contextes en fonction de l’architecture matérielle et logicielle (ce que fait TBB).&lt;p&gt;&lt;/p&gt;  &lt;span style="line-height: 115%; font-family: Calibri, sans-serif; font-family:&amp;quot;;font-size:12.0pt;"&gt;  &lt;/span&gt;  &lt;p class="MsoNormal" style="text-align:justify"&gt;&lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span style="color:#31849B;"&gt;Architecture de TBB&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align:justify;text-indent:35.4pt"&gt;L’architecture de TBB est composée de plusieurs couches dont la première est « les allocateurs de mémoire ». Chaque couche repose sur l’implémentation de la précédente à l’exception de la première. Voici le schéma de l’architecture de TBB (à lire de bas en haut) :&lt;/p&gt;&lt;p class="MsoNormal" style="text-align:justify;text-indent:35.4pt"&gt;&lt;img src="http://1.bp.blogspot.com/_hm-8HpFJuDs/S3SPC93ve4I/AAAAAAAAAFs/1R4p8dwTq50/s400/arch.png" /&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="text-align:justify;text-indent:35.4pt"&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="text-align:justify"&gt;&lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span style="color:#31849B;"&gt;TBB par la pratique&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align:justify;text-indent:35.4pt"&gt;La meilleure façon d’apprendre une technologie c’est par la pratique. Par conséquent, nous allons commencer par un cas simple. Pour notre exemple nous allons partir du code suivant :&lt;/p&gt;&lt;pre&gt;&lt;p&gt;&lt;/p&gt;  &lt;table class="MsoNormalTable" border="1" cellspacing="0" cellpadding="0" style="margin-left:5.4pt;border-collapse:collapse;border:none;mso-border-alt:  solid #78C0D4 1.0pt;mso-yfti-tbllook:1184;mso-padding-alt:0cm 5.4pt 0cm 5.4pt;  mso-border-insideh:1.0pt solid #78C0D4;mso-border-insidev:1.0pt solid #78C0D4"&gt;  &lt;tbody&gt;&lt;tr style="mso-yfti-irow:0;mso-yfti-firstrow:yes;mso-yfti-lastrow:yes"&gt;   &lt;td width="607" valign="top" style="width:455.2pt;border:solid #78C0D4 1.0pt;   background:#D2EAF1;padding:0cm 5.4pt 0cm 5.4pt"&gt;   &lt;p class="MsoNormal" style="tab-stops:115.2pt"&gt;&lt;span style="   line-height:115%;Courier New&amp;quot;;mso-bidi-font-weight:boldfont-family:&amp;quot;;font-size:8.0pt;"&gt;&lt;span lang="EN-US"   style="line-height: 115%; font-family: 'Courier New'; font-family:Calibri;font-size:8.0pt;"&gt;&lt;span class="Apple-style-span"  style="color:#3333FF;"&gt;void&lt;/span&gt;&lt;span style="mso-spacerun:yes"&gt;            &lt;/span&gt;Func1(&lt;span class="Apple-style-span"  style="color:#3333FF;"&gt;float&lt;/span&gt; *tab, &lt;span class="Apple-style-span"  style="color:#3333FF;"&gt;int&lt;/span&gt; size)&lt;br /&gt;{&lt;br /&gt;&lt;span&gt;      &lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#3333FF;"&gt;for&lt;/span&gt; (&lt;span class="Apple-style-span"  style="color:#3333FF;"&gt;int&lt;/span&gt; i = 0; i &amp;lt; size; ++i)&lt;br /&gt;&lt;span style="mso-spacerun:yes"&gt;           &lt;/span&gt;tab[i] = Func2(i);&lt;br /&gt;}&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt;  &lt;p class="MsoNormal" style="text-align:justify;text-indent:35.4pt"&gt;&lt;span style="line-height:115%;font-size:12.0pt;"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;span style="line-height: 115%; font-family: Calibri, sans-serif; font-family:&amp;quot;;font-size:12.0pt;"&gt;  &lt;/span&gt;  &lt;p class="MsoNormal" style="text-align:justify"&gt;&lt;/p&gt;&lt;/pre&gt;Dans ce code, nous devons traités un tableau de nombre flottant et effectuer un traitement sur chacun des membres de ce tableau. Comme nous avons vu précédemment, TBB fonctionne autour du « Data Parallelism » et du « Task Programming ». Ainsi, nous allons considérer trois choses :&lt;p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left:71.4pt;text-align:justify;text-indent: -18.0pt;mso-list:l0 level1 lfo1"&gt;&lt;span style=";font-family:Wingdings;color:#31849B;"&gt;&lt;span style="mso-list:Ignore"&gt;Ø&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Notre tableau de nombre flottant constitue un &lt;b style="mso-bidi-font-weight:normal"&gt;block de donnée&lt;/b&gt;.&lt;span style="color:#31849B;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left:71.4pt;text-align:justify;text-indent: -18.0pt;mso-list:l0 level1 lfo1"&gt;&lt;span style=";font-family:Wingdings;color:#31849B;"&gt;&lt;span style="mso-list:Ignore"&gt;Ø&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Notre bloque de donnée peut être &lt;b style="mso-bidi-font-weight:normal"&gt;découpé&lt;/b&gt; en sous block.&lt;span style="color:#31849B;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left:71.4pt;text-align:justify;text-indent: -18.0pt;mso-list:l0 level1 lfo1"&gt;&lt;span style=";font-family:Wingdings;color:#31849B;"&gt;&lt;span style="mso-list:Ignore"&gt;Ø&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Le traitement sur un block constitue une tâche.&lt;span style="color:#31849B;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align:justify"&gt;La première étape est de créer la « class » qui va représenter le traitement sur un block de donnée. Cette « class » prendra dans un constructeur public un pointeur sur notre tableau de nombre flottant (notre block) et le stockera.&lt;/p&gt;&lt;pre&gt;&lt;p&gt;&lt;/p&gt;  &lt;table class="MsoNormalTable" border="1" cellspacing="0" cellpadding="0" style="margin-left:5.4pt;border-collapse:collapse;border:none;mso-border-alt:  solid #78C0D4 1.0pt;mso-yfti-tbllook:1184;mso-padding-alt:0cm 5.4pt 0cm 5.4pt;  mso-border-insideh:1.0pt solid #78C0D4;mso-border-insidev:1.0pt solid #78C0D4"&gt;  &lt;tbody&gt;&lt;tr style="mso-yfti-irow:0;mso-yfti-firstrow:yes;mso-yfti-lastrow:yes"&gt;   &lt;td width="607" valign="top" style="width:455.2pt;border:solid #78C0D4 1.0pt;   background:#D2EAF1;padding:0cm 5.4pt 0cm 5.4pt"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="line-height:115%;Courier New&amp;quot;;mso-bidi-font-weight:boldfont-family:&amp;quot;;font-size:8.0pt;"&gt;&lt;span class="Apple-style-span"  style="color:#3333FF;"&gt;class&lt;/span&gt; &lt;span style="mso-spacerun:yes"&gt;           &lt;/span&gt;&lt;span style="mso-spacerun:yes"&gt; &lt;/span&gt;CalcFloat&lt;br /&gt;{&lt;br /&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#3333FF;"&gt;public:&lt;/span&gt;&lt;br /&gt;&lt;span style="mso-spacerun:yes"&gt;                  &lt;/span&gt;CalcFloat(&lt;span class="Apple-style-span"  style="color:#3333FF;"&gt;float&lt;/span&gt; *tab)   : _tab(tab) {&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span&gt;      &lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#3333FF;"&gt;private:&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="color:#3333FF;"&gt;           &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#3333FF;"&gt;float&lt;/span&gt;&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;*_tab ;&lt;br /&gt;} ;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt;  &lt;p class="MsoNormal" style="text-align:justify"&gt;&lt;span style=" line-height:115%;font-size:12.0pt;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;/pre&gt;&lt;br /&gt;&lt;u&gt;Remarque :&lt;/u&gt; Le pointeur passé en paramètre dans le constructeur de « CalcFloat » sera l’adresse du tableau (du block) au complet. &lt;p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align:justify"&gt;Maintenant, il faut rajouter une méthode qui effectuera le traitement sur le block qu’elle contient. En réalité TBB n’utilise pas une méthode mais la surcharge de l’opérateur (). De plus, cet opérateur n’effectuera pas le traitement sur l’intégralité du block mais sur une portion (&lt;b style="mso-bidi-font-weight:normal"&gt;range&lt;/b&gt;). Sous TBB, une portion est définie par un « blocked_range ». Ainsi à chaque appel de l’opérateur on reçoit en paramètre la portion sur laquelle il faut effectuer un traitement.&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align:justify"&gt;&lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span style="color:#31849B;"&gt;Les « blocked_range »&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align:justify;text-indent:35.4pt"&gt;Il existe 3 types de blocked_range :&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left:71.4pt;text-align:justify;text-indent: -18.0pt;mso-list:l0 level1 lfo1"&gt;&lt;span style=";font-family:Wingdings;color:#31849B;"&gt;&lt;span style="mso-list:Ignore"&gt;Ø&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Unidimensionnel: blocked_range&lt;/p&gt;&lt;p class="MsoNormal" style="margin-left:71.4pt;text-align:justify;text-indent: -18.0pt;mso-list:l0 level1 lfo1"&gt;&lt;span style=";font-family:Wingdings;color:#31849B;"&gt;&lt;span style="mso-list:Ignore"&gt;Ø&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Bidimensionnel: blocked_range&lt;/p&gt;&lt;p class="MsoNormal" style="margin-left:71.4pt;text-align:justify;text-indent: -18.0pt;mso-list:l0 level1 lfo1"&gt;&lt;span style=";font-family:Wingdings;color:#31849B;"&gt;&lt;span style="mso-list:Ignore"&gt;Ø&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;Tridimensionnel: blocked_range&lt;/p&gt;&lt;col&gt;  &lt;p class="MsoNormal" style="margin-left:35.4pt;text-align:justify"&gt;La particularité des blocked_range c’est qu’ils implémentent un « Split Constructor » que nous détaillerons un peu plus loin.&lt;/p&gt;  &lt;span style="line-height: 115%; font-family: Calibri, sans-serif; font-family:&amp;quot;;font-size:12.0pt;"&gt;  &lt;/span&gt;  &lt;p class="MsoNormal" style="text-align:justify"&gt;Dans notre cas, nous avons un conteneur unidimensionnel représenté par notre tableau de nombre flottant. Par conséquent nous allons utiliser un &lt;b style="mso-bidi-font-weight:normal"&gt;blocked_range&lt;/b&gt;&lt;/p&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;&lt;/b&gt;&lt;pre&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;&lt;float&gt;&lt;/float&gt;&lt;/b&gt;&lt;p&gt;&lt;/p&gt;  &lt;table class="MsoNormalTable" border="1" cellspacing="0" cellpadding="0" style="border-collapse:collapse;border:none;mso-border-alt:solid #78C0D4 1.0pt;  mso-yfti-tbllook:1184;mso-padding-alt:0cm 5.4pt 0cm 5.4pt;mso-border-insideh:  1.0pt solid #78C0D4;mso-border-insidev:1.0pt solid #78C0D4"&gt;&lt;tbody&gt;&lt;tr style="mso-yfti-irow:0;mso-yfti-firstrow:yes;mso-yfti-lastrow:yes"&gt;&lt;td width="614" valign="top" style="width:460.6pt;border:solid #78C0D4 1.0pt;   background:#D2EAF1;padding:0cm 5.4pt 0cm 5.4pt"&gt;&lt;p class="MsoNormal"&gt;&lt;span style="line-height:   115%;Courier New&amp;quot;;mso-bidi-font-weight:boldfont-family:&amp;quot;;font-size:8.0pt;"&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;#include &amp;lt;tbb/blocked_range.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span"  style="color:#3333FF;"&gt;class&lt;/span&gt;&lt;span style="mso-spacerun:yes"&gt;               &lt;/span&gt;CalcFloat&lt;br /&gt;{&lt;br /&gt;&lt;span&gt;      &lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#3333FF;"&gt;public:&lt;/span&gt;&lt;br /&gt;&lt;span style="mso-spacerun:yes"&gt;                    &lt;/span&gt;CalcFloat(&lt;span class="Apple-style-span"  style="color:#3333FF;"&gt;float&lt;/span&gt;   *tab) : _tab(tab) {&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;}&lt;br /&gt;&lt;span style="color:red;"&gt;&lt;span style="mso-spacerun:yes"&gt;               &lt;/span&gt;void&lt;span style="mso-spacerun:yes"&gt;   &lt;/span&gt;operator () (const   tbb::blocked_range&lt;float&gt; &amp;amp;range) const&lt;br /&gt;&lt;span style="mso-spacerun:yes"&gt;             &lt;/span&gt;{&lt;br /&gt;&lt;span style="mso-spacerun:yes"&gt;             &lt;/span&gt;}&lt;/float&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;      &lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#3333FF;"&gt;private:&lt;/span&gt;&lt;br /&gt;&lt;span&gt;             &lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#3333FF;"&gt;float&lt;/span&gt;&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;*_tab;&lt;br /&gt;} ;&lt;/span&gt;&lt;span style="line-height:115%;Courier New&amp;quot;font-family:&amp;quot;;font-size:8.0pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt;  &lt;p class="MsoNormal" style="text-align:justify"&gt;&lt;span style=" line-height:115%;font-size:12.0pt;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;/pre&gt;&lt;br /&gt;Il ne nous reste plus qu’à ajouter notre traitement :&lt;pre&gt;&lt;p&gt;&lt;/p&gt;  &lt;table class="MsoNormalTable" border="1" cellspacing="0" cellpadding="0" style="border-collapse:collapse;border:none;mso-border-alt:solid #78C0D4 1.0pt;  mso-yfti-tbllook:1184;mso-padding-alt:0cm 5.4pt 0cm 5.4pt;mso-border-insideh:  1.0pt solid #78C0D4;mso-border-insidev:1.0pt solid #78C0D4"&gt;  &lt;tbody&gt;&lt;tr style="mso-yfti-irow:0;mso-yfti-firstrow:yes;mso-yfti-lastrow:yes"&gt;   &lt;td width="614" valign="top" style="width:460.6pt;border:solid #78C0D4 1.0pt;   background:#D2EAF1;padding:0cm 5.4pt 0cm 5.4pt"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="line-height:115%;Courier New&amp;quot;;mso-bidi-font-weight:boldfont-family:&amp;quot;;font-size:8.0pt;"&gt;&lt;tbb/blocked_range.h&gt;#include &amp;lt;tbb/blocked_range.h&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span"  style="color:#3333FF;"&gt;class&lt;/span&gt;&lt;span style="mso-spacerun:yes"&gt;               &lt;/span&gt;CalcFloat&lt;br /&gt;{&lt;br /&gt;&lt;span&gt;      &lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#3333FF;"&gt;public:&lt;/span&gt;&lt;br /&gt;&lt;span style="mso-spacerun:yes"&gt;                    &lt;/span&gt;CalcFloat(&lt;span class="Apple-style-span"  style="color:#3333FF;"&gt;float&lt;/span&gt;   *tab) : _tab(tab) {&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;}&lt;br /&gt;&lt;span&gt;             &lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#3333FF;"&gt;void&lt;/span&gt;&lt;span style="mso-spacerun:yes"&gt;   &lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#3333FF;"&gt;operator&lt;/span&gt; () (&lt;span class="Apple-style-span"  style="color:#3333FF;"&gt;const&lt;/span&gt;   tbb::blocked_range&lt;float&gt; &amp;amp;range) &lt;span class="Apple-style-span"  style="color:#3333FF;"&gt;const&lt;/span&gt;&lt;br /&gt;&lt;span style="mso-spacerun:yes"&gt;             &lt;/span&gt;{&lt;br /&gt;&lt;span style="color:red;"&gt;&lt;span style="mso-spacerun:yes"&gt;                      &lt;/span&gt;for (int i = range.begin(); i != range.end(); ++i)&lt;br /&gt;&lt;span style="mso-spacerun:yes"&gt;                        &lt;/span&gt;this-&gt;_tab[i]   = Func2(i);&lt;/span&gt;&lt;br /&gt;&lt;span style="mso-spacerun:yes"&gt;             &lt;/span&gt;}&lt;br /&gt;&lt;span style="mso-spacerun:yes"&gt;      &lt;/span&gt;private:&lt;br /&gt;&lt;span&gt;             &lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#3333FF;"&gt;float&lt;/span&gt;&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;*_tab;&lt;br /&gt;} ;&lt;/float&gt;&lt;/tbb/blocked_range.h&gt;&lt;/span&gt;&lt;span style="line-height:115%;Courier New&amp;quot;font-family:&amp;quot;;font-size:8.0pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt;  &lt;p class="MsoNormal" style="text-align:justify"&gt;&lt;span style=" line-height:115%;font-size:12.0pt;"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align:justify"&gt;&lt;/p&gt;&lt;/pre&gt;Enfin, la dernière étape consiste à utiliser l’algorithme « parallel_for » à la place du « for » dans « Func1 ».&lt;pre&gt;&lt;p&gt;&lt;/p&gt;  &lt;table class="MsoNormalTable" border="1" cellspacing="0" cellpadding="0" style="border-collapse:collapse;border:none;mso-border-alt:solid #78C0D4 1.0pt;  mso-yfti-tbllook:1184;mso-padding-alt:0cm 5.4pt 0cm 5.4pt;mso-border-insideh:  1.0pt solid #78C0D4;mso-border-insidev:1.0pt solid #78C0D4"&gt;  &lt;tbody&gt;&lt;tr style="mso-yfti-irow:0;mso-yfti-firstrow:yes;mso-yfti-lastrow:yes"&gt;   &lt;td width="614" valign="top" style="width:460.6pt;border:solid #78C0D4 1.0pt;   background:#D2EAF1;padding:0cm 5.4pt 0cm 5.4pt"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="line-height:115%;Courier New&amp;quot;;mso-bidi-font-weight:boldfont-family:&amp;quot;;font-size:8.0pt;"&gt;&lt;span class="Apple-style-span"  style="color:#3333FF;"&gt;void&lt;/span&gt;&lt;span style="mso-spacerun:yes"&gt;      &lt;/span&gt;Func1(&lt;span class="Apple-style-span"  style="color:#3333FF;"&gt;float&lt;/span&gt; *tab, &lt;span class="Apple-style-span"  style="color:#3333FF;"&gt;int&lt;/span&gt; size)&lt;br /&gt;{&lt;br /&gt;&lt;span style="mso-spacerun:yes"&gt;      &lt;/span&gt;tbb::parallel_for(tbb::blocked_range&lt;float&gt;(0,   size),&lt;br /&gt;&lt;span style="mso-spacerun:yes"&gt;                 &lt;/span&gt;CalcFloat(tab))&lt;br /&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/float&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt;  &lt;p class="MsoNormal" style="text-align:justify"&gt;&lt;span style=" line-height:115%;font-size:12.0pt;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;/pre&gt;&lt;br /&gt;On remarque que le constructeur du blocked_range prend la taille du block à traiter (0 -&gt; size).&lt;p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align:justify"&gt;Grâce à ce code, TBB va découper le blocked_range en plusieurs morceaux puis appeler la surcharge de l’opérateur () pour chacun de ces morceaux (qui sont aussi des blocked_range).&lt;br /&gt;Bien entendu ce découpage n’est pas aléatoire, il sera détaillé dans la section « granularité ».    &lt;/p&gt;  &lt;span style="line-height: 115%; font-family: Calibri, sans-serif; font-family:&amp;quot;;font-size:12.0pt;"&gt;  &lt;/span&gt;  &lt;p class="MsoNormal" style="text-align:justify"&gt;Voici le code final :&lt;/p&gt;&lt;pre&gt;&lt;p&gt;&lt;/p&gt;  &lt;table class="MsoNormalTable" border="1" cellspacing="0" cellpadding="0" style="border-collapse:collapse;border:none;mso-border-alt:solid #78C0D4 1.0pt;  mso-yfti-tbllook:1184;mso-padding-alt:0cm 5.4pt 0cm 5.4pt;mso-border-insideh:  1.0pt solid #78C0D4;mso-border-insidev:1.0pt solid #78C0D4"&gt;  &lt;tbody&gt;&lt;tr style="mso-yfti-irow:0;mso-yfti-firstrow:yes;mso-yfti-lastrow:yes"&gt;   &lt;td width="614" valign="top" style="width:460.6pt;border:solid #78C0D4 1.0pt;   background:#D2EAF1;padding:0cm 5.4pt 0cm 5.4pt"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="line-height:115%;Courier New&amp;quot;;mso-bidi-font-weight:boldfont-family:&amp;quot;;font-size:8.0pt;"&gt;&lt;tbb/blocked_range.h&gt;#include &amp;lt;tbb/blocked_range.h&amp;gt;&lt;br /&gt;&lt;span class="Apple-style-span"  style="color:#FF0000;"&gt;#include &amp;lt;tbb/parallel_for.h&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span"  style="color:#3333FF;"&gt;class&lt;/span&gt;&lt;span style="mso-spacerun:yes"&gt;               &lt;/span&gt;CalcFloat&lt;br /&gt;{&lt;br /&gt;&lt;span&gt;      &lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#3333FF;"&gt;public:&lt;/span&gt;&lt;br /&gt;&lt;span style="mso-spacerun:yes"&gt;                    &lt;/span&gt;CalcFloat(&lt;span class="Apple-style-span"  style="color:#3333FF;"&gt;float&lt;/span&gt;   *tab) : _tab(tab) {&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;}&lt;br /&gt;&lt;span&gt;             &lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#3333FF;"&gt;void&lt;/span&gt;&lt;span style="mso-spacerun:yes"&gt;   &lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#3333FF;"&gt;operator&lt;/span&gt; () (&lt;span class="Apple-style-span"  style="color:#3333FF;"&gt;const&lt;/span&gt;   tbb::blocked_range&lt;float&gt; &amp;amp;range) &lt;span class="Apple-style-span"  style="color:#3333FF;"&gt;const&lt;/span&gt;&lt;br /&gt;&lt;span style="mso-spacerun:yes"&gt;             &lt;/span&gt;{&lt;br /&gt;&lt;span&gt;                    &lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#3333FF;"&gt;for&lt;/span&gt; (&lt;span class="Apple-style-span"  style="color:#3333FF;"&gt;int&lt;/span&gt; i =   range.begin(); i != range.end(); ++i)&lt;br /&gt;&lt;span&gt;                          &lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#3333FF;"&gt;this&lt;/span&gt;-&gt;_tab[i] = Func2(i);&lt;br /&gt;&lt;span style="mso-spacerun:yes"&gt;             &lt;/span&gt;}&lt;br /&gt;&lt;span&gt;      &lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#3333FF;"&gt;private:&lt;/span&gt;&lt;br /&gt;&lt;span&gt;             &lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#3333FF;"&gt;float&lt;/span&gt;&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;*_tab;&lt;br /&gt;} ;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span"  style="color:#3333FF;"&gt;void&lt;/span&gt;&lt;span style="mso-spacerun:yes"&gt;      &lt;/span&gt;Func1(&lt;span class="Apple-style-span"  style="color:#3333FF;"&gt;float&lt;/span&gt; *tab, &lt;span class="Apple-style-span"  style="color:#3333FF;"&gt;int&lt;/span&gt; size)&lt;br /&gt;{&lt;br /&gt;&lt;span style="mso-spacerun:yes"&gt;        &lt;/span&gt;tbb::parallel_for(tbb::blocked_range&lt;float&gt;(0, size),&lt;br /&gt;&lt;span style="mso-spacerun:yes"&gt;                 &lt;/span&gt;CalcFloat(tab))&lt;br /&gt;}&lt;/float&gt;&lt;/float&gt;&lt;/tbb/blocked_range.h&gt;&lt;/span&gt;&lt;span style="line-height:115%;mso-bidi-font-weight:   boldfont-size:12.0pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt;  &lt;p class="MsoNormal" style="text-align:justify"&gt;&lt;span style=" line-height:115%;font-size:12.0pt;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;&lt;span style="color:#31849B;"&gt;Split Constructor&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-indent:35.4pt"&gt;Comme nous avons vu à la section précédente, chaque block de donnée est découpé et traité séparément. Ce découpage est réalisé par l’intermédiaire d’un « Split Constructor » que le blocked_range implémente. Ainsi les blocks sont récursivement découpés dans les algorithmes de parallélisation de TBB tels que le « parallel_for ».&lt;/p&gt;&lt;pre&gt;&lt;p&gt;&lt;/p&gt;  &lt;table class="MsoNormalTable" border="1" cellspacing="0" cellpadding="0" style="border-collapse:collapse;border:none;mso-border-alt:solid #78C0D4 1.0pt;  mso-yfti-tbllook:1184;mso-padding-alt:0cm 5.4pt 0cm 5.4pt;mso-border-insideh:  1.0pt solid #78C0D4;mso-border-insidev:1.0pt solid #78C0D4"&gt;  &lt;tbody&gt;&lt;tr style="mso-yfti-irow:0;mso-yfti-firstrow:yes;mso-yfti-lastrow:yes"&gt;   &lt;td width="614" valign="top" style="width:460.6pt;border:solid #78C0D4 1.0pt;   background:#D2EAF1;padding:0cm 5.4pt 0cm 5.4pt"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="line-height:115%;Courier New&amp;quot;;mso-bidi-font-weight:boldfont-family:&amp;quot;;font-size:8.0pt;"&gt;Range::~Range()&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#009900;"&gt;// Destructeur.&lt;/span&gt;&lt;br /&gt;Range::Range(Range &amp;amp;r, split)&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#009900;"&gt;//   Coupe r en deux.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span"  style="color:#3333FF;"&gt;bool&lt;/span&gt; Range::empty() &lt;span class="Apple-style-span"  style="color:#3333FF;"&gt;const&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#009900;"&gt;// vrai si   il est vide.&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span"  style="color:#3333FF;"&gt;bool&lt;/span&gt; Range::is_divisible() &lt;span class="Apple-style-span"  style="color:#3333FF;"&gt;const&lt;/span&gt;&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#009900;"&gt;//   vrai si il peut être découpé.&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="line-height:115%;font-size:12.0pt;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;/pre&gt;&lt;br /&gt;&lt;u&gt;Remarque :&lt;/u&gt; de préférence, on essai toujours que lorsque l’on coupe un « range » en deux, les deux parties soient égales pour ne pas tromper le scheduleur (ordonnanceur de tâches).&lt;p&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-indent:35.4pt"&gt;Le découpage des blocks est réalisé par l’intermédiaire du « Partitioner » qui s’appui entre-autre sur la valeur de la granularité du block.&lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span style="color:#31849B;"&gt;&lt;br /&gt;&lt;br /&gt;Granularité&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align:justify;text-indent:35.4pt"&gt;Pour que le « Partitioner » découpe de façon optimisé les blocks, il à besoin de connaître la granularité de chaque block. La granularité constitue l’unité d’itération. Elle peut être explicite ou implicite. En effet, nous n’avons pas précisé de granularité dans notre exemple avec le parallel_for. Sous TBB la granularité est représenté par un entier non-signé.&lt;/p&gt;  &lt;span style="line-height: 115%; font-family: Calibri, sans-serif; font-family:&amp;quot;;font-size:12.0pt;"&gt;  &lt;/span&gt;  &lt;p class="MsoNormal" style="text-align:justify"&gt;On peut expliciter la granularité grâce au troisième paramètre du blocked_range :&lt;/p&gt;&lt;pre&gt;&lt;p&gt;&lt;/p&gt;  &lt;table class="MsoNormalTable" border="1" cellspacing="0" cellpadding="0" style="border-collapse:collapse;border:none;mso-border-alt:solid #78C0D4 1.0pt;  mso-yfti-tbllook:1184;mso-padding-alt:0cm 5.4pt 0cm 5.4pt;mso-border-insideh:  1.0pt solid #78C0D4;mso-border-insidev:1.0pt solid #78C0D4"&gt;  &lt;tbody&gt;&lt;tr style="mso-yfti-irow:0;mso-yfti-firstrow:yes;mso-yfti-lastrow:yes"&gt;   &lt;td width="614" valign="top" style="width:460.6pt;border:solid #78C0D4 1.0pt;   background:#D2EAF1;padding:0cm 5.4pt 0cm 5.4pt"&gt;   &lt;p class="MsoNormal"&gt;&lt;span style="line-height:115%;Courier New&amp;quot;;mso-bidi-font-weight:boldfont-family:&amp;quot;;font-size:8.0pt;"&gt;&lt;span class="Apple-style-span"  style="color:#3333FF;"&gt;void&lt;/span&gt;&lt;span style="mso-spacerun:yes"&gt;      &lt;/span&gt;Func1(&lt;span class="Apple-style-span"  style="color:#3333FF;"&gt;float&lt;/span&gt; *tab, &lt;span class="Apple-style-span"  style="color:#3333FF;"&gt;int&lt;/span&gt; size)&lt;br /&gt;{&lt;br /&gt;&lt;span style="mso-spacerun:yes"&gt;        &lt;/span&gt;tbb::parallel_for(tbb::blocked_range&lt;float&gt;(0, size&lt;span style="color:red;"&gt;, 42&lt;/span&gt;),&lt;br /&gt;&lt;span style="mso-spacerun:yes"&gt;                 &lt;/span&gt;CalcFloat(tab))&lt;br /&gt;}&lt;/float&gt;&lt;/span&gt;&lt;span style="line-height:115%;mso-bidi-font-weight:   boldfont-size:12.0pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt;  &lt;p class="MsoNormal"&gt;&lt;span style="line-height:115%;font-size:12.0pt;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;/pre&gt;&lt;br /&gt;La valeur de la granularité a une très grande influence sur les performances du programme. Mais si elle est mal calculée, elle peut avoir des conséquences désastreuses.&lt;br /&gt;&lt;br /&gt;Voici un graphique fournit pas Intel qui illustre l’importance de la granularité :&lt;p&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;img src="http://4.bp.blogspot.com/_hm-8HpFJuDs/S3SPiYJMWyI/AAAAAAAAAF0/BWTIsOFpVKM/s400/grainsize.png" /&gt;&lt;/p&gt;&lt;p class="MsoNormal"&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="margin-left:70.8pt"&gt;&lt;span style=" line-height:115%;mso-bidi-font-weight:boldfont-size:8.0pt;"&gt;Calcul de A[i] = B[i] * C sur 1 million de float avec une machine à 4 sockets et 8 hard-threads.&lt;/span&gt;&lt;b&gt; &lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align:justify;text-indent:35.4pt"&gt;On remarque que le graphique est en forme de baignoire.&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;En effet, le temps d’exécution du programme diminue jusqu'à que la granularité atteint 100000 puis remonte assez brusquement.&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;On peu considérer que les performances sont correctes quand la granularité est comprise entre 100 et 100000.&lt;/p&gt;&lt;p class="MsoNormal" style="text-align:justify"&gt;&lt;b style="mso-bidi-font-weight: normal"&gt;Mais quelle est la valeur optimale pour la granularité dans notre cas ?&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align:justify;text-indent:35.4pt"&gt;En réalité c’est très simple, il suffit de prendre la plus grande valeur de l’intervalle ou les performances sont correctes.&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align:justify"&gt;&lt;b style="mso-bidi-font-weight: normal"&gt;Pourquoi ?&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align:justify;text-indent:35.4pt"&gt;Plus la valeur de la granularité est petite, plus les blocks sont petits. Par conséquent il est inutile de surchargé le scheduler (ordonnanceur de tâches) avec des petits fragments. D’autant plus que cela n’apporte aucun grain de performance par rapport à une granularité fixé à 100000.&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align:justify"&gt;&lt;b style="mso-bidi-font-weight: normal"&gt;Pourquoi ne pas laisser TBB décider de la valeur de la granularité ?&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align:justify;text-indent:35.4pt"&gt;Même si la valeur que l’on définit est identique à celle qu’il calcul, il est préférable d’expliciter la granularité car cela évite qu’il la calcule (donc gain de temps). De plus la granularité dépend aussi du traitement que l’on va effectuer sur le block. Par conséquent, TBB ne peut pas toujours calculer de façon fiable la granularité à tous les coups.&lt;/p&gt;  &lt;span style="line-height: 115%; font-family: Calibri, sans-serif; font-family:&amp;quot;;font-size:12.0pt;"&gt;  &lt;/span&gt;  &lt;p class="MsoNormal" style="text-align:justify"&gt;&lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span style="color:#31849B;"&gt;Partitioner&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align:justify;text-indent:35.4pt"&gt;Le « Partitioner » est le dispositif de TBB qui est chargé de découper les « Range » en « SubRange ». Il intervient pour deux algorithmes :&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left:71.4pt;text-align:justify;text-indent: -18.0pt;mso-list:l0 level1 lfo1"&gt;&lt;span style=";font-family:Wingdings;color:#31849B;"&gt;&lt;span style="mso-list:Ignore"&gt;Ø&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;parallel_for&lt;span style="color:#31849B;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left:71.4pt;text-align:justify;text-indent: -18.0pt;mso-list:l0 level1 lfo1"&gt;&lt;span style=";font-family:Wingdings;color:#31849B;"&gt;&lt;span style="mso-list:Ignore"&gt;Ø&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;parallel_reduce&lt;span style="color:#31849B;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align:justify"&gt;Il existe 3 types de « partitioner » :&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left:71.4pt;text-align:justify;text-indent: -18.0pt;mso-list:l0 level1 lfo1"&gt;&lt;span style=";font-family:Wingdings;color:#31849B;"&gt;&lt;span style="mso-list:Ignore"&gt;Ø&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;simple_partitioner : taille des blocks = valeur de la granularité.&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left:71.4pt;text-align:justify;text-indent: -18.0pt;mso-list:l0 level1 lfo1"&gt;&lt;span style=";font-family:Wingdings;color:#31849B;"&gt;&lt;span style="mso-list:Ignore"&gt;Ø&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;auto_partitioner : taille des blocks automatiques (calculé en interne).&lt;span style="color:#31849B;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left:71.4pt;text-align:justify;text-indent: -18.0pt;mso-list:l0 level1 lfo1"&gt;&lt;span style=";font-family:Wingdings;color:#31849B;"&gt;&lt;span style="mso-list:Ignore"&gt;Ø&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;affinity_partitioner : auto_partitioner + gestion du « cache affinity ».&lt;span style="color:#31849B;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align:justify;text-indent:35.4pt"&gt;Il est tentant d’utiliser le « affinity_partitioner » dans tous les cas, car celui-ci est le plus complet. Pourtant il faut bien faire attention à son emploi.&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align:justify;text-indent:35.4pt"&gt;Voici un graphique fournit par Intel qui illustre la différence entre le «auto_partitioner » et le « affinity_partitioner » :&lt;/p&gt;&lt;p class="MsoNormal" style="text-align:justify;text-indent:35.4pt"&gt;&lt;img src="http://1.bp.blogspot.com/_hm-8HpFJuDs/S3SP6OfOC4I/AAAAAAAAAF8/OGKTwadyRZQ/s400/partitioner.png" /&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="text-align:justify;text-indent:35.4pt"&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="text-align:justify;text-indent:35.4pt"&gt;On remarque que le « affinity_partitioner » est utile lorsque l’on a un nombre important d’élément. Attention, l’abus du « affinity_partitioner » peut avoir des effets très négatifs sur la performance du code. Seule l’expérience peut déterminer si son emploi est justifié.&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align:justify"&gt;&lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span style="color:#31849B;"&gt;Les conteneurs&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align:justify;text-indent:35.4pt"&gt;Le gros défaut des conteneurs de la STL (Standard Template Library) c’est qu’ils ne sont pas « Thread-Safe » et que par conséquent, (dans la plupart des cas) on encapsule chaque accès du conteneur dans une section critique par l’intermédiaire de mutex, sémaphores, barrières, etc. Quant à lui, TBB fournit 4 conteneurs qui répondent à la plupart des besoins :&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left:71.4pt;text-align:justify;text-indent: -18.0pt;mso-list:l0 level1 lfo1;tab-stops:list 36.0pt"&gt;&lt;span style=";font-family:Wingdings;color:#31849B;"&gt;&lt;span style="mso-list:Ignore"&gt;Ø&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;concurrent_hash_map : Quasi similaire à la std::map de la STL.&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left:71.4pt;text-align:justify;text-indent: -18.0pt;mso-list:l0 level1 lfo1"&gt;&lt;span style=";font-family:Wingdings;color:#31849B;"&gt;&lt;span style="mso-list:Ignore"&gt;Ø&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="mso-spacerun:yes"&gt; &lt;/span&gt;concurrent_vector :&lt;span style="line-height: 115%; font-family: Arial, sans-serif; font-family:&amp;quot;;font-size:12.0pt;color:black;"&gt; &lt;/span&gt;Similaire au std::vector de la STL.&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left:71.4pt;text-align:justify;text-indent: -18.0pt;mso-list:l0 level1 lfo1"&gt;&lt;span style=";font-family:Wingdings;color:#31849B;"&gt;&lt;span style="mso-list:Ignore"&gt;Ø&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="mso-spacerun:yes"&gt; &lt;/span&gt;concurrent_queue : Une FIFO non bloquante.&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left:71.4pt;text-align:justify;text-indent: -18.0pt;mso-list:l0 level1 lfo1"&gt;&lt;span style=";font-family:Wingdings;color:#31849B;"&gt;&lt;span style="mso-list:Ignore"&gt;Ø&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;concurrent_bounded_queue :&lt;span style="line-height: 115%; font-family: Arial, sans-serif; font-family:&amp;quot;;font-size:12.0pt;color:black;"&gt; &lt;/span&gt;Une FIFO bloquante avec possibilité de définir une capacité.&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align:justify"&gt;&lt;u&gt;Remarque :&lt;/u&gt; Les conteneurs de type « queue » supporte les itérateurs de la STL.&lt;/p&gt;  &lt;span style="line-height: 115%; font-family: Calibri, sans-serif; font-family:&amp;quot;;font-size:11.0pt;"&gt;&lt;br /&gt;&lt;/span&gt;  &lt;p class="MsoNormal" style="text-align:justify"&gt;&lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span style="color:#31849B;"&gt;Mutex&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align:justify;text-indent:35.4pt"&gt;Malgré que cela ne soit pas conseillé, TBB fournit néanmoins plusieurs implémentations des mutex dans le cas ou une opération nécessite un accès exclusif. &lt;/p&gt;  &lt;p class="MsoNormal" style="text-align:justify;text-indent:35.4pt"&gt;Voici un tableau des différents mutex que l’on retrouve dans TBB :&lt;/p&gt;  &lt;div align="center"&gt;  &lt;table class="MsoNormalTable" border="1" cellspacing="0" cellpadding="0" style="border-collapse:collapse;border:none;mso-border-alt:solid #78C0D4 1.0pt;  mso-yfti-tbllook:1184;mso-padding-alt:0cm 5.4pt 0cm 5.4pt;mso-border-insideh:  1.0pt solid #78C0D4"&gt;  &lt;tbody&gt;&lt;tr style="mso-yfti-irow:0;mso-yfti-firstrow:yes;height:23.35pt"&gt;   &lt;td valign="top" style="border:solid #78C0D4 1.0pt;border-right:none;   background:#4BACC6;padding:0cm 5.4pt 0cm 5.4pt;height:23.35pt"&gt;   &lt;p class="MsoNormal" align="center" style="margin-bottom:0cm;margin-bottom:.0001pt;   text-align:center;line-height:normal"&gt;&lt;b&gt;&lt;span style="   mso-fareast-font-family:&amp;quot;DejaVu Sans&amp;quot;;mso-bidi-   mso-font-kerning:12.0pt;mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;color:white;"&gt;Mutex &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="mso-fareast-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;color:white;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td valign="top" style="border-top:solid #78C0D4 1.0pt;border-left:none;   border-bottom:solid #78C0D4 1.0pt;border-right:none;background:#4BACC6;   padding:0cm 5.4pt 0cm 5.4pt;height:23.35pt"&gt;   &lt;p class="MsoNormal" align="center" style="margin-bottom:0cm;margin-bottom:.0001pt;   text-align:center;line-height:normal"&gt;&lt;b&gt;&lt;span style="   mso-fareast-font-family:&amp;quot;DejaVu Sans&amp;quot;;mso-bidi-   mso-font-kerning:12.0pt;mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;color:white;"&gt;Scalable &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="mso-fareast-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;color:white;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td valign="top" style="border-top:solid #78C0D4 1.0pt;border-left:none;   border-bottom:solid #78C0D4 1.0pt;border-right:none;background:#4BACC6;   padding:0cm 5.4pt 0cm 5.4pt;height:23.35pt"&gt;   &lt;p class="MsoNormal" align="center" style="margin-bottom:0cm;margin-bottom:.0001pt;   text-align:center;line-height:normal"&gt;&lt;b&gt;&lt;span style="   mso-fareast-font-family:&amp;quot;DejaVu Sans&amp;quot;;mso-bidi-   mso-font-kerning:12.0pt;mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;color:white;"&gt;Fair &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="mso-fareast-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;color:white;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td valign="top" style="border-top:solid #78C0D4 1.0pt;border-left:none;   border-bottom:solid #78C0D4 1.0pt;border-right:none;background:#4BACC6;   padding:0cm 5.4pt 0cm 5.4pt;height:23.35pt"&gt;   &lt;p class="MsoNormal" align="center" style="margin-bottom:0cm;margin-bottom:.0001pt;   text-align:center;line-height:normal"&gt;&lt;b&gt;&lt;span style="   mso-fareast-font-family:&amp;quot;DejaVu Sans&amp;quot;;mso-bidi-   mso-font-kerning:12.0pt;mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;color:white;"&gt;Recursive &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="mso-fareast-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;color:white;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td valign="top" style="border-top:solid #78C0D4 1.0pt;border-left:none;   border-bottom:solid #78C0D4 1.0pt;border-right:none;background:#4BACC6;   padding:0cm 5.4pt 0cm 5.4pt;height:23.35pt"&gt;   &lt;p class="MsoNormal" align="center" style="margin-bottom:0cm;margin-bottom:.0001pt;   text-align:center;line-height:normal"&gt;&lt;b&gt;&lt;span style="   mso-fareast-font-family:&amp;quot;DejaVu Sans&amp;quot;;mso-bidi-   mso-font-kerning:12.0pt;mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;color:white;"&gt;Long Wait &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="mso-fareast-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;color:white;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td valign="top" style="border:solid #78C0D4 1.0pt;border-left:none;background:   #4BACC6;padding:0cm 5.4pt 0cm 5.4pt;height:23.35pt"&gt;   &lt;p class="MsoNormal" align="center" style="margin-bottom:0cm;margin-bottom:.0001pt;   text-align:center;line-height:normal"&gt;&lt;b&gt;&lt;span style="   mso-fareast-font-family:&amp;quot;DejaVu Sans&amp;quot;;mso-bidi-   mso-font-kerning:12.0pt;mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;color:white;"&gt;Size &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="mso-fareast-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;color:white;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt;  &lt;tr style="mso-yfti-irow:1;height:23.35pt"&gt;   &lt;td valign="top" style="border-top:none;border-left:solid #78C0D4 1.0pt;   border-bottom:solid #78C0D4 1.0pt;border-right:none;mso-border-top-alt:solid #78C0D4 1.0pt;   background:#D2EAF1;padding:0cm 5.4pt 0cm 5.4pt;height:23.35pt"&gt;   &lt;p class="MsoNormal" align="center" style="margin-bottom:0cm;margin-bottom:.0001pt;   text-align:center;line-height:normal"&gt;&lt;b&gt;&lt;span style="   mso-fareast-font-family:&amp;quot;DejaVu Sans&amp;quot;;mso-bidi-   mso-font-kerning:12.0pt;mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;color:black;"&gt;mutex &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="mso-fareast-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td valign="top" style="border:none;border-bottom:solid #78C0D4 1.0pt;   mso-border-top-alt:solid #78C0D4 1.0pt;background:#D2EAF1;padding:0cm 5.4pt 0cm 5.4pt;   height:23.35pt"&gt;   &lt;p class="MsoNormal" align="center" style="margin-bottom:0cm;margin-bottom:.0001pt;   text-align:center;line-height:normal"&gt;&lt;span style="   mso-fareast-font-family:&amp;quot;DejaVu Sans&amp;quot;;mso-bidi-   mso-font-kerning:12.0pt;mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;color:#FFC000;"&gt;OS dep &lt;/span&gt;&lt;span style="mso-fareast-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td valign="top" style="border:none;border-bottom:solid #78C0D4 1.0pt;   mso-border-top-alt:solid #78C0D4 1.0pt;background:#D2EAF1;padding:0cm 5.4pt 0cm 5.4pt;   height:23.35pt"&gt;   &lt;p class="MsoNormal" align="center" style="margin-bottom:0cm;margin-bottom:.0001pt;   text-align:center;line-height:normal"&gt;&lt;span style="   mso-fareast-font-family:&amp;quot;DejaVu Sans&amp;quot;;mso-bidi-   mso-font-kerning:12.0pt;mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;color:#FFC000;"&gt;OS dep &lt;/span&gt;&lt;span style="mso-fareast-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td valign="top" style="border:none;border-bottom:solid #78C0D4 1.0pt;   mso-border-top-alt:solid #78C0D4 1.0pt;background:#D2EAF1;padding:0cm 5.4pt 0cm 5.4pt;   height:23.35pt"&gt;   &lt;p class="MsoNormal" align="center" style="margin-bottom:0cm;margin-bottom:.0001pt;   text-align:center;line-height:normal"&gt;&lt;span style="   mso-fareast-font-family:&amp;quot;DejaVu Sans&amp;quot;;mso-bidi-   mso-font-kerning:12.0pt;mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;color:red;"&gt;Non &lt;/span&gt;&lt;span style="mso-fareast-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td valign="top" style="border:none;border-bottom:solid #78C0D4 1.0pt;   mso-border-top-alt:solid #78C0D4 1.0pt;background:#D2EAF1;padding:0cm 5.4pt 0cm 5.4pt;   height:23.35pt"&gt;   &lt;p class="MsoNormal" align="center" style="margin-bottom:0cm;margin-bottom:.0001pt;   text-align:center;line-height:normal"&gt;&lt;span style="   mso-fareast-font-family:&amp;quot;DejaVu Sans&amp;quot;;mso-bidi-   mso-font-kerning:12.0pt;mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;color:black;"&gt;Bloque &lt;/span&gt;&lt;span style="mso-fareast-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td valign="top" style="border-top:none;border-left:none;border-bottom:solid #78C0D4 1.0pt;   border-right:solid #78C0D4 1.0pt;mso-border-top-alt:solid #78C0D4 1.0pt;   background:#D2EAF1;padding:0cm 5.4pt 0cm 5.4pt;height:23.35pt"&gt;   &lt;p class="MsoNormal" align="center" style="margin-bottom:0cm;margin-bottom:.0001pt;   text-align:center;line-height:normal"&gt;&lt;span style="   mso-fareast-font-family:&amp;quot;DejaVu Sans&amp;quot;;mso-bidi-   mso-font-kerning:12.0pt;mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;color:black;"&gt;≥ 3 words &lt;/span&gt;&lt;span style="mso-fareast-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt;  &lt;tr style="mso-yfti-irow:2;height:23.35pt"&gt;   &lt;td valign="top" style="border-top:none;border-left:solid #78C0D4 1.0pt;   border-bottom:solid #78C0D4 1.0pt;border-right:none;mso-border-top-alt:solid #78C0D4 1.0pt;   padding:0cm 5.4pt 0cm 5.4pt;height:23.35pt"&gt;   &lt;p class="MsoNormal" align="center" style="margin-bottom:0cm;margin-bottom:.0001pt;   text-align:center;line-height:normal"&gt;&lt;b&gt;&lt;span style="   mso-fareast-font-family:&amp;quot;DejaVu Sans&amp;quot;;mso-bidi-   mso-font-kerning:12.0pt;mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;color:black;"&gt;recursive_mutex &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="mso-fareast-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td valign="top" style="border:none;border-bottom:solid #78C0D4 1.0pt;   mso-border-top-alt:solid #78C0D4 1.0pt;padding:0cm 5.4pt 0cm 5.4pt;   height:23.35pt"&gt;   &lt;p class="MsoNormal" align="center" style="margin-bottom:0cm;margin-bottom:.0001pt;   text-align:center;line-height:normal"&gt;&lt;span style="   mso-fareast-font-family:&amp;quot;DejaVu Sans&amp;quot;;mso-bidi-   mso-font-kerning:12.0pt;mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;color:#FFC000;"&gt;OS dep &lt;/span&gt;&lt;span style="mso-fareast-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td valign="top" style="border:none;border-bottom:solid #78C0D4 1.0pt;   mso-border-top-alt:solid #78C0D4 1.0pt;padding:0cm 5.4pt 0cm 5.4pt;   height:23.35pt"&gt;   &lt;p class="MsoNormal" align="center" style="margin-bottom:0cm;margin-bottom:.0001pt;   text-align:center;line-height:normal"&gt;&lt;span style="   mso-fareast-font-family:&amp;quot;DejaVu Sans&amp;quot;;mso-bidi-   mso-font-kerning:12.0pt;mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;color:#FFC000;"&gt;OS dep &lt;/span&gt;&lt;span style="mso-fareast-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td valign="top" style="border:none;border-bottom:solid #78C0D4 1.0pt;   mso-border-top-alt:solid #78C0D4 1.0pt;padding:0cm 5.4pt 0cm 5.4pt;   height:23.35pt"&gt;   &lt;p class="MsoNormal" align="center" style="margin-bottom:0cm;margin-bottom:.0001pt;   text-align:center;line-height:normal"&gt;&lt;span style="   mso-fareast-font-family:&amp;quot;DejaVu Sans&amp;quot;;mso-bidi-   mso-font-kerning:12.0pt;mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;color:#00664D;"&gt;Oui &lt;/span&gt;&lt;span style="mso-fareast-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td valign="top" style="border:none;border-bottom:solid #78C0D4 1.0pt;   mso-border-top-alt:solid #78C0D4 1.0pt;padding:0cm 5.4pt 0cm 5.4pt;   height:23.35pt"&gt;   &lt;p class="MsoNormal" align="center" style="margin-bottom:0cm;margin-bottom:.0001pt;   text-align:center;line-height:normal"&gt;&lt;span style="   mso-fareast-font-family:&amp;quot;DejaVu Sans&amp;quot;;mso-bidi-   mso-font-kerning:12.0pt;mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;color:black;"&gt;Bloque &lt;/span&gt;&lt;span style="mso-fareast-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td valign="top" style="border-top:none;border-left:none;border-bottom:solid #78C0D4 1.0pt;   border-right:solid #78C0D4 1.0pt;mso-border-top-alt:solid #78C0D4 1.0pt;   padding:0cm 5.4pt 0cm 5.4pt;height:23.35pt"&gt;   &lt;p class="MsoNormal" align="center" style="margin-bottom:0cm;margin-bottom:.0001pt;   text-align:center;line-height:normal"&gt;&lt;span style="   mso-fareast-font-family:&amp;quot;DejaVu Sans&amp;quot;;mso-bidi-   mso-font-kerning:12.0pt;mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;color:black;"&gt;≥ 3 words &lt;/span&gt;&lt;span style="mso-fareast-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt;  &lt;tr style="mso-yfti-irow:3;height:23.35pt"&gt;   &lt;td valign="top" style="border-top:none;border-left:solid #78C0D4 1.0pt;   border-bottom:solid #78C0D4 1.0pt;border-right:none;mso-border-top-alt:solid #78C0D4 1.0pt;   background:#D2EAF1;padding:0cm 5.4pt 0cm 5.4pt;height:23.35pt"&gt;   &lt;p class="MsoNormal" align="center" style="margin-bottom:0cm;margin-bottom:.0001pt;   text-align:center;line-height:normal"&gt;&lt;b&gt;&lt;span style="   mso-fareast-font-family:&amp;quot;DejaVu Sans&amp;quot;;mso-bidi-   mso-font-kerning:12.0pt;mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;color:black;"&gt;spin_mutex &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="mso-fareast-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td valign="top" style="border:none;border-bottom:solid #78C0D4 1.0pt;   mso-border-top-alt:solid #78C0D4 1.0pt;background:#D2EAF1;padding:0cm 5.4pt 0cm 5.4pt;   height:23.35pt"&gt;   &lt;p class="MsoNormal" align="center" style="margin-bottom:0cm;margin-bottom:.0001pt;   text-align:center;line-height:normal"&gt;&lt;span style="   mso-fareast-font-family:&amp;quot;DejaVu Sans&amp;quot;;mso-bidi-   mso-font-kerning:12.0pt;mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;color:red;"&gt;Non &lt;/span&gt;&lt;span style="mso-fareast-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td valign="top" style="border:none;border-bottom:solid #78C0D4 1.0pt;   mso-border-top-alt:solid #78C0D4 1.0pt;background:#D2EAF1;padding:0cm 5.4pt 0cm 5.4pt;   height:23.35pt"&gt;   &lt;p class="MsoNormal" align="center" style="margin-bottom:0cm;margin-bottom:.0001pt;   text-align:center;line-height:normal"&gt;&lt;span style="   mso-fareast-font-family:&amp;quot;DejaVu Sans&amp;quot;;mso-bidi-   mso-font-kerning:12.0pt;mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;color:red;"&gt;Non &lt;/span&gt;&lt;span style="mso-fareast-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td valign="top" style="border:none;border-bottom:solid #78C0D4 1.0pt;   mso-border-top-alt:solid #78C0D4 1.0pt;background:#D2EAF1;padding:0cm 5.4pt 0cm 5.4pt;   height:23.35pt"&gt;   &lt;p class="MsoNormal" align="center" style="margin-bottom:0cm;margin-bottom:.0001pt;   text-align:center;line-height:normal"&gt;&lt;span style="   mso-fareast-font-family:&amp;quot;DejaVu Sans&amp;quot;;mso-bidi-   mso-font-kerning:12.0pt;mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;color:red;"&gt;Non &lt;/span&gt;&lt;span style="mso-fareast-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td valign="top" style="border:none;border-bottom:solid #78C0D4 1.0pt;   mso-border-top-alt:solid #78C0D4 1.0pt;background:#D2EAF1;padding:0cm 5.4pt 0cm 5.4pt;   height:23.35pt"&gt;   &lt;p class="MsoNormal" align="center" style="margin-bottom:0cm;margin-bottom:.0001pt;   text-align:center;line-height:normal"&gt;&lt;span style="   mso-fareast-font-family:&amp;quot;DejaVu Sans&amp;quot;;mso-bidi-   mso-font-kerning:12.0pt;mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;color:black;"&gt;«    yields » &lt;/span&gt;&lt;span style="mso-fareast-font-family:   &amp;quot;Times New Roman&amp;quot;;mso-bidi-mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td valign="top" style="border-top:none;border-left:none;border-bottom:solid #78C0D4 1.0pt;   border-right:solid #78C0D4 1.0pt;mso-border-top-alt:solid #78C0D4 1.0pt;   background:#D2EAF1;padding:0cm 5.4pt 0cm 5.4pt;height:23.35pt"&gt;   &lt;p class="MsoNormal" align="center" style="margin-bottom:0cm;margin-bottom:.0001pt;   text-align:center;line-height:normal"&gt;&lt;span style="   mso-fareast-font-family:&amp;quot;DejaVu Sans&amp;quot;;mso-bidi-   mso-font-kerning:12.0pt;mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;color:black;"&gt;1 byte &lt;/span&gt;&lt;span style="mso-fareast-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt;  &lt;tr style="mso-yfti-irow:4;height:23.35pt"&gt;   &lt;td valign="top" style="border-top:none;border-left:solid #78C0D4 1.0pt;   border-bottom:solid #78C0D4 1.0pt;border-right:none;mso-border-top-alt:solid #78C0D4 1.0pt;   padding:0cm 5.4pt 0cm 5.4pt;height:23.35pt"&gt;   &lt;p class="MsoNormal" align="center" style="margin-bottom:0cm;margin-bottom:.0001pt;   text-align:center;line-height:normal"&gt;&lt;b&gt;&lt;span style="   mso-fareast-font-family:&amp;quot;DejaVu Sans&amp;quot;;mso-bidi-   mso-font-kerning:12.0pt;mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;color:black;"&gt;queuing_mutex &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="mso-fareast-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td valign="top" style="border:none;border-bottom:solid #78C0D4 1.0pt;   mso-border-top-alt:solid #78C0D4 1.0pt;padding:0cm 5.4pt 0cm 5.4pt;   height:23.35pt"&gt;   &lt;p class="MsoNormal" align="center" style="margin-bottom:0cm;margin-bottom:.0001pt;   text-align:center;line-height:normal"&gt;&lt;span style="   mso-fareast-font-family:&amp;quot;DejaVu Sans&amp;quot;;mso-bidi-   mso-font-kerning:12.0pt;mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;color:#00664D;"&gt;Oui &lt;/span&gt;&lt;span style="mso-fareast-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td valign="top" style="border:none;border-bottom:solid #78C0D4 1.0pt;   mso-border-top-alt:solid #78C0D4 1.0pt;padding:0cm 5.4pt 0cm 5.4pt;   height:23.35pt"&gt;   &lt;p class="MsoNormal" align="center" style="margin-bottom:0cm;margin-bottom:.0001pt;   text-align:center;line-height:normal"&gt;&lt;span style="   mso-fareast-font-family:&amp;quot;DejaVu Sans&amp;quot;;mso-bidi-   mso-font-kerning:12.0pt;mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;color:#00664D;"&gt;Oui &lt;/span&gt;&lt;span style="mso-fareast-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td valign="top" style="border:none;border-bottom:solid #78C0D4 1.0pt;   mso-border-top-alt:solid #78C0D4 1.0pt;padding:0cm 5.4pt 0cm 5.4pt;   height:23.35pt"&gt;   &lt;p class="MsoNormal" align="center" style="margin-bottom:0cm;margin-bottom:.0001pt;   text-align:center;line-height:normal"&gt;&lt;span style="   mso-fareast-font-family:&amp;quot;DejaVu Sans&amp;quot;;mso-bidi-   mso-font-kerning:12.0pt;mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;color:red;"&gt;Non &lt;/span&gt;&lt;span style="mso-fareast-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td valign="top" style="border:none;border-bottom:solid #78C0D4 1.0pt;   mso-border-top-alt:solid #78C0D4 1.0pt;padding:0cm 5.4pt 0cm 5.4pt;   height:23.35pt"&gt;   &lt;p class="MsoNormal" align="center" style="margin-bottom:0cm;margin-bottom:.0001pt;   text-align:center;line-height:normal"&gt;&lt;span style="   mso-fareast-font-family:&amp;quot;DejaVu Sans&amp;quot;;mso-bidi-   mso-font-kerning:12.0pt;mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;color:black;"&gt;«    yields »&lt;/span&gt;&lt;span style="mso-fareast-font-family:   &amp;quot;Times New Roman&amp;quot;;mso-bidi-mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td valign="top" style="border-top:none;border-left:none;border-bottom:solid #78C0D4 1.0pt;   border-right:solid #78C0D4 1.0pt;mso-border-top-alt:solid #78C0D4 1.0pt;   padding:0cm 5.4pt 0cm 5.4pt;height:23.35pt"&gt;   &lt;p class="MsoNormal" align="center" style="margin-bottom:0cm;margin-bottom:.0001pt;   text-align:center;line-height:normal"&gt;&lt;span style="   mso-fareast-font-family:&amp;quot;DejaVu Sans&amp;quot;;mso-bidi-   mso-font-kerning:12.0pt;mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;color:black;"&gt;1 word &lt;/span&gt;&lt;span style="mso-fareast-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt;  &lt;tr style="mso-yfti-irow:5;height:23.35pt"&gt;   &lt;td valign="top" style="border-top:none;border-left:solid #78C0D4 1.0pt;   border-bottom:solid #78C0D4 1.0pt;border-right:none;mso-border-top-alt:solid #78C0D4 1.0pt;   background:#D2EAF1;padding:0cm 5.4pt 0cm 5.4pt;height:23.35pt"&gt;   &lt;p class="MsoNormal" align="center" style="margin-bottom:0cm;margin-bottom:.0001pt;   text-align:center;line-height:normal"&gt;&lt;b&gt;&lt;span style="   mso-fareast-font-family:&amp;quot;DejaVu Sans&amp;quot;;mso-bidi-   mso-font-kerning:12.0pt;mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;color:black;"&gt;spin_rw_mutex &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="mso-fareast-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td valign="top" style="border:none;border-bottom:solid #78C0D4 1.0pt;   mso-border-top-alt:solid #78C0D4 1.0pt;background:#D2EAF1;padding:0cm 5.4pt 0cm 5.4pt;   height:23.35pt"&gt;   &lt;p class="MsoNormal" align="center" style="margin-bottom:0cm;margin-bottom:.0001pt;   text-align:center;line-height:normal"&gt;&lt;span style="   mso-fareast-font-family:&amp;quot;DejaVu Sans&amp;quot;;mso-bidi-   mso-font-kerning:12.0pt;mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;color:red;"&gt;Non &lt;/span&gt;&lt;span style="mso-fareast-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td valign="top" style="border:none;border-bottom:solid #78C0D4 1.0pt;   mso-border-top-alt:solid #78C0D4 1.0pt;background:#D2EAF1;padding:0cm 5.4pt 0cm 5.4pt;   height:23.35pt"&gt;   &lt;p class="MsoNormal" align="center" style="margin-bottom:0cm;margin-bottom:.0001pt;   text-align:center;line-height:normal"&gt;&lt;span style="   mso-fareast-font-family:&amp;quot;DejaVu Sans&amp;quot;;mso-bidi-   mso-font-kerning:12.0pt;mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;color:red;"&gt;Non &lt;/span&gt;&lt;span style="mso-fareast-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td valign="top" style="border:none;border-bottom:solid #78C0D4 1.0pt;   mso-border-top-alt:solid #78C0D4 1.0pt;background:#D2EAF1;padding:0cm 5.4pt 0cm 5.4pt;   height:23.35pt"&gt;   &lt;p class="MsoNormal" align="center" style="margin-bottom:0cm;margin-bottom:.0001pt;   text-align:center;line-height:normal"&gt;&lt;span style="   mso-fareast-font-family:&amp;quot;DejaVu Sans&amp;quot;;mso-bidi-   mso-font-kerning:12.0pt;mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;color:red;"&gt;Non &lt;/span&gt;&lt;span style="mso-fareast-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td valign="top" style="border:none;border-bottom:solid #78C0D4 1.0pt;   mso-border-top-alt:solid #78C0D4 1.0pt;background:#D2EAF1;padding:0cm 5.4pt 0cm 5.4pt;   height:23.35pt"&gt;   &lt;p class="MsoNormal" align="center" style="margin-bottom:0cm;margin-bottom:.0001pt;   text-align:center;line-height:normal"&gt;&lt;span style="   mso-fareast-font-family:&amp;quot;DejaVu Sans&amp;quot;;mso-bidi-   mso-font-kerning:12.0pt;mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;color:black;"&gt;«    yields »&lt;/span&gt;&lt;span style="mso-fareast-font-family:   &amp;quot;Times New Roman&amp;quot;;mso-bidi-mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td valign="top" style="border-top:none;border-left:none;border-bottom:solid #78C0D4 1.0pt;   border-right:solid #78C0D4 1.0pt;mso-border-top-alt:solid #78C0D4 1.0pt;   background:#D2EAF1;padding:0cm 5.4pt 0cm 5.4pt;height:23.35pt"&gt;   &lt;p class="MsoNormal" align="center" style="margin-bottom:0cm;margin-bottom:.0001pt;   text-align:center;line-height:normal"&gt;&lt;span style="   mso-fareast-font-family:&amp;quot;DejaVu Sans&amp;quot;;mso-bidi-   mso-font-kerning:12.0pt;mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;color:black;"&gt;1 word &lt;/span&gt;&lt;span style="mso-fareast-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt;  &lt;tr style="mso-yfti-irow:6;height:23.35pt"&gt;   &lt;td valign="top" style="border-top:none;border-left:solid #78C0D4 1.0pt;   border-bottom:solid #78C0D4 1.0pt;border-right:none;mso-border-top-alt:solid #78C0D4 1.0pt;   padding:0cm 5.4pt 0cm 5.4pt;height:23.35pt"&gt;   &lt;p class="MsoNormal" align="center" style="margin-bottom:0cm;margin-bottom:.0001pt;   text-align:center;line-height:normal"&gt;&lt;b&gt;&lt;span style="   mso-fareast-font-family:&amp;quot;DejaVu Sans&amp;quot;;mso-bidi-   mso-font-kerning:12.0pt;mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;color:black;"&gt;queuing_rw_mutex   &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="mso-fareast-font-family:&amp;quot;Times New Roman&amp;quot;;   mso-bidi-mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td valign="top" style="border:none;border-bottom:solid #78C0D4 1.0pt;   mso-border-top-alt:solid #78C0D4 1.0pt;padding:0cm 5.4pt 0cm 5.4pt;   height:23.35pt"&gt;   &lt;p class="MsoNormal" align="center" style="margin-bottom:0cm;margin-bottom:.0001pt;   text-align:center;line-height:normal"&gt;&lt;span style="   mso-fareast-font-family:&amp;quot;DejaVu Sans&amp;quot;;mso-bidi-   mso-font-kerning:12.0pt;mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;color:#00664D;"&gt;Oui &lt;/span&gt;&lt;span style="mso-fareast-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td valign="top" style="border:none;border-bottom:solid #78C0D4 1.0pt;   mso-border-top-alt:solid #78C0D4 1.0pt;padding:0cm 5.4pt 0cm 5.4pt;   height:23.35pt"&gt;   &lt;p class="MsoNormal" align="center" style="margin-bottom:0cm;margin-bottom:.0001pt;   text-align:center;line-height:normal"&gt;&lt;span style="   mso-fareast-font-family:&amp;quot;DejaVu Sans&amp;quot;;mso-bidi-   mso-font-kerning:12.0pt;mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;color:#00664D;"&gt;Oui &lt;/span&gt;&lt;span style="mso-fareast-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td valign="top" style="border:none;border-bottom:solid #78C0D4 1.0pt;   mso-border-top-alt:solid #78C0D4 1.0pt;padding:0cm 5.4pt 0cm 5.4pt;   height:23.35pt"&gt;   &lt;p class="MsoNormal" align="center" style="margin-bottom:0cm;margin-bottom:.0001pt;   text-align:center;line-height:normal"&gt;&lt;span style="   mso-fareast-font-family:&amp;quot;DejaVu Sans&amp;quot;;mso-bidi-   mso-font-kerning:12.0pt;mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;color:red;"&gt;Non &lt;/span&gt;&lt;span style="mso-fareast-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td valign="top" style="border:none;border-bottom:solid #78C0D4 1.0pt;   mso-border-top-alt:solid #78C0D4 1.0pt;padding:0cm 5.4pt 0cm 5.4pt;   height:23.35pt"&gt;   &lt;p class="MsoNormal" align="center" style="margin-bottom:0cm;margin-bottom:.0001pt;   text-align:center;line-height:normal"&gt;&lt;span style="   mso-fareast-font-family:&amp;quot;DejaVu Sans&amp;quot;;mso-bidi-   mso-font-kerning:12.0pt;mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;color:black;"&gt;«    yields »&lt;/span&gt;&lt;span style="mso-fareast-font-family:   &amp;quot;Times New Roman&amp;quot;;mso-bidi-mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td valign="top" style="border-top:none;border-left:none;border-bottom:solid #78C0D4 1.0pt;   border-right:solid #78C0D4 1.0pt;mso-border-top-alt:solid #78C0D4 1.0pt;   padding:0cm 5.4pt 0cm 5.4pt;height:23.35pt"&gt;   &lt;p class="MsoNormal" align="center" style="margin-bottom:0cm;margin-bottom:.0001pt;   text-align:center;line-height:normal"&gt;&lt;span style="   mso-fareast-font-family:&amp;quot;DejaVu Sans&amp;quot;;mso-bidi-   mso-font-kerning:12.0pt;mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;color:black;"&gt;1 word &lt;/span&gt;&lt;span style="mso-fareast-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt;  &lt;tr style="mso-yfti-irow:7;height:23.35pt"&gt;   &lt;td valign="top" style="border-top:none;border-left:solid #78C0D4 1.0pt;   border-bottom:solid #78C0D4 1.0pt;border-right:none;mso-border-top-alt:solid #78C0D4 1.0pt;   background:#D2EAF1;padding:0cm 5.4pt 0cm 5.4pt;height:23.35pt"&gt;   &lt;p class="MsoNormal" align="center" style="margin-bottom:0cm;margin-bottom:.0001pt;   text-align:center;line-height:normal"&gt;&lt;b&gt;&lt;span style="   mso-fareast-font-family:&amp;quot;DejaVu Sans&amp;quot;;mso-bidi-   mso-font-kerning:12.0pt;mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;color:black;"&gt;null_mutex &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="mso-fareast-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td valign="top" style="border:none;border-bottom:solid #78C0D4 1.0pt;   mso-border-top-alt:solid #78C0D4 1.0pt;background:#D2EAF1;padding:0cm 5.4pt 0cm 5.4pt;   height:23.35pt"&gt;   &lt;p class="MsoNormal" align="center" style="margin-bottom:0cm;margin-bottom:.0001pt;   text-align:center;line-height:normal"&gt;&lt;span style="   mso-fareast-font-family:&amp;quot;DejaVu Sans&amp;quot;;mso-bidi-   mso-font-kerning:12.0pt;mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;color:red;"&gt;Non &lt;/span&gt;&lt;span style="mso-fareast-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td valign="top" style="border:none;border-bottom:solid #78C0D4 1.0pt;   mso-border-top-alt:solid #78C0D4 1.0pt;background:#D2EAF1;padding:0cm 5.4pt 0cm 5.4pt;   height:23.35pt"&gt;   &lt;p class="MsoNormal" align="center" style="margin-bottom:0cm;margin-bottom:.0001pt;   text-align:center;line-height:normal"&gt;&lt;span style="   mso-fareast-font-family:&amp;quot;DejaVu Sans&amp;quot;;mso-bidi-   mso-font-kerning:12.0pt;mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;color:#00664D;"&gt;Oui &lt;/span&gt;&lt;span style="mso-fareast-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td valign="top" style="border:none;border-bottom:solid #78C0D4 1.0pt;   mso-border-top-alt:solid #78C0D4 1.0pt;background:#D2EAF1;padding:0cm 5.4pt 0cm 5.4pt;   height:23.35pt"&gt;   &lt;p class="MsoNormal" align="center" style="margin-bottom:0cm;margin-bottom:.0001pt;   text-align:center;line-height:normal"&gt;&lt;span style="   mso-fareast-font-family:&amp;quot;DejaVu Sans&amp;quot;;mso-bidi-   mso-font-kerning:12.0pt;mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;color:#00664D;"&gt;Oui &lt;/span&gt;&lt;span style="mso-fareast-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td valign="top" style="border:none;border-bottom:solid #78C0D4 1.0pt;   mso-border-top-alt:solid #78C0D4 1.0pt;background:#D2EAF1;padding:0cm 5.4pt 0cm 5.4pt;   height:23.35pt"&gt;   &lt;p class="MsoNormal" align="center" style="margin-bottom:0cm;margin-bottom:.0001pt;   text-align:center;line-height:normal"&gt;&lt;span style="   mso-fareast-font-family:&amp;quot;DejaVu Sans&amp;quot;;mso-bidi-   mso-font-kerning:12.0pt;mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;color:black;"&gt;Jamais &lt;/span&gt;&lt;span style="mso-fareast-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td valign="top" style="border-top:none;border-left:none;border-bottom:solid #78C0D4 1.0pt;   border-right:solid #78C0D4 1.0pt;mso-border-top-alt:solid #78C0D4 1.0pt;   background:#D2EAF1;padding:0cm 5.4pt 0cm 5.4pt;height:23.35pt"&gt;   &lt;p class="MsoNormal" align="center" style="margin-bottom:0cm;margin-bottom:.0001pt;   text-align:center;line-height:normal"&gt;&lt;span style="   mso-fareast-font-family:&amp;quot;DejaVu Sans&amp;quot;;mso-bidi-   mso-font-kerning:12.0pt;mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;color:black;"&gt;Zero &lt;/span&gt;&lt;span style="mso-fareast-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt;  &lt;tr style="mso-yfti-irow:8;mso-yfti-lastrow:yes;height:23.35pt"&gt;   &lt;td valign="top" style="border-top:none;border-left:solid #78C0D4 1.0pt;   border-bottom:solid #78C0D4 1.0pt;border-right:none;mso-border-top-alt:solid #78C0D4 1.0pt;   padding:0cm 5.4pt 0cm 5.4pt;height:23.35pt"&gt;   &lt;p class="MsoNormal" align="center" style="margin-bottom:0cm;margin-bottom:.0001pt;   text-align:center;line-height:normal"&gt;&lt;b&gt;&lt;span style="   mso-fareast-font-family:&amp;quot;DejaVu Sans&amp;quot;;mso-bidi-   mso-font-kerning:12.0pt;mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;color:black;"&gt;null_rw_mutex &lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style="mso-fareast-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td valign="top" style="border:none;border-bottom:solid #78C0D4 1.0pt;   mso-border-top-alt:solid #78C0D4 1.0pt;padding:0cm 5.4pt 0cm 5.4pt;   height:23.35pt"&gt;   &lt;p class="MsoNormal" align="center" style="margin-bottom:0cm;margin-bottom:.0001pt;   text-align:center;line-height:normal"&gt;&lt;span style="   mso-fareast-font-family:&amp;quot;DejaVu Sans&amp;quot;;mso-bidi-   mso-font-kerning:12.0pt;mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;color:red;"&gt;Non &lt;/span&gt;&lt;span style="mso-fareast-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td valign="top" style="border:none;border-bottom:solid #78C0D4 1.0pt;   mso-border-top-alt:solid #78C0D4 1.0pt;padding:0cm 5.4pt 0cm 5.4pt;   height:23.35pt"&gt;   &lt;p class="MsoNormal" align="center" style="margin-bottom:0cm;margin-bottom:.0001pt;   text-align:center;line-height:normal"&gt;&lt;span style="   mso-fareast-font-family:&amp;quot;DejaVu Sans&amp;quot;;mso-bidi-   mso-font-kerning:12.0pt;mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;color:#00664D;"&gt;Oui &lt;/span&gt;&lt;span style="mso-fareast-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td valign="top" style="border:none;border-bottom:solid #78C0D4 1.0pt;   mso-border-top-alt:solid #78C0D4 1.0pt;padding:0cm 5.4pt 0cm 5.4pt;   height:23.35pt"&gt;   &lt;p class="MsoNormal" align="center" style="margin-bottom:0cm;margin-bottom:.0001pt;   text-align:center;line-height:normal"&gt;&lt;span style="   mso-fareast-font-family:&amp;quot;DejaVu Sans&amp;quot;;mso-bidi-   mso-font-kerning:12.0pt;mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;color:#00664D;"&gt;Oui &lt;/span&gt;&lt;span style="mso-fareast-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td valign="top" style="border:none;border-bottom:solid #78C0D4 1.0pt;   mso-border-top-alt:solid #78C0D4 1.0pt;padding:0cm 5.4pt 0cm 5.4pt;   height:23.35pt"&gt;   &lt;p class="MsoNormal" align="center" style="margin-bottom:0cm;margin-bottom:.0001pt;   text-align:center;line-height:normal"&gt;&lt;span style="   mso-fareast-font-family:&amp;quot;DejaVu Sans&amp;quot;;mso-bidi-   mso-font-kerning:12.0pt;mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;color:black;"&gt;Jamais &lt;/span&gt;&lt;span style="mso-fareast-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;   &lt;td valign="top" style="border-top:none;border-left:none;border-bottom:solid #78C0D4 1.0pt;   border-right:solid #78C0D4 1.0pt;mso-border-top-alt:solid #78C0D4 1.0pt;   padding:0cm 5.4pt 0cm 5.4pt;height:23.35pt"&gt;   &lt;p class="MsoNormal" align="center" style="margin-bottom:0cm;margin-bottom:.0001pt;   text-align:center;line-height:normal"&gt;&lt;span style="   mso-fareast-font-family:&amp;quot;DejaVu Sans&amp;quot;;mso-bidi-   mso-font-kerning:12.0pt;mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;color:black;"&gt;Zero &lt;/span&gt;&lt;span style="mso-fareast-font-family:&amp;quot;Times New Roman&amp;quot;;mso-bidi-mso-fareast-language:FRfont-family:Calibri;font-size:9.0pt;"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;/td&gt;  &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt;  &lt;/div&gt;  &lt;p class="MsoNormal" style="text-align:justify"&gt;&lt;br /&gt;&lt;b style="mso-bidi-font-weight:normal"&gt;&lt;span style="color:#31849B;"&gt;Opérations atomiques&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align:justify;text-indent:35.4pt"&gt;Parallèlement aux mutex, TBB fournit une implémentation des types atomiques qui&lt;span style="mso-spacerun:yes"&gt;  &lt;/span&gt;a l’avantage d’être beaucoup plus rapide que les mutex. De plus il n’y a pas de risque de « Deadlock ». D’une manière générale les opérations atomiques sont préférables aux mutex. &lt;/p&gt;  &lt;p class="MsoNormal" style="text-align:justify;text-indent:35.4pt"&gt;Syntaxe : atomic&amp;lt;T&amp;gt;&lt;t&gt;&lt;/t&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align:justify"&gt;Remarque : T doit être un type de base : int, float, long, enum depuis la version 2.2.&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align:justify"&gt;Exemples :&lt;/p&gt;  &lt;table class="MsoNormalTable" border="1" cellspacing="0" cellpadding="0" style="border-collapse:collapse;border:none;mso-border-alt:solid #78C0D4 1.0pt;  mso-yfti-tbllook:1184;mso-padding-alt:0cm 5.4pt 0cm 5.4pt;mso-border-insideh:  1.0pt solid #78C0D4;mso-border-insidev:1.0pt solid #78C0D4"&gt;  &lt;tbody&gt;&lt;tr style="mso-yfti-irow:0;mso-yfti-firstrow:yes;mso-yfti-lastrow:yes"&gt;   &lt;td width="614" valign="top" style="width:460.6pt;border:solid #78C0D4 1.0pt;   background:#D2EAF1;padding:0cm 5.4pt 0cm 5.4pt"&gt;   &lt;p class="MsoNormal" style="text-align:justify"&gt;&lt;span style="   line-height:115%;Courier New&amp;quot;;mso-bidi-font-weight:boldfont-family:&amp;quot;;font-size:8.0pt;"&gt;= x &lt;span class="Apple-style-span"  style="color:#009900;"&gt;//   lit la valeur de x.&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal" style="text-align:justify"&gt;&lt;span style="   line-height:115%;Courier New&amp;quot;;mso-bidi-font-weight:boldfont-family:&amp;quot;;font-size:8.0pt;"&gt;x = &lt;span class="Apple-style-span"  style="color:#009900;"&gt;//   écrit la valeur de x et la retourne.&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal" style="text-align:justify"&gt;&lt;span style="   line-height:115%;Courier New&amp;quot;;mso-bidi-font-weight:boldfont-family:&amp;quot;;font-size:8.0pt;"&gt;x.fetch_and_store(y)   &lt;span class="Apple-style-span"  style="color:#009900;"&gt;// y = x et renvoi l’ancienne valeur de x.&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal" style="text-align:justify"&gt;&lt;span style="   line-height:115%;Courier New&amp;quot;;mso-bidi-font-weight:boldfont-family:&amp;quot;;font-size:8.0pt;"&gt;x.fetch_and_add(y)   &lt;span class="Apple-style-span"  style="color:#009900;"&gt;//&lt;/span&gt;&lt;span&gt;&lt;span class="Apple-style-span"  style="color:#009900;"&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#009900;"&gt;x += y et renvoi l’ancienne   valeur de x.&lt;/span&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;   &lt;p class="MsoNormal" style="text-align:justify"&gt;&lt;span style="   line-height:115%;Courier New&amp;quot;;mso-bidi-font-weight:boldfont-family:&amp;quot;;font-size:8.0pt;"&gt;x.compare_and_swap(y,z)   &lt;span class="Apple-style-span"  style="color:#009900;"&gt;// si x == z, alors x = y. sinon il renvoi l’ancienne valeur de x.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;  &lt;p class="MsoNormal" style="text-align:justify"&gt;&lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span style="color:#31849B;"&gt;Liens utiles :&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left:54.0pt;text-align:justify;text-indent: -18.0pt;mso-list:l1 level1 lfo2"&gt;&lt;span style=";font-family:Wingdings;color:#31849B;"&gt;&lt;span style="mso-list:Ignore"&gt;Ø&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://www.threadingbuildingblocks.org/"&gt;http://www.threadingbuildingblocks.org&lt;/a&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left:54.0pt;text-align:justify;text-indent: -18.0pt;mso-list:l1 level1 lfo2"&gt;&lt;span style=";font-family:Wingdings;color:#31849B;"&gt;&lt;span style="mso-list:Ignore"&gt;Ø&lt;span style="font:7.0pt &amp;quot;Times New Roman&amp;quot;"&gt;  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color:#31849B;"&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;a href="http://koalab.epitech.net/"&gt;http://koalab.epitech.net/&lt;/a&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="margin-left:54.0pt;text-align:justify;text-indent: -18.0pt;mso-list:l1 level1 lfo2"&gt;&lt;span style=";font-family:Wingdings;color:#31849B;"&gt;&lt;span style="mso-list:Ignore"&gt;Ø&lt;/span&gt;&lt;/span&gt;&lt;a href="http://software.intel.com/en-us/blogs/2008/12/16/compare-windows-threads-openmp-intel-threading-building-blocks-for-parallel-programming"&gt;http://software.intel.com/en-us/blogs/2008/12/16/compare-windows-threads-openmp-intel-threading-building-blocks-for-parallel-programming&lt;/a&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style="text-align:justify"&gt;&lt;b style="mso-bidi-font-weight: normal"&gt;&lt;span style="color:#31849B;"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p class="MsoNormal" style="text-align:justify;text-indent:35.4pt"&gt; &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6238714725528798977-3765668223254168233?l=johannes-fetz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johannes-fetz.blogspot.com/feeds/3765668223254168233/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://johannes-fetz.blogspot.com/2010/02/intel-threading-building-blocks.html#comment-form' title='2 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6238714725528798977/posts/default/3765668223254168233'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6238714725528798977/posts/default/3765668223254168233'/><link rel='alternate' type='text/html' href='http://johannes-fetz.blogspot.com/2010/02/intel-threading-building-blocks.html' title='Intel Threading Building Blocks'/><author><name>Johannes Fetz</name><uri>http://www.blogger.com/profile/06529824680182774898</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://1.bp.blogspot.com/_hm-8HpFJuDs/TG-yB2CwfoI/AAAAAAAAAH0/1zpAykiGiVA/S220/fetz_j.PNG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_hm-8HpFJuDs/S3SOw__pIEI/AAAAAAAAAFk/-Zss6nVm7Ms/s72-c/intel.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6238714725528798977.post-5398126547707937002</id><published>2010-02-11T14:18:00.000-08:00</published><updated>2010-02-11T15:01:29.262-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Crystal Reports'/><title type='text'>Résoudre les problèmes de lenteur du Crystal Report Viewer</title><content type='html'>&lt;div&gt;&lt;span class="Apple-style-span"   style="font-family:monospace;font-size:100%;"&gt;&lt;span class="Apple-style-span"  style=" white-space: pre;font-size:13px;"&gt;&lt;span class="Apple-style-span"  style="font-family:Verdana, Arial, sans-serif;"&gt;&lt;span class="Apple-style-span" style="line-height: 22px; -webkit-border-horizontal-spacing: 1px; -webkit-border-vertical-spacing: 1px;"&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="white-space: normal;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;La première fois que l'on utilise le "CrystalReportViewer",&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="white-space: normal; "&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;la fenêtre peut mettre plus d'une minute à se lancer.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="white-space: normal; "&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;Par conséquent j'ai cherché un patch pour résoudre ce problème.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="white-space: normal; "&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;Le patch ci-dessous est particulièrement moche, mais il a le mérite de fonctionner.&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="white-space: normal;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;____________________________________________________________________&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="white-space: normal;"&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;br /&gt;&lt;span class="Apple-style-span"  style="color:#00CCCC;"&gt;ReportDocument&lt;/span&gt; doc = &lt;span class="Apple-style-span"  style="color:#3333FF;"&gt;new&lt;/span&gt; &lt;span class="Apple-style-span"  style="color:#00CCCC;"&gt;ReportDocument&lt;/span&gt;();&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;doc.Load(&lt;span class="Apple-style-span"  style="color:#CC0000;"&gt;"report.rpt"&lt;/span&gt;);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="color:#3366FF;"&gt;#region Crystal Report Viewer Patch&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="font-family:'courier new';color:#009900;"&gt;&lt;span class="Apple-style-span"  style="color:#000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;doc.ExportToStream(CrystalDecisions.Shared.&lt;span class="Apple-style-span"  style="color:#00CCCC;"&gt;ExportFormatType&lt;/span&gt;.Text).Close();&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span"  style="color:#3366FF;"&gt;#endregion&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;CrystalReportViewer1.ReportSource = doc;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6238714725528798977-5398126547707937002?l=johannes-fetz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johannes-fetz.blogspot.com/feeds/5398126547707937002/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://johannes-fetz.blogspot.com/2010/02/resoudre-les-problemes-de-lenteur-du.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6238714725528798977/posts/default/5398126547707937002'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6238714725528798977/posts/default/5398126547707937002'/><link rel='alternate' type='text/html' href='http://johannes-fetz.blogspot.com/2010/02/resoudre-les-problemes-de-lenteur-du.html' title='Résoudre les problèmes de lenteur du Crystal Report Viewer'/><author><name>Johannes Fetz</name><uri>http://www.blogger.com/profile/06529824680182774898</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://1.bp.blogspot.com/_hm-8HpFJuDs/TG-yB2CwfoI/AAAAAAAAAH0/1zpAykiGiVA/S220/fetz_j.PNG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6238714725528798977.post-1269207409835371361</id><published>2009-10-27T11:52:00.000-07:00</published><updated>2009-10-27T12:31:37.898-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQL'/><title type='text'>SELECT non sensible aux accents avec Microsoft SQL Server (Transact-SQL)</title><content type='html'>&lt;p style="font-family: courier new;font-family:courier new;" &gt;&lt;span style="font-size:100%;"&gt;Bonsoir,&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="font-family: courier new;font-family:courier new;" &gt;&lt;span style="font-size:100%;"&gt;  Vous avez probablement déjà voulu faire une requête qui recherche&lt;br /&gt;des éléments dans une table avec une clause de type &lt;a href="http://msdn.microsoft.com/fr-fr/library/ms180175.aspx"&gt;&lt;span style="font-weight: bold; color: rgb(51, 102, 255);" class="ver" title=""&gt;LIKE&lt;/span&gt;&lt;/a&gt;.&lt;br /&gt;Cependant, comment peut-on faire pour rendre le &lt;a href="http://msdn.microsoft.com/fr-fr/library/ms180175.aspx"&gt;&lt;span style="font-weight: bold; color: rgb(51, 102, 255);" title="" hptip=""&gt;LIKE&lt;/span&gt;&lt;/a&gt; non sensible&lt;br /&gt;aux accents. Voici donc la méthode pour effectuer cette recherche&lt;br /&gt;avec Microsoft SQL Server.&lt;/span&gt;&lt;/p&gt;&lt;p style="font-family: courier new;font-family:courier new;" &gt;&lt;span style="font-size:100%;"&gt;En un mot la solution est : &lt;a href="http://msdn.microsoft.com/fr-fr/library/ms184391.aspx"&gt;&lt;span style="color: rgb(51, 102, 255); font-weight: bold;"&gt;COLLATE&lt;/span&gt;&lt;/a&gt;.&lt;/span&gt;&lt;/p&gt;&lt;p style="font-family: courier new;font-family:courier new;" &gt;&lt;span style="font-size:100%;"&gt;La clause &lt;a href="http://msdn.microsoft.com/fr-fr/library/ms184391.aspx"&gt;&lt;span style="color: rgb(51, 102, 255); font-weight: bold;"&gt;COLLATE&lt;/span&gt;&lt;/a&gt; permet (entre-autre) &lt;span&gt;la conversion du classement&lt;br /&gt;d'une expression.&lt;/span&gt; Cette clause doit être combinée avec une chaîne&lt;br /&gt;spécifiant &lt;a href="http://msdn.microsoft.com/fr-fr/library/ms180175.aspx"&gt;le nom d'un classement SQL Server&lt;/a&gt;.&lt;/span&gt;&lt;/p&gt;&lt;p style="font-family: courier new;font-family:courier new;" &gt;&lt;span style="font-size:100%;"&gt;Dans notre cas j'ai choisi : SQL_Latin1_General_Cp437_CI_AI.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="font-family: courier new;font-family:courier new;" &gt;&lt;span style="font-size:100%;"&gt;C'est à dire:&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="font-family: courier new;font-family:courier new;" &gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-weight: bold;"&gt;Latin1_General&lt;/span&gt;: &lt;span&gt;identifiant l'alphabet ou la langue dont les&lt;br /&gt;              règles de tri sont appliquées.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Cp437&lt;/span&gt;: page de code 437.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;CI&lt;/span&gt;: &lt;span&gt;ne distingue pas la casse.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;AI&lt;/span&gt;: &lt;/span&gt;&lt;span&gt;ne distingue pas les accents.&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="font-family: courier new;font-family:courier new;" &gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;-----&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="font-family: courier new;font-family:courier new;" &gt;&lt;span style="font-size:100%;"&gt;Cela donne cette requête:&lt;/span&gt;&lt;/p&gt;&lt;div style="font-family: courier new;font-family:courier new;" &gt;&lt;span style="font-weight: bold; color: rgb(51, 102, 255);"&gt;SELECT&lt;/span&gt; * &lt;span style="color: rgb(51, 102, 255); font-weight: bold;"&gt;FROM&lt;/span&gt; MY_TABLE &lt;span style="color: rgb(51, 102, 255); font-weight: bold;"&gt;WHERE&lt;/span&gt; MY_TABLE.STR &lt;span style="color: rgb(51, 102, 255); font-weight: bold;"&gt;LIKE&lt;/span&gt; &lt;span style="color: rgb(204, 0, 0);"&gt;'%Libellé%'&lt;/span&gt;&lt;/div&gt;&lt;div style="font-family: courier new;font-family:courier new;" &gt;&lt;span style="font-weight: bold; color: rgb(51, 102, 255);"&gt;COLLATE&lt;/span&gt; &lt;span style="color: rgb(204, 51, 204);"&gt;SQL_Latin1_General_Cp437_CI_&lt;/span&gt;&lt;wbr style="color: rgb(204, 51, 204);"&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;AI&lt;/span&gt;;&lt;/div&gt;&lt;p style="font-family: courier new;font-family:courier new;" &gt;-----&lt;/p&gt;&lt;p style="font-family: courier new;" face="courier new"&gt;Par &lt;span title="" hptip="Faute d'orthographe - suggestions : conséquent, conséquents, conséquente, conséquentes" class="spellmod"&gt;consequent&lt;/span&gt;, cette commande renverra les entrées dans&lt;br /&gt;la table si le champ STR est égale aux valeurs ci-dessous:&lt;/p&gt;&lt;p style="font-family: courier new;" face="courier new"&gt;libelle&lt;br /&gt;LiBeLlE&lt;br /&gt;libéllE&lt;br /&gt;Libellé&lt;br /&gt;&lt;/p&gt;&lt;p style="font-family: courier new;" face="courier new"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style="font-family: courier new;"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style="font-family: courier new;"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style="font-family: courier new;"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style="font-family: courier new;"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style="font-family: courier new;"&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="font-family: courier new;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt; &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6238714725528798977-1269207409835371361?l=johannes-fetz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johannes-fetz.blogspot.com/feeds/1269207409835371361/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://johannes-fetz.blogspot.com/2009/10/select-non-sensible-aux-accents-avec.html#comment-form' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6238714725528798977/posts/default/1269207409835371361'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6238714725528798977/posts/default/1269207409835371361'/><link rel='alternate' type='text/html' href='http://johannes-fetz.blogspot.com/2009/10/select-non-sensible-aux-accents-avec.html' title='SELECT non sensible aux accents avec Microsoft SQL Server (Transact-SQL)'/><author><name>Johannes Fetz</name><uri>http://www.blogger.com/profile/06529824680182774898</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://1.bp.blogspot.com/_hm-8HpFJuDs/TG-yB2CwfoI/AAAAAAAAAH0/1zpAykiGiVA/S220/fetz_j.PNG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6238714725528798977.post-930818237437318492</id><published>2009-09-26T06:21:00.000-07:00</published><updated>2009-09-26T07:00:24.858-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Créer un plugin pour Microsoft Visual Studio</title><content type='html'>&lt;p&gt;&lt;span style=";font-family:Courier New;font-size:100%;"  &gt;Pour notre démonstration, nous allons créer  un plugin qui permet&lt;br /&gt;d'ouvrir un onglet contenant un UserControl de votre  choix.&lt;br /&gt;Cette démonstration sera&lt;/span&gt;&lt;span style=";font-family:Courier New;font-size:100%;"  &gt; réalisée en C# sous visual studio 2008. &lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style=";font-family:Courier New;font-size:100%;"  &gt;Grace à cet exemple vous pourrez étendre de  façon exponentielle&lt;br /&gt;les possibilités de Visual Studio. &lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style=";font-family:Courier New;font-size:100%;"  &gt;&lt;strong&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;1&lt;/span&gt;&lt;/strong&gt;) Ouvrez Visual Studio et créez un nouveau  projet.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:100%;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_hm-8HpFJuDs/Sr4XnyETHuI/AAAAAAAAACg/LPysYQn2wV4/s1600-h/1.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 285px;" src="http://3.bp.blogspot.com/_hm-8HpFJuDs/Sr4XnyETHuI/AAAAAAAAACg/LPysYQn2wV4/s400/1.png" alt="" id="BLOGGER_PHOTO_ID_5385768176603832034" border="0" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=";font-family:Courier New;font-size:100%;"  &gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;strong&gt;2&lt;/strong&gt;&lt;/span&gt;)  Sélectionnez “Complément Visual Studio&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:100%;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_hm-8HpFJuDs/Sr4Xw4Mt_VI/AAAAAAAAACo/odBEvxoeSjs/s1600-h/2.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 272px;" src="http://1.bp.blogspot.com/_hm-8HpFJuDs/Sr4Xw4Mt_VI/AAAAAAAAACo/odBEvxoeSjs/s400/2.png" alt="" id="BLOGGER_PHOTO_ID_5385768332868582738" border="0" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=";font-family:Courier New;font-size:100%;"  &gt;&lt;strong&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;3&lt;/span&gt;&lt;/strong&gt;)  Cliquez sur “Suivant”&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:100%;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_hm-8HpFJuDs/Sr4X3YcXabI/AAAAAAAAACw/MBABlLb1vhg/s1600-h/3.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 305px;" src="http://1.bp.blogspot.com/_hm-8HpFJuDs/Sr4X3YcXabI/AAAAAAAAACw/MBABlLb1vhg/s400/3.png" alt="" id="BLOGGER_PHOTO_ID_5385768444603361714" border="0" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=";font-family:Courier New;font-size:100%;"  &gt;&lt;strong&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;4&lt;/span&gt;&lt;/strong&gt;)  Sélectionnez “C#” et cliquez sur “Suivant”&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:100%;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_hm-8HpFJuDs/Sr4X8Tx9_kI/AAAAAAAAAC4/wpsVmDA03fg/s1600-h/4.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 304px;" src="http://3.bp.blogspot.com/_hm-8HpFJuDs/Sr4X8Tx9_kI/AAAAAAAAAC4/wpsVmDA03fg/s400/4.png" alt="" id="BLOGGER_PHOTO_ID_5385768529251139138" border="0" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=";font-family:Courier New;font-size:100%;"  &gt;&lt;strong&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;5&lt;/span&gt;&lt;/strong&gt;)  Sélectionnez “Microsoft Visual Studio 200X” et&lt;br /&gt;cliquez sur “Suivant”&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:100%;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_hm-8HpFJuDs/Sr4YDjDNo5I/AAAAAAAAADA/lYcDLVQewPo/s1600-h/5.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 304px;" src="http://4.bp.blogspot.com/_hm-8HpFJuDs/Sr4YDjDNo5I/AAAAAAAAADA/lYcDLVQewPo/s400/5.png" alt="" id="BLOGGER_PHOTO_ID_5385768653609083794" border="0" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=";font-family:Courier New;font-size:100%;"  &gt;&lt;strong&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;6&lt;/span&gt;&lt;/strong&gt;)  Entrez les informations sur votre plugin et&lt;br /&gt;cliquez sur “Suivant”.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:100%;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_hm-8HpFJuDs/Sr4YIwcmIwI/AAAAAAAAADI/BWHY3BRkb2Q/s1600-h/6.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 306px;" src="http://2.bp.blogspot.com/_hm-8HpFJuDs/Sr4YIwcmIwI/AAAAAAAAADI/BWHY3BRkb2Q/s400/6.png" alt="" id="BLOGGER_PHOTO_ID_5385768743104553730" border="0" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=";font-family:Courier New;font-size:100%;"  &gt;&lt;strong&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;7&lt;/span&gt;&lt;/strong&gt;)  Selectionnez les élements comme ci-dessous et&lt;br /&gt;cliquez sur “Suivant”&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:100%;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_hm-8HpFJuDs/Sr4YQHuj0DI/AAAAAAAAADQ/ANsBVcCoGnU/s1600-h/7.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 304px;" src="http://4.bp.blogspot.com/_hm-8HpFJuDs/Sr4YQHuj0DI/AAAAAAAAADQ/ANsBVcCoGnU/s400/7.png" alt="" id="BLOGGER_PHOTO_ID_5385768869612998706" border="0" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=";font-family:Courier New;font-size:100%;"  &gt;&lt;strong&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;8&lt;/span&gt;&lt;/strong&gt;)  Cliquez sur “Suivant”&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:100%;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_hm-8HpFJuDs/Sr4YXrOQojI/AAAAAAAAADY/4I8q_EjZSNc/s1600-h/8.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 306px;" src="http://3.bp.blogspot.com/_hm-8HpFJuDs/Sr4YXrOQojI/AAAAAAAAADY/4I8q_EjZSNc/s400/8.png" alt="" id="BLOGGER_PHOTO_ID_5385768999400284722" border="0" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=";font-family:Courier New;font-size:100%;"  &gt;&lt;strong&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;9&lt;/span&gt;&lt;/strong&gt;)  Cliquez sur “Suivant”&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:100%;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_hm-8HpFJuDs/Sr4Ye9WAVJI/AAAAAAAAADg/iAwQsc5mJvU/s1600-h/9.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 304px;" src="http://4.bp.blogspot.com/_hm-8HpFJuDs/Sr4Ye9WAVJI/AAAAAAAAADg/iAwQsc5mJvU/s400/9.png" alt="" id="BLOGGER_PHOTO_ID_5385769124523693202" border="0" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=";font-family:Courier New;font-size:100%;"  &gt;&lt;strong&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;10&lt;/span&gt;&lt;/strong&gt;) Ouvrez le fichier “Connect.cs”&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style=";font-family:Courier New;font-size:100%;"  &gt;Ce fichier contient une classe “Connect” qui  est le point&lt;br /&gt;d’entrer de notre plugin. Attention, c’est du C#.Net 1.0.&lt;br /&gt;Par conséquent le code généré est plutôt moche.&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style=";font-family:Courier New;font-size:100%;"  &gt;Cette classe contient 7 méthodes:&lt;/span&gt;&lt;/p&gt; &lt;table unselectable="on" border="0" cellpadding="2" cellspacing="0" width="643"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td valign="top" width="173"&gt;&lt;span style="color: rgb(0, 0, 0);font-family:Courier New;font-size:100%;"  &gt;&lt;strong&gt;Methode&lt;/strong&gt;&lt;/span&gt;&lt;/td&gt; &lt;td valign="top" width="468"&gt;&lt;span style="color: rgb(0, 0, 0);font-family:Courier New;font-size:100%;"  &gt;&lt;strong&gt;Action&lt;/strong&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign="top" width="173"&gt;&lt;span style=";font-family:Courier New;font-size:100%;"  &gt;OnConnection&lt;/span&gt;&lt;/td&gt; &lt;td valign="top" width="468"&gt;&lt;span style=";font-family:Courier New;font-size:100%;"  &gt;Appelée lors du  chargement du plugin.&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign="top" width="173"&gt;&lt;span style=";font-family:Courier New;font-size:100%;"  &gt;OnDisconnection&lt;/span&gt;&lt;/td&gt; &lt;td valign="top" width="468"&gt;&lt;span style=";font-family:Courier New;font-size:100%;"  &gt;Appelée lors du  déchargement du plugin.&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign="top" width="173"&gt;&lt;span style=";font-family:Courier New;font-size:100%;"  &gt;OnAddInsUpdate&lt;/span&gt;&lt;/td&gt; &lt;td valign="top" width="468"&gt;&lt;span style=";font-family:Courier New;font-size:100%;"  &gt;Appelée lorsque des  plugins on été chargés ou déchargés&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign="top" width="173"&gt;&lt;span style=";font-family:Courier New;font-size:100%;"  &gt;OnStartupComplete&lt;/span&gt;&lt;/td&gt; &lt;td valign="top" width="468"&gt;&lt;span style=";font-family:Courier New;font-size:100%;"  &gt;Appelée lorsque le  Visual est en cours de lancement&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign="top" width="173"&gt;&lt;span style=";font-family:Courier New;font-size:100%;"  &gt;OnBeginShutdown&lt;/span&gt;&lt;/td&gt; &lt;td valign="top" width="468"&gt;&lt;span style=";font-family:Courier New;font-size:100%;"  &gt;Appelée lorsque le  Visual est en cours de fermeture&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign="top" width="173"&gt;&lt;span style=";font-family:Courier New;font-size:100%;"  &gt;QueryStatus&lt;/span&gt;&lt;/td&gt; &lt;td valign="top" width="468"&gt;&lt;span style=";font-family:Courier New;font-size:100%;"  &gt;Appelée lorsque le  paramétrage d’une commande a changé&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt; &lt;tr&gt; &lt;td valign="top" width="173"&gt;&lt;span style=";font-family:Courier New;font-size:100%;"  &gt;Exec&lt;/span&gt;&lt;/td&gt; &lt;td valign="top" width="468"&gt;&lt;span style=";font-family:Courier New;font-size:100%;"  &gt;Appelée lors de  l’exécution d’une commande dans le plugin&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt; &lt;p&gt;&lt;span style=";font-family:Courier New;font-size:100%;"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="font-weight: bold;"&gt;&lt;span style=";font-family:Courier New;font-size:100%;"  &gt;Pour l’instant, nous n’allons pas modifier ce  fichier.&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="color: rgb(255, 128, 128);font-family:Courier New;font-size:100%;"  &gt;Remarque : un plugin est en  réalité qu’une bibliothèque&lt;br /&gt;de classes compilée (MyFirstAddIn.dll  dans notre cas)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:100%;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_hm-8HpFJuDs/Sr4Yl8PKFfI/AAAAAAAAADo/L-00ntH00x0/s1600-h/10.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 302px;" src="http://2.bp.blogspot.com/_hm-8HpFJuDs/Sr4Yl8PKFfI/AAAAAAAAADo/L-00ntH00x0/s400/10.png" alt="" id="BLOGGER_PHOTO_ID_5385769244485621234" border="0" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=";font-family:Courier New;font-size:100%;"  &gt;&lt;strong&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;11&lt;/span&gt;&lt;/strong&gt;)  Allez dans les propriétés du projet.&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=";font-family:Courier New;font-size:100%;"  &gt;Notre plugin est destiné à être  utilisé avec Visual Studio. C’est-à-dire&lt;br /&gt;que pour déboguer notre plugin,  nous allons lancer une instance de&lt;br /&gt;Visual Studio qui sera l’hôte de notre  application.&lt;br /&gt;Ainsi, nous allons indiquer à Visual Studio qu’il doit lancer  une instance&lt;br /&gt;de &lt;/span&gt;&lt;span style=";font-family:Courier New;font-size:100%;"  &gt;Visual “devenv.exe”  en mode Debug.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:100%;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_hm-8HpFJuDs/Sr4Yux_fMpI/AAAAAAAAADw/PWsafRAonGE/s1600-h/11.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 264px;" src="http://3.bp.blogspot.com/_hm-8HpFJuDs/Sr4Yux_fMpI/AAAAAAAAADw/PWsafRAonGE/s400/11.png" alt="" id="BLOGGER_PHOTO_ID_5385769396354364050" border="0" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style=";font-family:Courier New;font-size:100%;"  &gt;&lt;strong&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;12&lt;/span&gt;&lt;/strong&gt;)  Dans l'onglet “Déboguer” Sélectionnez “Démarrer le programme externe”&lt;br /&gt;dans  “Action de démarrage”.&lt;br /&gt;&lt;br /&gt;Assurez-vous que le chemin vers le programme  “devenv.exe” est&lt;br /&gt;correct. Normalement les paramètres par défaut sont  corrects.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:100%;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_hm-8HpFJuDs/Sr4ZAeUNfWI/AAAAAAAAAD4/_87aI5ly6N8/s1600-h/12.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 302px;" src="http://3.bp.blogspot.com/_hm-8HpFJuDs/Sr4ZAeUNfWI/AAAAAAAAAD4/_87aI5ly6N8/s400/12.png" alt="" id="BLOGGER_PHOTO_ID_5385769700310220130" border="0" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=";font-family:Courier New;font-size:100%;"  &gt;&lt;strong&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;13&lt;/span&gt;&lt;/strong&gt;) Lancez l’application en mode  “Debug”.&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style=";font-family:Courier New;font-size:100%;"  &gt;Comme nous pouvons le voir Visual va lancer  une instance Visual.&lt;br /&gt;Nous pouvons aussi remarquer qu’un nouveau bouton  “"MyFirstAddIn”&lt;br /&gt;est apparu dans “Outils”. Si nous cliquons dessus, il se  passe&lt;br /&gt;bien entendu rien du tout, car nous n’avons rien implémenté dans&lt;br /&gt;le fichier “Connect.cs”.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:100%;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_hm-8HpFJuDs/Sr4ZI26jHhI/AAAAAAAAAEA/fba7Fw1msbg/s1600-h/13.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 328px;" src="http://3.bp.blogspot.com/_hm-8HpFJuDs/Sr4ZI26jHhI/AAAAAAAAAEA/fba7Fw1msbg/s400/13.png" alt="" id="BLOGGER_PHOTO_ID_5385769844352425490" border="0" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=";font-family:Courier New;font-size:100%;"  &gt;&lt;strong&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;14&lt;/span&gt;&lt;/strong&gt;) Ajoutez un nouveau UserControl.&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style=";font-family:Courier New;font-size:100%;"  &gt;Nous avons vu que le plugin est parfaitement  chargé par Visual Studio.&lt;br /&gt;Il faut maintenant créer le Contrôle  utilisateur(UserControl)&lt;br /&gt;pour notre démonstration.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:100%;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_hm-8HpFJuDs/Sr4ZQbbsCQI/AAAAAAAAAEI/UfU65O8zkbs/s1600-h/14.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 367px;" src="http://2.bp.blogspot.com/_hm-8HpFJuDs/Sr4ZQbbsCQI/AAAAAAAAAEI/UfU65O8zkbs/s400/14.png" alt="" id="BLOGGER_PHOTO_ID_5385769974414182658" border="0" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=";font-family:Courier New;font-size:100%;"  &gt;&lt;strong&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;15&lt;/span&gt;&lt;/strong&gt;) Entrez un nom puis cliquez sur  “Ajouter”.&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style=";font-family:Courier New;font-size:100%;"  &gt;Pour notre exemple, j’ai appelé le  UserControl “MyUserControl”&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:100%;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_hm-8HpFJuDs/Sr4ZZ8e1s7I/AAAAAAAAAEQ/uznKf8nwp-Q/s1600-h/15.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 242px;" src="http://1.bp.blogspot.com/_hm-8HpFJuDs/Sr4ZZ8e1s7I/AAAAAAAAAEQ/uznKf8nwp-Q/s400/15.png" alt="" id="BLOGGER_PHOTO_ID_5385770137904591794" border="0" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=";font-family:Courier New;font-size:100%;"  &gt;&lt;strong&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;16&lt;/span&gt;&lt;/strong&gt;) &lt;/span&gt;&lt;span style=";font-family:Courier New;font-size:100%;"  &gt;Ajoutez  les éléments que vous desirez dans ce UserControl.&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style=";font-family:Courier New;font-size:100%;"  &gt;Dans notre exemple j’ai ajouté une  PictureBox.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:100%;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_hm-8HpFJuDs/Sr4Zie2g7QI/AAAAAAAAAEY/65kBrJqsGJg/s1600-h/16.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 284px;" src="http://2.bp.blogspot.com/_hm-8HpFJuDs/Sr4Zie2g7QI/AAAAAAAAAEY/65kBrJqsGJg/s400/16.png" alt="" id="BLOGGER_PHOTO_ID_5385770284569652482" border="0" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:100%;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_hm-8HpFJuDs/Sr4ZoQu9avI/AAAAAAAAAEg/z-29fVtn9D0/s1600-h/17.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 316px;" src="http://3.bp.blogspot.com/_hm-8HpFJuDs/Sr4ZoQu9avI/AAAAAAAAAEg/z-29fVtn9D0/s400/17.png" alt="" id="BLOGGER_PHOTO_ID_5385770383859084018" border="0" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=";font-family:Courier New;font-size:100%;"  &gt;&lt;strong&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;17&lt;/span&gt;&lt;/strong&gt;) Implémentez le fichier “Connect.cs”&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style=";font-family:Courier New;font-size:100%;"  &gt;Nous sommes maintenant en mesure  d’implémenter notre plugin.&lt;br /&gt;Pour des raisons pratiques, je vais seulement  indiquer les lignes à rajouter dans ce fichier afin&lt;br /&gt;de ne pas nuire à la  visibilité de ce tutoriel (le code complet est disponible en bas du  tutoriel).&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style=";font-family:Courier New;font-size:100%;"  &gt;&lt;span style="color: rgb(255, 0, 0);"&gt;&lt;strong&gt;A)&lt;/strong&gt;&lt;/span&gt; &lt;strong&gt;Ajoutez un “using” dans  l’entête du fichier pour indiquer que nous allons utiliser les “Windows  Forms”:&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style=";font-family:Courier New;font-size:100%;"  &gt;&lt;span style="color: rgb(0, 128, 255);"&gt;using&lt;/span&gt;  System.Windows.Forms;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style=";font-family:Courier New;font-size:100%;"  &gt;&lt;strong&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;B)&lt;/span&gt;&lt;/strong&gt; &lt;strong&gt;Ajoutez deux attributs privés dans la  classe:&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="color: rgb(0, 128, 64);font-family:Courier New;font-size:100%;"  &gt;// Instance de notre  UserControl&lt;/span&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:Courier New;font-size:100%;"  &gt;&lt;span style="color: rgb(0, 128, 255);"&gt;private&lt;/span&gt; &lt;span style="color: rgb(0, 204, 204);"&gt;UserControl&lt;/span&gt;  _UserControl;&lt;br /&gt;&lt;span style="color: rgb(0, 128, 0);"&gt;// Instance sur la fenêtre  qui contient notre UserControl&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 128, 255);"&gt;private&lt;/span&gt; &lt;span style="color: rgb(0, 221, 221);"&gt;Window&lt;/span&gt;  _toolWindow;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style=";font-family:Courier New;font-size:100%;"  &gt;&lt;strong&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;C)&lt;/span&gt;&lt;/strong&gt; &lt;strong&gt;Ajoutez à la fin de la méthode  “OnConnection” le code ci-dessous:&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre&gt;&lt;p&gt;&lt;span style=";font-family:Courier New;font-size:100%;"  &gt;&lt;span style="color: rgb(0, 128, 255);"&gt;else if&lt;/span&gt;  (connectMode != ext_ConnectMode.ext_cm_UISetup)&lt;br /&gt;{&lt;br /&gt;&lt;span style="color: rgb(0, 128, 255);"&gt;   try&lt;/span&gt;&lt;br /&gt;   {&lt;br /&gt;&lt;span style="color: rgb(0, 128, 255);"&gt;        object&lt;/span&gt;  obj = &lt;span style="color: rgb(0, 128, 255);"&gt;null&lt;/span&gt;;&lt;span style="color: rgb(0, 128, 0);"&gt;// Instance du  contrôle renvoyé par CreateToolWindow2&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 183, 183);"&gt;        Windows2&lt;/span&gt; windows2 = &lt;span style="color: rgb(0, 128, 255);"&gt;this&lt;/span&gt;._applicationObject.Windows &lt;span style="color: rgb(0, 128, 255);"&gt;as&lt;/span&gt; &lt;span style="color: rgb(0, 187, 187);"&gt;Windows2&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: rgb(0, 128, 255);"&gt;        this&lt;/span&gt;._toolWindow = windows2.CreateToolWindow2(&lt;span style="color: rgb(0, 128, 255);"&gt;this&lt;/span&gt;._addInInstance,&lt;br /&gt;&lt;span style="color: rgb(0, 198, 198);"&gt;                        Assembly&lt;/span&gt;.GetExecutingAssembly().Location,&lt;br /&gt;&lt;span style="color: rgb(193, 0, 0);"&gt;                        "MyFirstAddIn.MyUserControl"&lt;/span&gt;, &lt;span style="color: rgb(0, 128, 0);"&gt;// Nom du  contrôle&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=";font-family:Courier New;font-size:100%;"  &gt;                           &lt;span style="color: rgb(210, 0, 0);"&gt;"MyFirstAddIn"&lt;/span&gt;, &lt;span style="color: rgb(0, 128, 0);"&gt;// Nom du plugin&lt;/span&gt;&lt;br /&gt;                      &lt;span style="color: rgb(0, 153, 0);"&gt;//&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 153, 0);font-size:100%;" &gt; Identificateur unique pour la nouvelle fenêtre.&lt;/span&gt;&lt;span style=";font-family:Courier New;font-size:100%;"  &gt;&lt;br /&gt;                      &lt;span style="color: rgb(196, 0, 0);"&gt;"{84A3675C-CDA0-4c8b-858F-8F00BEACF199}"&lt;/span&gt;,&lt;br /&gt;                      &lt;span style="color: rgb(0, 128, 255);"&gt;ref&lt;/span&gt; obj);&lt;br /&gt;&lt;span style="color: rgb(0, 128, 255);"&gt;        this&lt;/span&gt;._UserControl = obj &lt;span style="color: rgb(0, 128, 255);"&gt;as&lt;/span&gt;  &lt;span style="color: rgb(0, 179, 179);"&gt;UserControl&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: rgb(0, 128, 255);"&gt;        this&lt;/span&gt;._toolWindow.Linkable = &lt;span style="color: rgb(0, 128, 255);"&gt;false&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: rgb(0, 128, 255);"&gt;        this&lt;/span&gt;._toolWindow.IsFloating = &lt;span style="color: rgb(0, 128, 255);"&gt;false&lt;/span&gt;;&lt;br /&gt;  }&lt;br /&gt;&lt;span style="color: rgb(0, 128, 255);"&gt;  catch&lt;/span&gt;  (&lt;span style="color: rgb(0, 191, 191);"&gt;Exception&lt;/span&gt;) &lt;span style="color: rgb(0, 128, 0);"&gt;// A  implémenter&lt;/span&gt;&lt;br /&gt;  {&lt;br /&gt;  }&lt;br /&gt;}&lt;/span&gt;&lt;/p&gt;&lt;/pre&gt;&lt;p&gt;&lt;span style=";font-family:Courier New;font-size:100%;"  &gt;&lt;strong&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;D)&lt;/span&gt;&lt;/strong&gt; &lt;strong&gt;Ajoutez dans la méthode “Exec” le code  ci-dessous&lt;br /&gt;juste avant le “handled = true;”:&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style=";font-family:Courier New;font-size:100%;"  &gt;&lt;span style="color: rgb(0, 128, 255);"&gt;this&lt;/span&gt;._toolWindow.Visible = &lt;span style="color: rgb(0, 128, 255);"&gt;true&lt;/span&gt;;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style=";font-family:Courier New;font-size:100%;"  &gt;&lt;strong&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;E)&lt;/span&gt;&lt;/strong&gt; &lt;strong&gt;Compilez, exécutez, puis cliquez dans  le bouton “MyFirstAddIn”&lt;br /&gt;dans “Outils”.&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="color: rgb(255, 128, 128);font-family:Courier New;font-size:100%;"  &gt;Remarque: ne lancez jamais le  plugin dans l’instance du Visual que vous&lt;br /&gt;utilisez pour développer le  plugin, sinon vous devrez redémarrer Visual.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:100%;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_hm-8HpFJuDs/Sr4Z2mu9uOI/AAAAAAAAAEo/Qm_cdzDYDtk/s1600-h/18.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 277px;" src="http://4.bp.blogspot.com/_hm-8HpFJuDs/Sr4Z2mu9uOI/AAAAAAAAAEo/Qm_cdzDYDtk/s400/18.png" alt="" id="BLOGGER_PHOTO_ID_5385770630282852578" border="0" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:100%;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_hm-8HpFJuDs/Sr4aCenvMoI/AAAAAAAAAEw/RL5G1890q6g/s1600-h/19.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 277px;" src="http://1.bp.blogspot.com/_hm-8HpFJuDs/Sr4aCenvMoI/AAAAAAAAAEw/RL5G1890q6g/s400/19.png" alt="" id="BLOGGER_PHOTO_ID_5385770834263487106" border="0" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=";font-family:Courier New;font-size:100%;"  &gt;Notre plugin est maintenant fonctionnel. Il  ne reste qu’à implémenter&lt;br /&gt;notre UserControl. Vous pouvez ainsi réaliser une  multitude d’outil&lt;br /&gt;pour améliorer la productivité dans votre organisation  comme:&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style=";font-family:Courier New;font-size:100%;"  &gt;- Un client VIM intégré dans visual.&lt;br /&gt;- Un  client de messagerie instantané.&lt;br /&gt;- Des outils de diagnostiques.&lt;br /&gt;- Des  “Profiler” de code.&lt;br /&gt;- Un gestionnaire de documentation colaboratif.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=";font-family:Courier New;font-size:100%;"  &gt;Afin de gagner du temps, vous pouvez assigner un  raccourcis clavier à&lt;br /&gt;votre commande. Pour cela il suffit d’aller dans  “Outils” puis “Options”.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:100%;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_hm-8HpFJuDs/Sr4aNgP0qOI/AAAAAAAAAE4/8kI3MP33B_U/s1600-h/20.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 359px;" src="http://3.bp.blogspot.com/_hm-8HpFJuDs/Sr4aNgP0qOI/AAAAAAAAAE4/8kI3MP33B_U/s400/20.png" alt="" id="BLOGGER_PHOTO_ID_5385771023678613730" border="0" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=";font-family:Courier New;font-size:100%;"  &gt;Sélectionnez “Environnement –&gt; Clavier”.  Faites une recherche afin de retrouver&lt;br /&gt;la commande.  Dans notre cas la  commande s’appelle  “MyFirstAddIn.&lt;br /&gt;Connect.MyFirstAddIn”. Il ne vous reste  plus qu’à assigner un raccourcis.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:100%;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_hm-8HpFJuDs/Sr4aW99lVsI/AAAAAAAAAFA/b2oXEiP6pxU/s1600-h/21.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 278px;" src="http://1.bp.blogspot.com/_hm-8HpFJuDs/Sr4aW99lVsI/AAAAAAAAAFA/b2oXEiP6pxU/s400/21.png" alt="" id="BLOGGER_PHOTO_ID_5385771186273998530" border="0" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=";font-family:Courier New;font-size:100%;"  &gt;&lt;strong&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;18&lt;/span&gt;&lt;/strong&gt;) &lt;span style="color: rgb(255, 0, 0); font-weight: bold;"&gt;Déployment du plugin.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style=";font-family:Courier New;font-size:100%;"  &gt;Pour Déployer le plugin, il suffit de fournir  la bibliothèque de classe&lt;br /&gt;qui se trouve dans le répertoire de sortie du  projet (Dans notre cas&lt;br /&gt;&lt;strong&gt;“MyFirstAddIn.dll”&lt;/strong&gt; ) Ainsi qu’un  fichier XML avec l’extension &lt;strong&gt;“.AddIn”&lt;/strong&gt;.&lt;br /&gt;&lt;br /&gt;Ce fichier XML  est visible dans l’explorateur de la solution.&lt;br /&gt;Dans notre cas il s’appelle  “MyFirstAddIn.AddIn”. Il suffit de le copier&lt;br /&gt;dans le répertoire  &lt;strong&gt;“Addins”&lt;/strong&gt; de l’utilisateur voir ci-dessous:&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style=";font-family:Courier New;font-size:100%;"  &gt;Remarque: Un fichier est déjà existant dans  votre répertoire.&lt;br /&gt;Il s’agit du fichier utiliser par Visual pour déboguer  votre application.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:100%;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_hm-8HpFJuDs/Sr4ajo-zVcI/AAAAAAAAAFI/OSK5CPpUVRk/s1600-h/30.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 245px;" src="http://2.bp.blogspot.com/_hm-8HpFJuDs/Sr4ajo-zVcI/AAAAAAAAAFI/OSK5CPpUVRk/s400/30.png" alt="" id="BLOGGER_PHOTO_ID_5385771403980264898" border="0" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=";font-family:Courier New;font-size:100%;"  &gt;Attention, la seule réstriction c’est que la  valeur contenue dans la&lt;br /&gt;balise &lt;strong&gt;“Assembly”&lt;/strong&gt; soit correct. La  valeur doit pointer sur le chemin du&lt;br /&gt;plugin que vous deployer. Ainsi le  choix de l’emplacement du plugin&lt;br /&gt;est à votre discretion.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:100%;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_hm-8HpFJuDs/Sr4avWKCVhI/AAAAAAAAAFQ/IhmPz0k4BfQ/s1600-h/31.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 193px;" src="http://4.bp.blogspot.com/_hm-8HpFJuDs/Sr4avWKCVhI/AAAAAAAAAFQ/IhmPz0k4BfQ/s400/31.png" alt="" id="BLOGGER_PHOTO_ID_5385771605085541906" border="0" /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=";font-family:Courier New;font-size:100%;"  &gt;Merci d’avoir suivi ce tutoriel.&lt;br /&gt;&lt;br /&gt;Dans  le prochain article, nous exploiterons un peu plus les possibilités&lt;br /&gt;de  Visual Studio (Lancement de compilation, automatisation de tâches,&lt;br /&gt;parsing  de code).&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-size:100%;"&gt;&lt;strong&gt;&lt;span style="font-family:Courier New;"&gt;Code source du tutoriel :  &lt;/span&gt;&lt;/strong&gt;&lt;a href="http://www.megaupload.com/?d=QK5VUUU3" target="_blank"&gt;&lt;strong&gt;&lt;span style="font-family:Courier New;"&gt;ICI&lt;/span&gt;&lt;/strong&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=";font-family:Courier New;font-size:100%;"  &gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6238714725528798977-930818237437318492?l=johannes-fetz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johannes-fetz.blogspot.com/feeds/930818237437318492/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://johannes-fetz.blogspot.com/2009/09/creer-un-plugin-pour-microsoft-visual.html#comment-form' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6238714725528798977/posts/default/930818237437318492'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6238714725528798977/posts/default/930818237437318492'/><link rel='alternate' type='text/html' href='http://johannes-fetz.blogspot.com/2009/09/creer-un-plugin-pour-microsoft-visual.html' title='Créer un plugin pour Microsoft Visual Studio'/><author><name>Johannes Fetz</name><uri>http://www.blogger.com/profile/06529824680182774898</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://1.bp.blogspot.com/_hm-8HpFJuDs/TG-yB2CwfoI/AAAAAAAAAH0/1zpAykiGiVA/S220/fetz_j.PNG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_hm-8HpFJuDs/Sr4XnyETHuI/AAAAAAAAACg/LPysYQn2wV4/s72-c/1.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6238714725528798977.post-8816556651118189923</id><published>2009-09-03T03:32:00.000-07:00</published><updated>2009-09-04T08:46:27.416-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Transformer un String en Stream</title><content type='html'>&lt;pre  style="font-family:courier new;"&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;/// String2Stream&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;/// &amp;lt;param name="str"&amp;gt;la chaine&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;/// &amp;lt;returns&amp;gt;le flux&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;public static&lt;/span&gt; &lt;span style="color: rgb(0, 204, 204);"&gt;Stream &lt;/span&gt;String2Stream(&lt;span style="color: rgb(51, 102, 255);"&gt;string &lt;/span&gt;str)&lt;br /&gt;{&lt;br /&gt;  &lt;span style="color: rgb(0, 204, 204);"&gt;MemoryStream &lt;/span&gt;memStream = &lt;span style="color: rgb(51, 102, 255);"&gt;new &lt;/span&gt;&lt;span style="color: rgb(0, 204, 204);"&gt;MemoryStream&lt;/span&gt;();&lt;br /&gt;  &lt;span style="color: rgb(51, 102, 255);"&gt;byte&lt;/span&gt;[] data = &lt;span style="color: rgb(0, 204, 204);"&gt;Encoding&lt;/span&gt;.Unicode.GetBytes(str);&lt;br /&gt;  memStream.Write(data, 0, data.Length);&lt;br /&gt;  &lt;span style="color: rgb(51, 102, 255);"&gt;return &lt;/span&gt;(memStream &lt;span style="color: rgb(51, 102, 255);"&gt;as &lt;/span&gt;&lt;span style="color: rgb(0, 204, 204);"&gt;Stream&lt;/span&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6238714725528798977-8816556651118189923?l=johannes-fetz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johannes-fetz.blogspot.com/feeds/8816556651118189923/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://johannes-fetz.blogspot.com/2009/09/transformer-un-string-en-stream.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6238714725528798977/posts/default/8816556651118189923'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6238714725528798977/posts/default/8816556651118189923'/><link rel='alternate' type='text/html' href='http://johannes-fetz.blogspot.com/2009/09/transformer-un-string-en-stream.html' title='Transformer un String en Stream'/><author><name>Johannes Fetz</name><uri>http://www.blogger.com/profile/06529824680182774898</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://1.bp.blogspot.com/_hm-8HpFJuDs/TG-yB2CwfoI/AAAAAAAAAH0/1zpAykiGiVA/S220/fetz_j.PNG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6238714725528798977.post-4730179509052511235</id><published>2009-09-03T03:03:00.000-07:00</published><updated>2009-09-03T03:25:56.784-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Parser un fichier CSV en C#</title><content type='html'>&lt;pre style="font-family: courier new;"&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;/// CSVsplitter&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;/// &amp;lt;param name="str"&amp;gt;la chaine&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;/// &amp;lt;param name="delimiter"&amp;gt;le séparateur&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;/// &amp;lt;param name="hasQuote"&amp;gt;utilise les quotes&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;/// &amp;lt;returns&amp;gt;tableau de chaines&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;public static string&lt;/span&gt;[] CSVsplitter(&lt;span style="color: rgb(51, 102, 255);"&gt;string &lt;/span&gt;str, &lt;span style="color: rgb(51, 102, 255);"&gt;char &lt;/span&gt;delimiter, &lt;span style="color: rgb(51, 102, 255);"&gt;bool &lt;/span&gt;hasQuote)&lt;br /&gt;{&lt;br /&gt;    if (!hasQuote) &lt;span style="color: rgb(0, 153, 0);"&gt;// Si il n'y a pas de "quote"&lt;/span&gt;&lt;br /&gt;        &lt;span style="color: rgb(51, 102, 255);"&gt;return &lt;/span&gt;(str.Split(delimiter));&lt;br /&gt;    &lt;span style="color: rgb(0, 153, 0);"&gt;// On remplace le séparateur pour éviter les conflits &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;    //&lt;span style="color: rgb(0, 153, 0);"&gt; avec l'expression régulière&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;    str = str.Replace(delimiter, &lt;span style="color: rgb(204, 0, 0);"&gt;'¤'&lt;/span&gt;);&lt;br /&gt;    &lt;span style="color: rgb(51, 102, 255);"&gt;string&lt;/span&gt;[] tab = (&lt;span style="color: rgb(51, 102, 255);"&gt;new &lt;/span&gt;&lt;span style="color: rgb(0, 204, 204);"&gt;Regex&lt;/span&gt;(&lt;span style="color: rgb(204, 0, 0);"&gt;'¤'&lt;/span&gt; + &lt;span style="color: rgb(204, 0, 0);"&gt;"(?=(?:[^\"]*\"\"[^\"]*\"\")*(?![^\"]+\"\"))"&lt;/span&gt;,&lt;br /&gt;                    &lt;span style="color: rgb(0, 204, 204);"&gt;RegexOptions&lt;/span&gt;.IgnorePatternWhitespace)).Split(str);&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;    // On retire les "quotes"&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: rgb(51, 102, 255);"&gt;for &lt;/span&gt;(&lt;span style="color: rgb(51, 102, 255);"&gt;int &lt;/span&gt;i = 0; i &lt; tab.Length; ++i)&lt;br /&gt;        tab[i] = (&lt;span style="color: rgb(51, 102, 255);"&gt;new &lt;/span&gt;&lt;span style="color: rgb(0, 204, 204);"&gt;StringBuilder&lt;/span&gt;(tab[i], 1,&lt;br /&gt;                  tab[i].Length - 2, tab[i].Length - 2)).ToString();&lt;br /&gt;    &lt;span style="color: rgb(51, 102, 255);"&gt;return &lt;/span&gt;(tab);&lt;br /&gt;} &lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6238714725528798977-4730179509052511235?l=johannes-fetz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johannes-fetz.blogspot.com/feeds/4730179509052511235/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://johannes-fetz.blogspot.com/2009/09/parser-un-fichier-csv-en-c.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6238714725528798977/posts/default/4730179509052511235'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6238714725528798977/posts/default/4730179509052511235'/><link rel='alternate' type='text/html' href='http://johannes-fetz.blogspot.com/2009/09/parser-un-fichier-csv-en-c.html' title='Parser un fichier CSV en C#'/><author><name>Johannes Fetz</name><uri>http://www.blogger.com/profile/06529824680182774898</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://1.bp.blogspot.com/_hm-8HpFJuDs/TG-yB2CwfoI/AAAAAAAAAH0/1zpAykiGiVA/S220/fetz_j.PNG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6238714725528798977.post-4810835067049751253</id><published>2009-08-19T05:34:00.000-07:00</published><updated>2009-08-19T05:46:47.967-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Visual'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='Crystal Reports'/><title type='text'>Deployer Crystal Reports avec un Setup sous Visual Studio 2008</title><content type='html'>&lt;span style="font-family: arial;"&gt;&lt;br /&gt;1 - Ajoutez les dépendances dans votre "setup" &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a style="font-family: arial;" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_hm-8HpFJuDs/SovxkgGRKgI/AAAAAAAAAAw/zbQcZGmBQsI/s1600-h/1.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 249px;" src="http://1.bp.blogspot.com/_hm-8HpFJuDs/SovxkgGRKgI/AAAAAAAAAAw/zbQcZGmBQsI/s400/1.png" alt="" id="BLOGGER_PHOTO_ID_5371652589963258370" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;&lt;br /&gt;2 - Ajoutez le module Crystal Reports.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a style="font-family: arial;" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_hm-8HpFJuDs/Sovx823ZPMI/AAAAAAAAAA4/gDy1VSwzKRk/s1600-h/2.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 305px;" src="http://2.bp.blogspot.com/_hm-8HpFJuDs/Sovx823ZPMI/AAAAAAAAAA4/gDy1VSwzKRk/s400/2.png" alt="" id="BLOGGER_PHOTO_ID_5371653008391748802" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;&lt;br /&gt;3 - Sélectionnez le bon module, ici : "&lt;/span&gt;&lt;em style="font-family: arial;"&gt;CrystalReports11_5_NET_2005&lt;/em&gt;&lt;span style="font-family: arial;"&gt;.&lt;/span&gt;&lt;em style="font-family: arial;"&gt;msm&lt;/em&gt;&lt;span style="font-family: arial;"&gt;"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a style="font-family: arial;" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_hm-8HpFJuDs/SovyE6APNHI/AAAAAAAAABA/KVqaQXmpwPc/s1600-h/3.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 281px;" src="http://4.bp.blogspot.com/_hm-8HpFJuDs/SovyE6APNHI/AAAAAAAAABA/KVqaQXmpwPc/s400/3.png" alt="" id="BLOGGER_PHOTO_ID_5371653146673099890" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;&lt;br /&gt;4 - Modifiez les propriétés du module Crystal.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a style="font-family: arial;" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_hm-8HpFJuDs/Sovyh55V2oI/AAAAAAAAABI/mElzwK5T96o/s1600-h/4.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 178px;" src="http://2.bp.blogspot.com/_hm-8HpFJuDs/Sovyh55V2oI/AAAAAAAAABI/mElzwK5T96o/s400/4.png" alt="" id="BLOGGER_PHOTO_ID_5371653644860381826" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;&lt;br /&gt;5 - Sélectionnez "MergeModuleProperties"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a style="font-family: arial;" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_hm-8HpFJuDs/Sovyv7qFstI/AAAAAAAAABQ/NZBCk4DaTok/s1600-h/5.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 220px;" src="http://2.bp.blogspot.com/_hm-8HpFJuDs/Sovyv7qFstI/AAAAAAAAABQ/NZBCk4DaTok/s400/5.png" alt="" id="BLOGGER_PHOTO_ID_5371653885851448018" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;&lt;br /&gt;6 - Entrez votre code de licence pour le déploiement. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a style="font-family: arial;" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_hm-8HpFJuDs/Sovy8zpmUSI/AAAAAAAAABY/Hivjb8scdqM/s1600-h/6.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 142px;" src="http://3.bp.blogspot.com/_hm-8HpFJuDs/Sovy8zpmUSI/AAAAAAAAABY/Hivjb8scdqM/s400/6.png" alt="" id="BLOGGER_PHOTO_ID_5371654107040207138" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6238714725528798977-4810835067049751253?l=johannes-fetz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johannes-fetz.blogspot.com/feeds/4810835067049751253/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://johannes-fetz.blogspot.com/2009/08/deployer-crystal-reports-avec-un-setup.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6238714725528798977/posts/default/4810835067049751253'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6238714725528798977/posts/default/4810835067049751253'/><link rel='alternate' type='text/html' href='http://johannes-fetz.blogspot.com/2009/08/deployer-crystal-reports-avec-un-setup.html' title='Deployer Crystal Reports avec un Setup sous Visual Studio 2008'/><author><name>Johannes Fetz</name><uri>http://www.blogger.com/profile/06529824680182774898</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://1.bp.blogspot.com/_hm-8HpFJuDs/TG-yB2CwfoI/AAAAAAAAAH0/1zpAykiGiVA/S220/fetz_j.PNG'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_hm-8HpFJuDs/SovxkgGRKgI/AAAAAAAAAAw/zbQcZGmBQsI/s72-c/1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6238714725528798977.post-8636763758067960440</id><published>2009-08-17T11:18:00.000-07:00</published><updated>2009-08-17T12:09:59.117-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mobile'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Instance unique d'un programme sous windows CE en C#</title><content type='html'>&lt;pre&gt;&lt;span style="font-family:courier new;"&gt;Il est agréable qu'une application mobile fonctionne de la même&lt;br /&gt;façon sur windows mobile et windows CE. Sous windows mobile,&lt;br /&gt;lorsqu'une application est lancée et que l'on tente de la relancer,&lt;br /&gt;on récupère simplement le "focus" sur l'application existante.&lt;br /&gt;Contrairement à Windows CE qui autorise les instances multiples.&lt;br /&gt;Afin d'homogénéiser le comportement sur ces deux plateformes,&lt;br /&gt;un code très simple permet de résoudre ce problème.&lt;br /&gt;&lt;br /&gt;(le code compatible Windows mobile &amp;gt;= 3.0)&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;using&lt;/span&gt; System;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;using&lt;/span&gt; System.Windows.Forms;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;using&lt;/span&gt; System.Runtime.InteropServices;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;using&lt;/span&gt; System.Reflection;&lt;br /&gt;using MobileTools;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;namespace&lt;/span&gt; MobileTools&lt;br /&gt;{&lt;br /&gt;    &lt;span style="color: rgb(51, 102, 255);"&gt;static class &lt;/span&gt;SingleInstanceApplication&lt;br /&gt;    {&lt;br /&gt;        [&lt;span style="color: rgb(51, 204, 255);"&gt;DllImport&lt;/span&gt;(&lt;span style="color: rgb(204, 0, 0);"&gt;"coredll.dll"&lt;/span&gt;)]&lt;br /&gt;        &lt;span style="color: rgb(51, 102, 255);"&gt;private static extern&lt;/span&gt; &lt;span style="color: rgb(0, 204, 204);"&gt;IntPtr &lt;/span&gt;FindWindow(&lt;span style="color: rgb(51, 102, 255);"&gt;string &lt;/span&gt;lpClassName, &lt;span style="color: rgb(51, 102, 255);"&gt;string &lt;/span&gt;lpWindowName);&lt;br /&gt;&lt;br /&gt;        [&lt;span style="color: rgb(51, 204, 255);"&gt;DllImport&lt;/span&gt;(&lt;span style="color: rgb(204, 0, 0);"&gt;"coredll.dll"&lt;/span&gt;)]&lt;br /&gt;        &lt;span style="color: rgb(51, 102, 255);"&gt;private static extern&lt;/span&gt; &lt;span style="color: rgb(51, 102, 255);"&gt;bool&lt;/span&gt; SetForegroundWindow(&lt;span style="color: rgb(51, 204, 255);"&gt;IntPtr &lt;/span&gt;hWnd);&lt;br /&gt;&lt;br /&gt;        [&lt;span style="color: rgb(51, 204, 255);"&gt;DllImport&lt;/span&gt;(&lt;span style="color: rgb(204, 0, 0);"&gt;"coredll.dll"&lt;/span&gt;, SetLastError = &lt;span style="color: rgb(51, 102, 255);"&gt;true&lt;/span&gt;)]&lt;br /&gt;        &lt;span style="color: rgb(51, 102, 255);"&gt;private static extern&lt;/span&gt; &lt;span style="color: rgb(51, 204, 255);"&gt;IntPtr &lt;/span&gt;CreateMutex(&lt;span style="color: rgb(51, 204, 255);"&gt;IntPtr &lt;/span&gt;Attr, &lt;span style="color: rgb(51, 102, 255);"&gt;bool &lt;/span&gt;Own, &lt;span style="color: rgb(51, 102, 255);"&gt;string &lt;/span&gt;Name);&lt;br /&gt;&lt;br /&gt;        [&lt;span style="color: rgb(51, 204, 255);"&gt;DllImport&lt;/span&gt;(&lt;span style="color: rgb(204, 0, 0);"&gt;"coredll.dll"&lt;/span&gt;, SetLastError = &lt;span style="color: rgb(51, 102, 255);"&gt;true&lt;/span&gt;)]&lt;br /&gt;        &lt;span style="color: rgb(51, 102, 255);"&gt;private static extern bool&lt;/span&gt; ReleaseMutex(&lt;span style="color: rgb(0, 204, 204);"&gt;IntPtr &lt;/span&gt;hMutex);&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: rgb(51, 102, 255);"&gt;public static void&lt;/span&gt; Run(&lt;span style="color: rgb(0, 204, 204);"&gt;Form &lt;/span&gt;frm)&lt;br /&gt;        {&lt;br /&gt;            &lt;span style="color: rgb(0, 204, 204);"&gt;SingleInstanceApplication&lt;/span&gt;.Run(frm, frm.Text);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: rgb(51, 102, 255);"&gt;public static void&lt;/span&gt; Run(&lt;span style="color: rgb(0, 204, 204);"&gt;Form &lt;/span&gt;frm, &lt;span style="color: rgb(51, 102, 255);"&gt;string &lt;/span&gt;caption)&lt;br /&gt;        {&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;            // On créer un mutex avec un nom qui nous sert de référence.&lt;/span&gt;&lt;br /&gt;            &lt;span style="color: rgb(0, 204, 204);"&gt;IntPtr &lt;/span&gt;MtxHandle = CreateMutex(&lt;span style="color: rgb(0, 204, 204);"&gt;IntPtr&lt;/span&gt;.Zero,&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;                               true&lt;/span&gt;, &lt;span style="color: rgb(0, 204, 204);"&gt;Assembly&lt;/span&gt;.GetExecutingAssembly().GetName().Name);&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;            // Si le mutex existe déjà on récupère le focus sur&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;            // l'application existante par son nom (caption)&lt;/span&gt;&lt;br /&gt;            &lt;span style="color: rgb(51, 102, 255);"&gt;if &lt;/span&gt;(&lt;span style="color: rgb(0, 204, 204);"&gt;Marshal&lt;/span&gt;.GetLastWin32Error() == &lt;span style="color: rgb(0, 204, 204);"&gt;SingleInstanceApplication&lt;/span&gt;.ALREADY_EXISTS)&lt;br /&gt;                SetForegroundWindow(FindWindow(&lt;span style="color: rgb(51, 102, 255);"&gt;null&lt;/span&gt;, caption));&lt;br /&gt;            &lt;span style="color: rgb(51, 102, 255);"&gt;else&lt;/span&gt;&lt;br /&gt;                &lt;span style="color: rgb(0, 204, 204);"&gt;Application&lt;/span&gt;.Run(frm);&lt;span style="color: rgb(0, 153, 0);"&gt; // Sinon on lance la forme&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;            // On libère le mutex&lt;/span&gt;&lt;br /&gt;            ReleaseMutex(MtxHandle);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: rgb(51, 102, 255);"&gt;private const int&lt;/span&gt; ALREADY_EXISTS = 183;&lt;br /&gt;    }&lt;br /&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6238714725528798977-8636763758067960440?l=johannes-fetz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johannes-fetz.blogspot.com/feeds/8636763758067960440/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://johannes-fetz.blogspot.com/2009/08/instance-unique-dun-programme-sous.html#comment-form' title='1 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6238714725528798977/posts/default/8636763758067960440'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6238714725528798977/posts/default/8636763758067960440'/><link rel='alternate' type='text/html' href='http://johannes-fetz.blogspot.com/2009/08/instance-unique-dun-programme-sous.html' title='Instance unique d&apos;un programme sous windows CE en C#'/><author><name>Johannes Fetz</name><uri>http://www.blogger.com/profile/06529824680182774898</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://1.bp.blogspot.com/_hm-8HpFJuDs/TG-yB2CwfoI/AAAAAAAAAH0/1zpAykiGiVA/S220/fetz_j.PNG'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6238714725528798977.post-8599309131702707822</id><published>2009-08-03T01:45:00.000-07:00</published><updated>2009-08-03T01:55:26.301-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mobile'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Détecter la plateforme Mobile de l'application en C#</title><content type='html'>&lt;span style="color: rgb(204, 51, 204);font-family:courier new;" &gt;//Reference: Microsoft.WindowsCE.Forms&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;using&lt;/span&gt; Microsoft.WindowsCE.Forms;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(153, 153, 153);font-family:courier new;" &gt;/// &lt;summary&gt;&lt;/summary&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(153, 153, 153);font-family:courier new;" &gt;/// &lt;span style="color: rgb(0, 153, 0);"&gt;Renvoie: &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 153, 0);font-family:courier new;" &gt;WinCEGeneric, Smartphone ou PocketPC&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(153, 153, 153);font-family:courier new;" &gt;/// &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;public static&lt;/span&gt; &lt;span style="color: rgb(0, 204, 204);"&gt;WinCEPlatform &lt;/span&gt;GetPlatformTarget()&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;&amp;nbsp;&amp;nbsp&amp;nbsp;return&lt;/span&gt; (SystemSettings.&lt;span style="color: rgb(0, 204, 204);"&gt;Platform&lt;/span&gt;);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;}&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6238714725528798977-8599309131702707822?l=johannes-fetz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johannes-fetz.blogspot.com/feeds/8599309131702707822/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://johannes-fetz.blogspot.com/2009/08/detecter-la-plateforme-mobile-de.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6238714725528798977/posts/default/8599309131702707822'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6238714725528798977/posts/default/8599309131702707822'/><link rel='alternate' type='text/html' href='http://johannes-fetz.blogspot.com/2009/08/detecter-la-plateforme-mobile-de.html' title='Détecter la plateforme Mobile de l&apos;application en C#'/><author><name>Johannes Fetz</name><uri>http://www.blogger.com/profile/06529824680182774898</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://1.bp.blogspot.com/_hm-8HpFJuDs/TG-yB2CwfoI/AAAAAAAAAH0/1zpAykiGiVA/S220/fetz_j.PNG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6238714725528798977.post-8500131363699515350</id><published>2009-07-31T11:50:00.000-07:00</published><updated>2009-07-31T12:02:42.968-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Shell'/><title type='text'>Re-coder une version simplifiée de la commande "cut" en script sh</title><content type='html'>&lt;pre&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;#&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;# Usage   : simple_cut &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;&amp;lt;chaine&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt; &lt;/span&gt;&lt;span&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;&amp;lt;separateur&amp;gt;&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;&amp;lt;colonne&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;&lt;br /&gt;#&lt;/span&gt;&lt;br /&gt;simple_cut()&lt;br /&gt;{&lt;br /&gt;   sep=&lt;span style="color: rgb(204, 0, 0);"&gt;`echo -e "\006"`&lt;/span&gt;&lt;br /&gt;   &lt;span style="color: rgb(51, 51, 255);"&gt;echo&lt;/span&gt; -n &lt;span style="color: rgb(204, 0, 0);"&gt;`echo -n $1 | tr "\n" $sep | tr $2 "\n" | head -n $3 | tail -n 1 | tr $sep "\n"`&lt;/span&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6238714725528798977-8500131363699515350?l=johannes-fetz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johannes-fetz.blogspot.com/feeds/8500131363699515350/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://johannes-fetz.blogspot.com/2009/07/re-coder-une-version-simplifiee-de-la.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6238714725528798977/posts/default/8500131363699515350'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6238714725528798977/posts/default/8500131363699515350'/><link rel='alternate' type='text/html' href='http://johannes-fetz.blogspot.com/2009/07/re-coder-une-version-simplifiee-de-la.html' title='Re-coder une version simplifiée de la commande &quot;cut&quot; en script sh'/><author><name>Johannes Fetz</name><uri>http://www.blogger.com/profile/06529824680182774898</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://1.bp.blogspot.com/_hm-8HpFJuDs/TG-yB2CwfoI/AAAAAAAAAH0/1zpAykiGiVA/S220/fetz_j.PNG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6238714725528798977.post-1651675982403003334</id><published>2009-07-31T11:22:00.000-07:00</published><updated>2009-07-31T11:39:07.580-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Obtenir le chemin du Répertoire de l'application sur un PDA en C#</title><content type='html'>&lt;pre&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;using&lt;/span&gt; System.Reflection;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;using&lt;/span&gt; System.IO;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;namespace&lt;/span&gt; Tools&lt;br /&gt;{&lt;br /&gt;  &lt;span style="color: rgb(0, 153, 0);"&gt; public&lt;/span&gt; &lt;span style="color: rgb(0, 153, 0);"&gt;static&lt;/span&gt; &lt;span style="color: rgb(51, 102, 255);"&gt;class&lt;/span&gt; PDATool&lt;br /&gt;   {&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;        #region Property&lt;/span&gt;&lt;br /&gt;     &lt;br /&gt;       &lt;span style="color: rgb(0, 153, 0);"&gt; public&lt;/span&gt; &lt;span style="color: rgb(0, 153, 0);"&gt;static&lt;/span&gt; &lt;span style="color: rgb(51, 102, 255);"&gt;string&lt;/span&gt; ApplicationDirectory&lt;br /&gt;        {&lt;br /&gt;           &lt;span style="color: rgb(255, 102, 0);"&gt;get&lt;/span&gt;&lt;br /&gt;           {&lt;br /&gt;               &lt;span style="color: rgb(255, 102, 0);"&gt;if&lt;/span&gt; (PDATool._Path == &lt;span style="color: rgb(51, 51, 255);"&gt;null&lt;/span&gt;) &lt;span style="color: rgb(204, 51, 204);"&gt;// On calcul la première fois le chemin.&lt;/span&gt;&lt;br /&gt;                   PDATool._Path = Path.GetDirectoryName(Assembly.GetExecutingAssembly().&lt;br /&gt;                                                         GetName().CodeBase);&lt;br /&gt;               &lt;span style="color: rgb(255, 102, 0);"&gt;return&lt;/span&gt; (PDATool._Path);&lt;br /&gt;           }&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;        #endregion&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;        #region Attribut&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;        // On conserve une le chemin pour éviter de le recalculer à chaque fois.&lt;/span&gt;&lt;br /&gt;       &lt;span style="color: rgb(0, 153, 0);"&gt; private&lt;/span&gt; &lt;span style="color: rgb(0, 153, 0);"&gt;static&lt;/span&gt; &lt;span style="color: rgb(51, 102, 255);"&gt;string&lt;/span&gt; _Path = &lt;span style="color: rgb(51, 51, 255);"&gt;null&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;        #endregion&lt;/span&gt;&lt;br /&gt;   }&lt;br /&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6238714725528798977-1651675982403003334?l=johannes-fetz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johannes-fetz.blogspot.com/feeds/1651675982403003334/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://johannes-fetz.blogspot.com/2009/07/obtenir-le-chemin-du-repertoire-de.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6238714725528798977/posts/default/1651675982403003334'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6238714725528798977/posts/default/1651675982403003334'/><link rel='alternate' type='text/html' href='http://johannes-fetz.blogspot.com/2009/07/obtenir-le-chemin-du-repertoire-de.html' title='Obtenir le chemin du Répertoire de l&apos;application sur un PDA en C#'/><author><name>Johannes Fetz</name><uri>http://www.blogger.com/profile/06529824680182774898</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://1.bp.blogspot.com/_hm-8HpFJuDs/TG-yB2CwfoI/AAAAAAAAAH0/1zpAykiGiVA/S220/fetz_j.PNG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6238714725528798977.post-7237665589646405556</id><published>2009-07-30T15:38:00.000-07:00</published><updated>2009-07-30T15:49:47.926-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>Obtenir des statistiques sur la mémoire sous windows en C/C++</title><content type='html'>&lt;pre&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;#include &amp;lt;windows.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;void&lt;/span&gt;           getMemoryUsage(&lt;span style="color: rgb(51, 102, 255);"&gt;unsigned&lt;/span&gt; &lt;span style="color: rgb(51, 102, 255);"&gt;long&lt;/span&gt; *total,&lt;br /&gt;               &lt;span style="color: rgb(51, 102, 255);"&gt;unsigned&lt;/span&gt; &lt;span style="color: rgb(51, 102, 255);"&gt;long&lt;/span&gt; *avail,&lt;br /&gt;               &lt;span style="color: rgb(51, 102, 255);"&gt;float&lt;/span&gt; *usage,&lt;br /&gt;               &lt;span style="color: rgb(51, 102, 255);"&gt;unsigned&lt;/span&gt; &lt;span style="color: rgb(51, 102, 255);"&gt;long&lt;/span&gt; *virt_total,&lt;br /&gt;               &lt;span style="color: rgb(51, 102, 255);"&gt;unsigned&lt;/span&gt; &lt;span style="color: rgb(51, 102, 255);"&gt;long&lt;/span&gt; *virt_avail)&lt;br /&gt;{&lt;br /&gt;   MEMORYSTATUSEX   statex;&lt;br /&gt;&lt;br /&gt;   statex.dwLength = sizeof(statex);&lt;br /&gt;   GlobalMemoryStatusEx(&amp;amp;statex);&lt;br /&gt;   &lt;span style="color: rgb(255, 102, 0);"&gt;if&lt;/span&gt; (total != NULL) &lt;/span&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;&lt;span style="font-family:courier new;"&gt;// mémoire physique totale&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;     *total = (&lt;span style="color: rgb(51, 102, 255);"&gt;unsigned&lt;/span&gt; &lt;span style="color: rgb(51, 102, 255);"&gt;long&lt;/span&gt;)(statex.ullTotalPhys / 1024);&lt;br /&gt;   &lt;span style="color: rgb(255, 102, 0);"&gt;if&lt;/span&gt; (avail != NULL)&lt;/span&gt;&lt;span style="font-family:courier new;"&gt; &lt;/span&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;&lt;span style="font-family:courier new;"&gt;// mémoire &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-family:courier new;"&gt;physique disponible&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;      *avail = (&lt;span style="color: rgb(51, 102, 255);"&gt;unsigned&lt;/span&gt; &lt;span style="color: rgb(51, 102, 255);"&gt;long&lt;/span&gt;)(statex.ullAvailPhys / 1024);&lt;br /&gt;   &lt;span style="color: rgb(255, 102, 0);"&gt;if&lt;/span&gt; (usage != NULL)&lt;/span&gt;&lt;span style="font-family:courier new;"&gt; &lt;/span&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;&lt;span style="font-family:courier new;"&gt;// pourcentage d'utilisation de la mémoire &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-family:courier new;"&gt;physique&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;      *usage = (&lt;span style="color: rgb(51, 102, 255);"&gt;float&lt;/span&gt;)(statex.dwMemoryLoad);&lt;br /&gt;   &lt;span style="color: rgb(255, 102, 0);"&gt;if&lt;/span&gt; (virt_total != NULL) &lt;span style="color: rgb(204, 51, 204);"&gt;// mémoire virtuelle totale&lt;/span&gt;&lt;br /&gt;      *virt_total = (&lt;span style="color: rgb(51, 102, 255);"&gt;unsigned&lt;/span&gt; &lt;span style="color: rgb(51, 102, 255);"&gt;long&lt;/span&gt;)(statex.ullTotalVirtual / 1024);&lt;br /&gt;   &lt;span style="color: rgb(255, 102, 0);"&gt;if&lt;/span&gt; (virt_avail != NULL) &lt;/span&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;&lt;span style="font-family:courier new;"&gt;// mémoire virtuelle disponible&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:courier new;"&gt;&lt;br /&gt;     *virt_avail = (&lt;span style="color: rgb(51, 102, 255);"&gt;unsigned&lt;/span&gt; &lt;span style="color: rgb(51, 102, 255);"&gt;long&lt;/span&gt;)(statex.ullAvailVirtual / 1024);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6238714725528798977-7237665589646405556?l=johannes-fetz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johannes-fetz.blogspot.com/feeds/7237665589646405556/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://johannes-fetz.blogspot.com/2009/07/obtenir-des-statistiques-sur-la-memoire.html#comment-form' title='2 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6238714725528798977/posts/default/7237665589646405556'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6238714725528798977/posts/default/7237665589646405556'/><link rel='alternate' type='text/html' href='http://johannes-fetz.blogspot.com/2009/07/obtenir-des-statistiques-sur-la-memoire.html' title='Obtenir des statistiques sur la mémoire sous windows en C/C++'/><author><name>Johannes Fetz</name><uri>http://www.blogger.com/profile/06529824680182774898</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://1.bp.blogspot.com/_hm-8HpFJuDs/TG-yB2CwfoI/AAAAAAAAAH0/1zpAykiGiVA/S220/fetz_j.PNG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6238714725528798977.post-3860835409943224488</id><published>2009-07-30T15:35:00.000-07:00</published><updated>2009-07-30T15:37:55.347-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>Obtenir le nombre de processeur physique sous windows en C/C++</title><content type='html'>&lt;pre&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;#include &amp;lt;windows.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;unsigned&lt;/span&gt; &lt;span style="color: rgb(51, 102, 255);"&gt;int&lt;/span&gt;         getCPUcount(&lt;span style="color: rgb(51, 102, 255);"&gt;void&lt;/span&gt;)&lt;br /&gt;{&lt;br /&gt;   SYSTEM_INFO      sysinfo;&lt;br /&gt;&lt;br /&gt;   GetSystemInfo(&amp;amp;sysinfo);&lt;br /&gt;   &lt;span style="color: rgb(255, 102, 0);"&gt;return&lt;/span&gt; ((&lt;span style="color: rgb(51, 102, 255);"&gt;unsigned&lt;/span&gt; &lt;span style="color: rgb(51, 102, 255);"&gt;int&lt;/span&gt;)sysinfo.dwNumberOfProcessors);&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6238714725528798977-3860835409943224488?l=johannes-fetz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johannes-fetz.blogspot.com/feeds/3860835409943224488/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://johannes-fetz.blogspot.com/2009/07/obtenir-le-nombre-de-processeur.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6238714725528798977/posts/default/3860835409943224488'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6238714725528798977/posts/default/3860835409943224488'/><link rel='alternate' type='text/html' href='http://johannes-fetz.blogspot.com/2009/07/obtenir-le-nombre-de-processeur.html' title='Obtenir le nombre de processeur physique sous windows en C/C++'/><author><name>Johannes Fetz</name><uri>http://www.blogger.com/profile/06529824680182774898</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://1.bp.blogspot.com/_hm-8HpFJuDs/TG-yB2CwfoI/AAAAAAAAAH0/1zpAykiGiVA/S220/fetz_j.PNG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6238714725528798977.post-2523304514413506615</id><published>2009-07-26T07:44:00.000-07:00</published><updated>2009-07-30T14:52:00.519-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='webcast'/><category scheme='http://www.blogger.com/atom/ns#' term='multithreading'/><title type='text'>Think In Parallel - Episode 1</title><content type='html'>&lt;pre style="font-family: arial;"&gt;Bonjour,&lt;br /&gt;&lt;br /&gt;Voici le tout premier webcast, de la saga sur le multithreading.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;object width="640" height="480" class="BLOG_video_class" id="BLOG_video-a7b18c9404b73aea" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"&gt;&lt;param name="movie" value="http://www.youtube.com/get_player"&gt;&lt;param name="bgcolor" value="#FFFFFF"&gt;&lt;param name="allowfullscreen" value="true"&gt;&lt;param name="flashvars" value="flvurl=http://v3.nonxt2.googlevideo.com/videoplayback?id%3Da7b18c9404b73aea%26itag%3D5%26app%3Dblogger%26ip%3D0.0.0.0%26ipbits%3D0%26expire%3D1330350216%26sparams%3Did,itag,ip,ipbits,expire%26signature%3D1AE59B24C20CFA72654F71BDDD4BE3F8A3D166F7.59EEE06143319D8E6E91AC2223FAB98F32F09D68%26key%3Dck1&amp;amp;iurl=http://video.google.com/ThumbnailServer2?app%3Dblogger%26contentid%3Da7b18c9404b73aea%26offsetms%3D5000%26itag%3Dw160%26sigh%3DhD-hWHi2eEMY2p8DfSudkl6ptIU&amp;amp;autoplay=0&amp;amp;ps=blogger"&gt;&lt;embed src="http://www.youtube.com/get_player" type="application/x-shockwave-flash"width="640" height="480" bgcolor="#FFFFFF"flashvars="flvurl=http://v3.nonxt2.googlevideo.com/videoplayback?id%3Da7b18c9404b73aea%26itag%3D5%26app%3Dblogger%26ip%3D0.0.0.0%26ipbits%3D0%26expire%3D1330350216%26sparams%3Did,itag,ip,ipbits,expire%26signature%3D1AE59B24C20CFA72654F71BDDD4BE3F8A3D166F7.59EEE06143319D8E6E91AC2223FAB98F32F09D68%26key%3Dck1&amp;iurl=http://video.google.com/ThumbnailServer2?app%3Dblogger%26contentid%3Da7b18c9404b73aea%26offsetms%3D5000%26itag%3Dw160%26sigh%3DhD-hWHi2eEMY2p8DfSudkl6ptIU&amp;autoplay=0&amp;ps=blogger"allowFullScreen="true" /&gt;&lt;/object&gt;&lt;br /&gt;&lt;pre style="font-family: arial;"&gt;&lt;br /&gt;Pour plus d'information sur le CSP, voir &lt;a href="http://www.usingcsp.com/"&gt;ici&lt;/a&gt;&lt;br /&gt;Page Wikipédia de Sir Charles Antony Richard Hoare : &lt;a href="http://en.wikipedia.org/wiki/C._A._R._Hoare"&gt;ici&lt;/a&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6238714725528798977-2523304514413506615?l=johannes-fetz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='enclosure' type='video/mp4' href='http://www.blogger.com/video-play.mp4?contentId=a7b18c9404b73aea&amp;type=video%2Fmp4' length='0'/><link rel='replies' type='application/atom+xml' href='http://johannes-fetz.blogspot.com/feeds/2523304514413506615/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://johannes-fetz.blogspot.com/2009/07/think-in-parallel-episode-1.html#comment-form' title='4 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6238714725528798977/posts/default/2523304514413506615'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6238714725528798977/posts/default/2523304514413506615'/><link rel='alternate' type='text/html' href='http://johannes-fetz.blogspot.com/2009/07/think-in-parallel-episode-1.html' title='Think In Parallel - Episode 1'/><author><name>Johannes Fetz</name><uri>http://www.blogger.com/profile/06529824680182774898</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://1.bp.blogspot.com/_hm-8HpFJuDs/TG-yB2CwfoI/AAAAAAAAAH0/1zpAykiGiVA/S220/fetz_j.PNG'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6238714725528798977.post-7353574874750831339</id><published>2009-07-23T13:09:00.000-07:00</published><updated>2009-07-23T13:17:16.632-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Compiler et exécuter du code en C#</title><content type='html'>&lt;pre&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;using&lt;/span&gt; System;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;using&lt;/span&gt; System.CodeDom.Compiler;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;using&lt;/span&gt; System.Diagnostics;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;public&lt;/span&gt; &lt;span style="color: rgb(51, 102, 255);"&gt;class&lt;/span&gt; MicroCompiler&lt;br /&gt;{&lt;br /&gt;   &lt;span style="color: rgb(0, 153, 0);"&gt;public&lt;/span&gt; MicroCompiler()&lt;br /&gt;   {&lt;br /&gt;       &lt;span style="color: rgb(204, 0, 0);"&gt;this&lt;/span&gt;.Language = &lt;span style="color: rgb(204, 0, 0);"&gt;"CSharp"&lt;/span&gt;;&lt;br /&gt;       &lt;span style="color: rgb(204, 0, 0);"&gt;this&lt;/span&gt;.WarningLevel = 1;&lt;br /&gt;       &lt;span style="color: rgb(204, 0, 0);"&gt;this&lt;/span&gt;.OutputPath = &lt;span style="color: rgb(204, 0, 0);"&gt;"./~TMP.exe"&lt;/span&gt;;&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   &lt;span style="color: rgb(0, 153, 0);"&gt;public&lt;/span&gt; &lt;span style="color: rgb(51, 102, 255);"&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;bool&lt;/span&gt;&lt;/span&gt; Compile()&lt;br /&gt;   {&lt;br /&gt;       &lt;span style="color: rgb(204, 0, 0);"&gt;this&lt;/span&gt;.Result = &lt;span style="color: rgb(51, 102, 255);"&gt;string&lt;/span&gt;.Empty;&lt;br /&gt;       &lt;span style="color: rgb(204, 0, 0);"&gt;this&lt;/span&gt;.KillCompiledProgram();&lt;br /&gt;       &lt;span style="color: rgb(0, 153, 0);"&gt;using&lt;/span&gt; (CodeDomProvider codeProvider = CodeDomProvider.CreateProvider(&lt;span style="color: rgb(204, 0, 0);"&gt;this&lt;/span&gt;.Language))&lt;br /&gt;       {&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;&lt;span style="font-family:courier new;"&gt;           // Paramètres de la compilation&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;           CompilerParameters parameters = &lt;span style="color: rgb(255, 102, 0);"&gt;new&lt;/span&gt; CompilerParameters();&lt;br /&gt;           parameters.GenerateExecutable = true;&lt;br /&gt;           parameters.GenerateInMemory = false;&lt;br /&gt;           parameters.WarningLevel = &lt;span style="color: rgb(204, 0, 0);"&gt;this&lt;/span&gt;.WarningLevel;&lt;br /&gt;           parameters.OutputAssembly = &lt;span style="color: rgb(204, 0, 0);"&gt;this&lt;/span&gt;.OutputPath;&lt;br /&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;           // on compile&lt;/span&gt;&lt;br /&gt;           CompilerResults results = codeProvider.CompileAssemblyFromSource(parameters,&lt;br /&gt;                                                        &lt;span style="color: rgb(255, 102, 0);"&gt;new&lt;/span&gt; &lt;span style="color: rgb(51, 102, 255);"&gt;string&lt;/span&gt;[] { &lt;span style="color: rgb(204, 0, 0);"&gt;this&lt;/span&gt;.Source });&lt;br /&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;           // est ce qu'il y a des erreurs ?&lt;/span&gt;&lt;br /&gt;           &lt;span style="color: rgb(255, 102, 0);"&gt;if&lt;/span&gt; (results.Errors.Count &amp;gt; 0)&lt;br /&gt;           {&lt;br /&gt;               &lt;span style="color: rgb(255, 102, 0);"&gt;foreach&lt;/span&gt; (CompilerError CompErr &lt;span style="color: rgb(255, 102, 0);"&gt;in&lt;/span&gt; results.Errors)&lt;br /&gt;                   &lt;span style="color: rgb(204, 0, 0);"&gt;this&lt;/span&gt;.Result += &lt;span style="color: rgb(204, 0, 0);"&gt;"Line: "&lt;/span&gt; + CompErr.Line + &lt;span style="color: rgb(204, 0, 0);"&gt;" : "&lt;/span&gt; + CompErr.ErrorNumber +&lt;br /&gt;                               &lt;span style="color: rgb(204, 0, 0);"&gt;" =&amp;gt; "&lt;/span&gt; + CompErr.ErrorText + Environment.NewLine;&lt;br /&gt;               &lt;span style="color: rgb(255, 102, 0);"&gt;return&lt;/span&gt; (false);&lt;br /&gt;           }&lt;br /&gt;       }&lt;br /&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;       // on créer le processus pour éxecuter le code&lt;/span&gt;&lt;br /&gt;       &lt;span style="color: rgb(204, 0, 0);"&gt;this&lt;/span&gt;.CompiledProgram = &lt;span style="color: rgb(255, 102, 0);"&gt;new&lt;/span&gt; Process();&lt;br /&gt;       &lt;span style="color: rgb(204, 0, 0);"&gt;this&lt;/span&gt;.CompiledProgram.StartInfo.FileName = &lt;span style="color: rgb(204, 0, 0);"&gt;this&lt;/span&gt;.OutputPath;&lt;br /&gt;       &lt;span style="color: rgb(255, 102, 0);"&gt;return&lt;/span&gt; (true);&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   &lt;span style="color: rgb(0, 153, 0);"&gt;public&lt;/span&gt; &lt;span style="color: rgb(51, 102, 255);"&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;bool&lt;/span&gt;&lt;/span&gt; KillCompiledProgram()&lt;br /&gt;   {&lt;br /&gt;       &lt;span style="color: rgb(255, 102, 0);"&gt;if&lt;/span&gt; (&lt;span style="color: rgb(204, 0, 0);"&gt;this&lt;/span&gt;.CompiledProgram == null || &lt;span style="color: rgb(204, 0, 0);"&gt;this&lt;/span&gt;.CompiledProgram.HasExited)&lt;br /&gt;           &lt;span style="color: rgb(255, 102, 0);"&gt;return&lt;/span&gt; (false);&lt;br /&gt;       &lt;span style="color: rgb(204, 0, 0);"&gt;this&lt;/span&gt;.CompiledProgram.Kill();&lt;br /&gt;       &lt;span style="color: rgb(255, 102, 0);"&gt;return&lt;/span&gt; (true);&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   &lt;span style="color: rgb(0, 153, 0);"&gt;public&lt;/span&gt; &lt;span style="color: rgb(51, 102, 255);"&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;bool&lt;/span&gt;&lt;/span&gt; StartCompiledProgram()&lt;br /&gt;   {&lt;br /&gt;       &lt;span style="color: rgb(255, 102, 0);"&gt;if&lt;/span&gt; (&lt;span style="color: rgb(204, 0, 0);"&gt;this&lt;/span&gt;.CompiledProgram == null)&lt;br /&gt;           &lt;span style="color: rgb(255, 102, 0);"&gt;return&lt;/span&gt; (false);&lt;br /&gt;       &lt;span style="color: rgb(255, 102, 0);"&gt;return&lt;/span&gt; (&lt;span style="color: rgb(204, 0, 0);"&gt;this&lt;/span&gt;.CompiledProgram.Start());&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;    #region Properties&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;&lt;/span&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;    // Niveau d'avertissement.&lt;/span&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;&lt;/span&gt;&lt;br /&gt;   &lt;span style="color: rgb(0, 153, 0);"&gt; public&lt;/span&gt; &lt;span style="color: rgb(51, 102, 255);"&gt;int&lt;/span&gt; WarningLevel { get; set; }&lt;br /&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;    // Emplacement du programme généré&lt;/span&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;&lt;/span&gt;&lt;br /&gt;   &lt;span style="color: rgb(0, 153, 0);"&gt; public&lt;/span&gt; &lt;span style="color: rgb(51, 102, 255);"&gt;string&lt;/span&gt; OutputPath { get; set; }&lt;br /&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;    // Résultat de la compilation&lt;/span&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;&lt;/span&gt;&lt;br /&gt;   &lt;span style="color: rgb(0, 153, 0);"&gt; public&lt;/span&gt; &lt;span style="color: rgb(51, 102, 255);"&gt;string&lt;/span&gt; Result { get; &lt;span style="color: rgb(0, 153, 0);"&gt;private&lt;/span&gt; set; }&lt;br /&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;    // Le code source&lt;/span&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;&lt;/span&gt;&lt;br /&gt;   &lt;span style="color: rgb(0, 153, 0);"&gt; public&lt;/span&gt; &lt;span style="color: rgb(51, 102, 255);"&gt;string&lt;/span&gt; Source { get; set; }&lt;br /&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;    // Langage de la source (ex: CSharp)&lt;/span&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;&lt;/span&gt;&lt;br /&gt;    &lt;span style="color: rgb(0, 153, 0);"&gt;public&lt;/span&gt; &lt;span style="color: rgb(51, 102, 255);"&gt;string&lt;/span&gt; Language { get; set; }&lt;br /&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;    // Instance du programme en exécution. &lt;/span&gt;&lt;br /&gt;   &lt;span style="color: rgb(0, 153, 0);"&gt; public&lt;/span&gt; Process CompiledProgram { get; &lt;span style="color: rgb(0, 153, 0);"&gt;private&lt;/span&gt; set; }&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;    #endregion&lt;/span&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;namespace&lt;/span&gt; Test&lt;br /&gt;{&lt;br /&gt;   &lt;span style="color: rgb(51, 102, 255);"&gt;class&lt;/span&gt; Program&lt;br /&gt;   {&lt;br /&gt;       &lt;span style="color: rgb(0, 153, 0);"&gt;static&lt;/span&gt; &lt;span style="color: rgb(51, 102, 255);"&gt;void&lt;/span&gt; Main(&lt;span style="color: rgb(51, 102, 255);"&gt;string&lt;/span&gt;[] args)&lt;br /&gt;       {&lt;br /&gt;           MicroCompiler mc = &lt;span style="color: rgb(255, 102, 0);"&gt;new&lt;/span&gt; MicroCompiler();&lt;br /&gt;           mc.Source = &lt;span style="color: rgb(204, 0, 0);"&gt;"mettre le code C# ici!"&lt;/span&gt;;&lt;br /&gt;           &lt;span style="color: rgb(255, 102, 0);"&gt;if&lt;/span&gt; (mc.Compile())&lt;br /&gt;               mc.StartCompiledProgram();&lt;br /&gt;       }&lt;br /&gt;   }&lt;br /&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6238714725528798977-7353574874750831339?l=johannes-fetz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johannes-fetz.blogspot.com/feeds/7353574874750831339/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://johannes-fetz.blogspot.com/2009/07/compiler-et-executer-du-code-en-c.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6238714725528798977/posts/default/7353574874750831339'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6238714725528798977/posts/default/7353574874750831339'/><link rel='alternate' type='text/html' href='http://johannes-fetz.blogspot.com/2009/07/compiler-et-executer-du-code-en-c.html' title='Compiler et exécuter du code en C#'/><author><name>Johannes Fetz</name><uri>http://www.blogger.com/profile/06529824680182774898</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://1.bp.blogspot.com/_hm-8HpFJuDs/TG-yB2CwfoI/AAAAAAAAAH0/1zpAykiGiVA/S220/fetz_j.PNG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6238714725528798977.post-5189733197004158339</id><published>2009-07-23T12:16:00.000-07:00</published><updated>2009-07-23T12:19:38.722-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>vérifier si un fichier existe sous windows en C/C++</title><content type='html'>&lt;pre&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;#include &amp;lt;windows.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;int&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;__stdcall&lt;/span&gt;   FileExistsUnicode(&lt;span style="color: rgb(51, 102, 255);"&gt;wchar_t&lt;/span&gt; *fname)&lt;br /&gt;{&lt;br /&gt;   &lt;span style="color: rgb(255, 102, 0);"&gt;return&lt;/span&gt; ((&lt;span style="color: rgb(51, 102, 255);"&gt;long&lt;/span&gt;)GetFileAttributesW(fname) &amp;gt; 0);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;int&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;__stdcall&lt;/span&gt;   FileExistsAscii(&lt;span style="color: rgb(51, 102, 255);"&gt;char&lt;/span&gt; *fname)&lt;br /&gt;{&lt;br /&gt;   &lt;span style="color: rgb(255, 102, 0);"&gt;return&lt;/span&gt; ((&lt;span style="color: rgb(51, 102, 255);"&gt;long&lt;/span&gt;)GetFileAttributesA(fname) &amp;gt; 0);&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6238714725528798977-5189733197004158339?l=johannes-fetz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johannes-fetz.blogspot.com/feeds/5189733197004158339/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://johannes-fetz.blogspot.com/2009/07/verifier-si-un-fichier-existe-sous.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6238714725528798977/posts/default/5189733197004158339'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6238714725528798977/posts/default/5189733197004158339'/><link rel='alternate' type='text/html' href='http://johannes-fetz.blogspot.com/2009/07/verifier-si-un-fichier-existe-sous.html' title='vérifier si un fichier existe sous windows en C/C++'/><author><name>Johannes Fetz</name><uri>http://www.blogger.com/profile/06529824680182774898</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://1.bp.blogspot.com/_hm-8HpFJuDs/TG-yB2CwfoI/AAAAAAAAAH0/1zpAykiGiVA/S220/fetz_j.PNG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6238714725528798977.post-1305759433042671476</id><published>2009-07-22T12:05:00.000-07:00</published><updated>2009-07-22T12:17:20.282-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C'/><title type='text'>Utiliser le presse-papier de Windows en C/C++</title><content type='html'>&lt;pre&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;#include &amp;lt;windows.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;#include &amp;lt;stdlib.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;#include &amp;lt;string.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;#include &amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;int&lt;/span&gt;           copy_to_clipboard(&lt;span style="color: rgb(51, 102, 255);"&gt;char const&lt;/span&gt; *str)&lt;br /&gt;{&lt;br /&gt;  HGLOBAL     clipbuffer;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;  char&lt;/span&gt;        *buffer;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;  // On ouvre le presse-papier&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 102, 0);"&gt;  if&lt;/span&gt; (!OpenClipboard(NULL))&lt;br /&gt;    &lt;span style="color: rgb(255, 102, 0);"&gt;return&lt;/span&gt; (0);&lt;br /&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;  // on vide le presse-papier&lt;/span&gt;&lt;br /&gt;  EmptyClipboard();&lt;br /&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;  // on alloue la mémoire nécéssaire&lt;/span&gt;&lt;br /&gt;  clipbuffer = GlobalAlloc(GMEM_DDESHARE, strlen(str) + 1);&lt;br /&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;  // on lock le buffer pour avoir un accès exclusif sur le presse-papier&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: rgb(255, 102, 0);"&gt;if&lt;/span&gt; ((buffer = (&lt;span style="color: rgb(51, 102, 255);"&gt;char &lt;/span&gt;*)GlobalLock(clipbuffer)) == NULL)&lt;br /&gt;  {&lt;br /&gt;     GlobalUnlock(clipbuffer);&lt;br /&gt;     CloseClipboard();&lt;br /&gt;     &lt;span style="color: rgb(255, 102, 0);"&gt;return&lt;/span&gt; (0);&lt;br /&gt;  }&lt;br /&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;  // On copie notre texte dans le presse-papier&lt;/span&gt;&lt;br /&gt;  strcpy(buffer, str);&lt;br /&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;  // On déverouille le presse-papier&lt;/span&gt;&lt;br /&gt;  GlobalUnlock(clipbuffer);&lt;br /&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;  // On met à jour le presse-papier&lt;/span&gt;&lt;br /&gt;  SetClipboardData(CF_TEXT, clipbuffer);&lt;br /&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;  // On ferme le presse-papier&lt;/span&gt;&lt;br /&gt;  CloseClipboard();&lt;br /&gt;&lt;span style="color: rgb(255, 102, 0);"&gt; return&lt;/span&gt; (1);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;char&lt;/span&gt;           *get_clipboard()&lt;br /&gt;{&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;  char&lt;/span&gt;         *buffer;&lt;br /&gt;  HANDLE       hData;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;  // On ouvre le presse-papier&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: rgb(255, 102, 0);"&gt;if&lt;/span&gt; (!OpenClipboard(NULL))&lt;br /&gt;     &lt;span style="color: rgb(255, 102, 0);"&gt;return&lt;/span&gt; (NULL);&lt;br /&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;  // On recupère le "handle" du presse-papier en mode texte&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: rgb(255, 102, 0);"&gt;if&lt;/span&gt; ((hData = GetClipboardData(CF_TEXT)) == NULL)&lt;br /&gt;     &lt;span style="color: rgb(255, 102, 0);"&gt;return&lt;/span&gt; (NULL);&lt;br /&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;  // On récupère via le "handle" le presse-papier&lt;/span&gt;&lt;br /&gt;  &lt;span style="color: rgb(204, 0, 0);"&gt;if&lt;/span&gt; ((buffer = (&lt;span style="color: rgb(51, 102, 255);"&gt;char&lt;/span&gt; *)GlobalLock(hData)) == NULL)&lt;br /&gt;     &lt;span style="color: rgb(255, 102, 0);"&gt;return&lt;/span&gt; (NULL);&lt;br /&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;  // On déverouille le presse-papier&lt;/span&gt;&lt;br /&gt;  GlobalUnlock(hData);&lt;br /&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;  // On ferme le presse-papier&lt;/span&gt;&lt;br /&gt;  CloseClipboard();&lt;br /&gt;&lt;span style="color: rgb(255, 102, 0);"&gt;  return&lt;/span&gt; (buffer);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;int&lt;/span&gt;      main(&lt;span style="color: rgb(51, 102, 255);"&gt;int&lt;/span&gt; argc, &lt;span style="color: rgb(51, 102, 255);"&gt;char&lt;/span&gt; **argv)&lt;br /&gt;{&lt;br /&gt;  copy_to_clipboard(&lt;span style="color: rgb(204, 0, 0);"&gt;"ma chaine"&lt;/span&gt;);&lt;br /&gt;  printf(&lt;span style="color: rgb(204, 0, 0);"&gt;"%s\n"&lt;/span&gt;, get_clipboard());&lt;br /&gt;  getchar();&lt;br /&gt;  return (EXIT_SUCCESS);&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6238714725528798977-1305759433042671476?l=johannes-fetz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johannes-fetz.blogspot.com/feeds/1305759433042671476/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://johannes-fetz.blogspot.com/2009/07/utiliser-le-presse-papier-de-windows.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6238714725528798977/posts/default/1305759433042671476'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6238714725528798977/posts/default/1305759433042671476'/><link rel='alternate' type='text/html' href='http://johannes-fetz.blogspot.com/2009/07/utiliser-le-presse-papier-de-windows.html' title='Utiliser le presse-papier de Windows en C/C++'/><author><name>Johannes Fetz</name><uri>http://www.blogger.com/profile/06529824680182774898</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://1.bp.blogspot.com/_hm-8HpFJuDs/TG-yB2CwfoI/AAAAAAAAAH0/1zpAykiGiVA/S220/fetz_j.PNG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6238714725528798977.post-5898887823593024826</id><published>2009-07-21T04:27:00.000-07:00</published><updated>2009-07-21T05:00:46.627-07:00</updated><title type='text'>Embarquer une image dans une page HTML</title><content type='html'>&lt;pre&gt;Aujourd'hui nous allons voir comment embarquer une image dans une page HTML.&lt;br /&gt;Pour cela nous avons besoin d'une image quelconque au format gif(ou autre chose),&lt;br /&gt;d'un encodeur en base 64 et d'une minute.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;1&lt;/span&gt;)allez sur le site : &lt;a href="http://www.motobit.com/util/base64-decoder-encoder.asp"&gt;http://www.motobit.com/util/base64-decoder-encoder.asp&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;2&lt;/span&gt;)Sélectionnez une image et encodez-la en base 64.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;3&lt;/span&gt;)Créez une page HTML comme ci-dessous:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;html&amp;gt;&lt;br /&gt;  &amp;lt;head&amp;gt;&lt;br /&gt;     &amp;lt;title&amp;gt;Image embarquée&amp;lt;/title&amp;gt;&lt;br /&gt;  &amp;lt;/head&amp;gt;&lt;br /&gt;  &amp;lt;body&amp;gt;&lt;br /&gt;     &amp;lt;div style="text-align: center;"&amp;gt;&lt;br /&gt;        &amp;lt;img SRC="data:image/gif;base64,"ALT="Mon image"/&amp;gt;&lt;br /&gt;     &amp;lt;/div&amp;gt;&lt;br /&gt;  &amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;4&lt;/span&gt;)Insérez l'image encodée en base 64 après "base64,"&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;5&lt;/span&gt;)C'est fini!&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;/!\ Attention suivant les navigateurs l'image peut ne pas s'afficher!&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;Je déconseille par conséquent son utilisation, en production.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Le code ci-dessous affiche une petite étoile:&lt;br /&gt;____________________________________________________________________________&lt;br /&gt;&lt;br /&gt;&amp;lt;html&amp;gt;&lt;br /&gt; &amp;lt;head&amp;gt;&lt;br /&gt;    &amp;lt;title&amp;gt;Image embarquée&amp;lt;/title&amp;gt;&lt;br /&gt; &amp;lt;/head&amp;gt;&lt;br /&gt; &amp;lt;body&amp;gt;&lt;br /&gt;    &amp;lt;div style="text-align: center;"&amp;gt;&lt;br /&gt;       &amp;lt;img SRC="data:image/gif;base64,&lt;br /&gt;R0lGODlhEAAQAOZIAP/HYf+kP//IY/HTvfGsTsvDvvKsTerKtP/Xr6RqSvzfmfro2P7fm/3TqfS1&lt;br /&gt;e6dGDt6xlfKmSKNtTv7gnfWUNdZyINVxIP7Xg/y6aNV0I9t4JP3u4PbEheybTP759OuvfbRPDffK&lt;br /&gt;odBsHfGxbfzhov7ajf7hkvebOuzLs9FxIv7UefvhydNzI/uaN/W1ZemPOffl1v7pof+xZKaXjvb2&lt;br /&gt;9v/HYv7dhuvr6/7povPz89HR0e+SNcCGY/7Rb+Li4vn5+bl/XL5tPL2tpP7fpv7yvv+rRv+9WP+0&lt;br /&gt;T////wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA&lt;br /&gt;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA&lt;br /&gt;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5&lt;br /&gt;BAEAAEgALAAAAAAQABAAAAengEiCg4SFhkgIMgiHhQ0YQxgNjIIeFApEChQehhsrIQ4uMTgxLg4h&lt;br /&gt;KxuCCy8dIxwkJjYmJBwjHS8LSB8EFwwTJSo9KiUTDBcEH0gwFQYAAAICNdDOBhUwggMiEUbc3UYR&lt;br /&gt;IgOEKCxH5udHLCiFBylF7/BFKQeFEBkBASc7J/gZEIQ5eGhoYQFEEBAWWmgA4uOHoBtCEjyQUABJ&lt;br /&gt;AQkPEszQQWOSx4+DAgEAOw=="ALT="Mon image"/&amp;gt;&lt;br /&gt;    &amp;lt;/div&amp;gt;&lt;br /&gt; &amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6238714725528798977-5898887823593024826?l=johannes-fetz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johannes-fetz.blogspot.com/feeds/5898887823593024826/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://johannes-fetz.blogspot.com/2009/07/embarquer-une-image-dans-une-page-html.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6238714725528798977/posts/default/5898887823593024826'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6238714725528798977/posts/default/5898887823593024826'/><link rel='alternate' type='text/html' href='http://johannes-fetz.blogspot.com/2009/07/embarquer-une-image-dans-une-page-html.html' title='Embarquer une image dans une page HTML'/><author><name>Johannes Fetz</name><uri>http://www.blogger.com/profile/06529824680182774898</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://1.bp.blogspot.com/_hm-8HpFJuDs/TG-yB2CwfoI/AAAAAAAAAH0/1zpAykiGiVA/S220/fetz_j.PNG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6238714725528798977.post-400458065391865421</id><published>2009-07-20T09:16:00.000-07:00</published><updated>2009-07-20T23:35:09.066-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>gérer du code obsolète en C#</title><content type='html'>&lt;pre&gt;&lt;span style="font-family:courier new;"&gt;   Il arrive quelquefois que nous devions utiliser des composants&lt;br /&gt;dont certaines parties sont devenues obsolètes avec le temps.&lt;br /&gt;Malheureusement, il est parfois impossible (contrainte de temps&lt;br /&gt;et/ou d'argent) de refaire le code en intégralité. Ainsi, la&lt;br /&gt;plupart du temps nous en-capsulons les anciens composants dans&lt;br /&gt;de nouveaux.&lt;br /&gt;&lt;br /&gt;Seulement comment interdire l'accès aux propriétés obsolètes&lt;br /&gt;de la classe de base et les remplacer par de nouvelles ?&lt;br /&gt;&lt;br /&gt;En réalité c'est assez simple. Cette problématique a été résolue&lt;br /&gt;Dans la &lt;span style="color: rgb(255, 0, 0);"&gt;version 2 du framework .Net&lt;/span&gt;. Il suffit d'utiliser l'attribut&lt;br /&gt;"&lt;span style="color: rgb(51, 102, 255);"&gt;Obsolete&lt;/span&gt;" et de "override" certaines propriétés.&lt;br /&gt;&lt;br /&gt;___________________________________________________________________&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;using&lt;/span&gt; System;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;namespace&lt;/span&gt; Test&lt;br /&gt;{&lt;br /&gt; &lt;span style="color: rgb(51, 102, 255);"&gt;class&lt;/span&gt; A&lt;br /&gt; {&lt;br /&gt;     &lt;span style="color: rgb(204, 51, 204);"&gt;// Rem: la class A peut toujours utiliser cette propriété.&lt;/span&gt;&lt;br /&gt;     &lt;span style="color: rgb(51, 102, 255);"&gt;public bool&lt;/span&gt; OldProperty { get; set; }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; &lt;span style="color: rgb(51, 102, 255);"&gt;class&lt;/span&gt; B : A&lt;br /&gt; {&lt;br /&gt;    &lt;span style="color: rgb(204, 51, 204);"&gt; // On indique au compilateur que la propriété est obsolète&lt;/span&gt;&lt;br /&gt;     [&lt;span style="color: rgb(51, 204, 255);"&gt;Obsolete&lt;/span&gt;(&lt;span style="color: rgb(204, 0, 0);"&gt;"utilisez NewProperty à la place."&lt;/span&gt;, &lt;span style="color: rgb(51, 102, 255);"&gt;true&lt;/span&gt;)]&lt;br /&gt;     &lt;span style="color: rgb(51, 102, 255);"&gt;public&lt;/span&gt; &lt;span style="color: rgb(255, 102, 0);"&gt;new&lt;/span&gt; b&lt;span style="color: rgb(51, 102, 255);"&gt;ool&lt;/span&gt; OldProperty { &lt;span style="color: rgb(51, 102, 255);"&gt;get&lt;/span&gt;; &lt;span style="color: rgb(51, 102, 255);"&gt;set&lt;/span&gt;; } &lt;span style="color: rgb(204, 51, 204);"&gt;// on "override" la propriété&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;     &lt;span style="color: rgb(51, 102, 255);"&gt;public bool&lt;/span&gt; NewProperty { &lt;span style="color: rgb(51, 102, 255);"&gt;get&lt;/span&gt;; &lt;span style="color: rgb(51, 102, 255);"&gt;set&lt;/span&gt;; }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; &lt;span style="color: rgb(51, 102, 255);"&gt;class &lt;/span&gt;Program&lt;br /&gt; {&lt;br /&gt;     &lt;span style="color: rgb(51, 102, 255);"&gt;static void &lt;/span&gt;Main(&lt;span style="color: rgb(51, 102, 255);"&gt;string&lt;/span&gt;[] args)&lt;br /&gt;     {&lt;br /&gt;         B test = &lt;span style="color: rgb(255, 102, 0);"&gt;new &lt;/span&gt;B();&lt;br /&gt;         test.NewProperty = true; &lt;span style="color: rgb(204, 51, 204);"&gt;// OK&lt;/span&gt;&lt;br /&gt;         test.OldProperty = true; &lt;span style="color: rgb(204, 51, 204);"&gt;// Provoque une erreur à la compilation&lt;/span&gt;&lt;br /&gt;     }&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6238714725528798977-400458065391865421?l=johannes-fetz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johannes-fetz.blogspot.com/feeds/400458065391865421/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://johannes-fetz.blogspot.com/2009/07/gerer-du-code-obsolete-en-c.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6238714725528798977/posts/default/400458065391865421'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6238714725528798977/posts/default/400458065391865421'/><link rel='alternate' type='text/html' href='http://johannes-fetz.blogspot.com/2009/07/gerer-du-code-obsolete-en-c.html' title='gérer du code obsolète en C#'/><author><name>Johannes Fetz</name><uri>http://www.blogger.com/profile/06529824680182774898</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://1.bp.blogspot.com/_hm-8HpFJuDs/TG-yB2CwfoI/AAAAAAAAAH0/1zpAykiGiVA/S220/fetz_j.PNG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6238714725528798977.post-580296449522946665</id><published>2009-07-19T10:49:00.000-07:00</published><updated>2009-07-19T12:24:13.402-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>C++, dynamic_cast et bibliothèque partagée sous  GCC (&gt;= 3.0)</title><content type='html'>&lt;pre&gt;&lt;span style="font-family:courier new;"&gt;   Jusqu'à la version 3.0, GCC utilisait la &lt;span style="font-weight: bold;"&gt;comparaison des noms&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;des symboles&lt;/span&gt; pour savoir si deux types étaient équivalent. Mais&lt;br /&gt;depuis la nouvelle ABI (application binary interface) il ne compare&lt;br /&gt;plus les noms, mais &lt;span style="font-weight: bold;"&gt;les adresses&lt;/span&gt;. Cela a pour but d'améliorer les performances.&lt;br /&gt;&lt;br /&gt; Ce choix technique ne pose aucun problème avec un "&lt;span style="font-style: italic;"&gt;linkage&lt;/span&gt;" statique,&lt;br /&gt;car le les adresses sont déterminées et connues du compilateur.&lt;br /&gt;Contrairement aux bibliothèques partagées (.dll, .so) qui&lt;br /&gt;requièrent une résolution des types à l'exécution (&lt;span style="font-style: italic;"&gt;runtime&lt;/span&gt;).&lt;br /&gt;&lt;br /&gt;  En effet si nous prenons en exemple une classe &lt;span style="color: rgb(255, 102, 0); font-weight: bold;"&gt;C&lt;/span&gt; qui&lt;br /&gt;implémente deux interfaces &lt;span style="color: rgb(255, 102, 0); font-weight: bold;"&gt;I1&lt;/span&gt; et &lt;span style="color: rgb(255, 102, 0); font-weight: bold;"&gt;I2&lt;/span&gt; définies dans l'exécutable&lt;br /&gt;et dans une bibliothèque partagée. Si nous essayions d'effectuer&lt;br /&gt;un &lt;span style="color: rgb(51, 102, 255);"&gt;dynamic_cast&lt;/span&gt; sur une instance de &lt;span style="color: rgb(255, 102, 0); font-weight: bold;"&gt;C&lt;/span&gt; renvoyé par la bibliothèque&lt;br /&gt;partagée en &lt;span style="color: rgb(255, 102, 0); font-weight: bold;"&gt;I1&lt;/span&gt; ou &lt;span style="color: rgb(255, 102, 0); font-weight: bold;"&gt;I2&lt;/span&gt;, &lt;span style="color: rgb(204, 0, 0);"&gt;dynamic_cast renvoie toujours "null"&lt;/span&gt;.&lt;br /&gt;Le problème est aussi visible via &lt;span style="color: rgb(51, 102, 255);"&gt;throw&lt;/span&gt; et &lt;span style="color: rgb(51, 102, 255);"&gt;typeid&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;  Ce problème est dû au changement dans la résolution des types&lt;br /&gt;énoncés ci-dessus. &lt;span style="color: rgb(204, 0, 0);"&gt;Pour corriger ce problème, il faut utiliser&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);"&gt;l'option "-rdynamic" de GCC&lt;/span&gt; qui a pour but de créer une "&lt;span style="font-style: italic;"&gt;global &lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;symbol table&lt;/span&gt;" dans la bibliothèque partagée. Sous Linux/BSD le&lt;br /&gt;compilateur réalise cette opération en passant l'option&lt;br /&gt;"-export-dynamic" au "&lt;span style="font-style: italic;"&gt;linker&lt;/span&gt;".&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6238714725528798977-580296449522946665?l=johannes-fetz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johannes-fetz.blogspot.com/feeds/580296449522946665/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://johannes-fetz.blogspot.com/2009/07/c-dynamiccast-et-bibliotheque-partagee.html#comment-form' title='2 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6238714725528798977/posts/default/580296449522946665'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6238714725528798977/posts/default/580296449522946665'/><link rel='alternate' type='text/html' href='http://johannes-fetz.blogspot.com/2009/07/c-dynamiccast-et-bibliotheque-partagee.html' title='C++, dynamic_cast et bibliothèque partagée sous  GCC (&gt;= 3.0)'/><author><name>Johannes Fetz</name><uri>http://www.blogger.com/profile/06529824680182774898</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://1.bp.blogspot.com/_hm-8HpFJuDs/TG-yB2CwfoI/AAAAAAAAAH0/1zpAykiGiVA/S220/fetz_j.PNG'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6238714725528798977.post-7628247241830964652</id><published>2009-07-19T05:21:00.000-07:00</published><updated>2009-07-19T05:33:03.257-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>écrire un nombre en base 16 sans stdio</title><content type='html'>&lt;pre&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;#include &amp;lt;unistd.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;void&lt;/span&gt;    my_print_hexa(&lt;span style="color: rgb(51, 102, 255);"&gt;int&lt;/span&gt; fd, &lt;span style="color: rgb(51, 102, 255);"&gt;unsigned int&lt;/span&gt; d)&lt;br /&gt;{&lt;br /&gt;  &lt;span style="color: rgb(255, 102, 0);"&gt;if&lt;/span&gt; (d &amp;amp; ~0xF)                                &lt;span style="color: rgb(204, 51, 204);"&gt;/* si d &amp;gt; 16      */&lt;/span&gt;&lt;br /&gt;     my_print_hexa(fd, d &amp;gt;&amp;gt; 4);                &lt;span style="color: rgb(204, 51, 204);"&gt;/* rec de d / 16  */ &lt;/span&gt;&lt;br /&gt;  write(fd, (d &amp;amp; 0xF)[&lt;span style="color: rgb(204, 0, 0);"&gt;"0123456789ABCDEF"&lt;/span&gt;], 1); &lt;span style="color: rgb(204, 51, 204);"&gt;/* tab + (d &amp;amp; 16) */ &lt;/span&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6238714725528798977-7628247241830964652?l=johannes-fetz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johannes-fetz.blogspot.com/feeds/7628247241830964652/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://johannes-fetz.blogspot.com/2009/07/afficher-un-nombre-en-base-16-sans.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6238714725528798977/posts/default/7628247241830964652'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6238714725528798977/posts/default/7628247241830964652'/><link rel='alternate' type='text/html' href='http://johannes-fetz.blogspot.com/2009/07/afficher-un-nombre-en-base-16-sans.html' title='écrire un nombre en base 16 sans stdio'/><author><name>Johannes Fetz</name><uri>http://www.blogger.com/profile/06529824680182774898</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://1.bp.blogspot.com/_hm-8HpFJuDs/TG-yB2CwfoI/AAAAAAAAAH0/1zpAykiGiVA/S220/fetz_j.PNG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6238714725528798977.post-7242107263910339918</id><published>2009-07-18T13:05:00.000-07:00</published><updated>2009-07-19T07:53:56.884-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C'/><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='JNI'/><title type='text'>Débuter avec JNI</title><content type='html'>&lt;pre&gt;&lt;span style="font-family:courier new;"&gt;Dans cet article, nous allons étudier le framework JNI.&lt;br /&gt;Ce framework Java permet d'exécuter du code non-managé&lt;br /&gt;C/C++ dans du code Java.&lt;br /&gt;&lt;br /&gt;Pour cette démonstration nous allons utiliser GCC 3.4.2(Win32)&lt;br /&gt;et le JDK 6. Le code en C sera disponible dans une DLL.&lt;br /&gt;Dev-CPP ou CodeBlocks conviennent parfaitement pour ce tutoriel.&lt;br /&gt;____________________________________________________________________&lt;br /&gt;&lt;br /&gt;1) Pour commencer nous allons créer une classe Java "Hello" avec&lt;br /&gt;une  methode native "Test" dans un fichier "Hello.java".&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;public class&lt;/span&gt; Hello&lt;br /&gt;{&lt;br /&gt; // Methode native qui correspond au prototype de la fonction&lt;br /&gt; // qui sera appelé dans la DLL&lt;br /&gt; &lt;span style="color: rgb(51, 102, 255);"&gt;public native void &lt;/span&gt;Test();&lt;br /&gt;&lt;br /&gt; // Nous chargerons une DLL qui s'appelera "Hello.dll"&lt;br /&gt; &lt;span style="color: rgb(51, 102, 255);"&gt;static&lt;/span&gt;&lt;br /&gt; {&lt;br /&gt;    System.loadLibrary(&lt;span style="color: rgb(204, 0, 0);"&gt;"Hello"&lt;/span&gt;);&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;____________________________________________________________________&lt;br /&gt;&lt;br /&gt;2) On compile la classe.&lt;br /&gt;&lt;br /&gt;$&amp;gt;C:\Sun\SDK\jdk\bin\javac.exe Hello.java&lt;br /&gt;&lt;br /&gt;____________________________________________________________________&lt;br /&gt;&lt;br /&gt;3) On génère le fichier entête "Hello.h" pour la DLL.&lt;br /&gt;&lt;br /&gt;$&amp;gt;C:\Sun\SDK\jdk\bin\javah.exe -jni Hello&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;#include &amp;lt;jni.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;#ifndef _Included_Hello&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;#define _Included_Hello&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;#ifdef __cplusplus&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;extern &lt;/span&gt;&lt;span style="color: rgb(204, 0, 0);"&gt;"C"&lt;/span&gt; {&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;#endif&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;/*&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 51, 204);"&gt; * Class:     Hello&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 51, 204);"&gt; * Method:    Test&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 51, 204);"&gt; * Signature: ()V&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 51, 204);"&gt; */&lt;/span&gt;&lt;br /&gt;JNIEXPORT &lt;span style="color: rgb(51, 102, 255);"&gt;void &lt;/span&gt;JNICALL Java_Hello_Test(JNIEnv *, jobject);&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;#ifdef __cplusplus&lt;/span&gt;&lt;br /&gt;}&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;#endif&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;#endif&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;____________________________________________________________________&lt;br /&gt;&lt;br /&gt;4) On implémente dans un fichier "Hello.c" notre fonction suivant&lt;br /&gt;Le prototype définit dans "Hello.h"&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;#include &amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;#include &amp;lt;stdlib.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;#include &amp;lt;windows.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;#include "Hello.h"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;JNIEXPORT void JNICALL&lt;br /&gt;Java_Hello_Test(JNIEnv *env, jobject obj)&lt;br /&gt;{&lt;br /&gt; printf(&lt;span style="color: rgb(204, 0, 0);"&gt;"42\n"&lt;/span&gt;);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;____________________________________________________________________&lt;br /&gt;&lt;br /&gt;5) On compile notre fichier source.&lt;br /&gt;&lt;br /&gt;$&amp;gt;gcc -c -I"C:\Sun\SDK\jdk\include" \&lt;br /&gt;-I"C:\Sun\SDK\jdk\include\win32" -o Hello.o Hello.c&lt;br /&gt;____________________________________________________________________&lt;br /&gt;&lt;br /&gt;6) On génère le fichier de définition de la DLL.&lt;br /&gt;&lt;br /&gt;$&amp;gt;dlltool Hello.o -z Hello.def&lt;br /&gt;&lt;br /&gt; Cela donne:&lt;br /&gt;&lt;br /&gt;EXPORTS&lt;br /&gt;  Java_Hello_Test@8 @ 1&lt;br /&gt;&lt;br /&gt;____________________________________________________________________&lt;br /&gt;&lt;br /&gt;7) On Compile notre DLL.&lt;br /&gt;&lt;br /&gt;$&amp;gt;gcc.exe -shared -o Hello.dll -I"C:\Sun\SDK\jdk\include" \&lt;br /&gt;  -I"C:\Sun\SDK\jdk\include\win32" Hello.c Hello.def&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;____________________________________________________________________&lt;br /&gt;&lt;br /&gt;8) Nous allons maintenant créer un petit programme en Java pour&lt;br /&gt;tester notre "wrapper" C vers Java dans un fichier "Main.java".&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;public class &lt;/span&gt;Main&lt;br /&gt;{&lt;br /&gt; &lt;span style="color: rgb(51, 102, 255);"&gt;public static void&lt;/span&gt; main(&lt;span style="color: rgb(51, 102, 255);"&gt;String&lt;/span&gt;[] args)&lt;br /&gt; {&lt;br /&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;      // Création d'une instance de notre classe "Hello"&lt;/span&gt;&lt;br /&gt;    Hello h = &lt;span style="color: rgb(255, 102, 0);"&gt;new &lt;/span&gt;Hello();&lt;br /&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;      // On appel la fonction dans notre DLL (Hello.dll)&lt;/span&gt;&lt;br /&gt;    h.Test();&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; &lt;span style="color: rgb(51, 102, 255);"&gt;public &lt;/span&gt;Main()&lt;br /&gt; {&lt;br /&gt;    &lt;span style="color: rgb(51, 102, 255);"&gt;super&lt;/span&gt;();&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;____________________________________________________________________&lt;br /&gt;&lt;br /&gt;9) On Compile notre programme de test.&lt;br /&gt;&lt;br /&gt;$&amp;gt;C:\Sun\SDK\jdk\bin\javac.exe Main.java&lt;br /&gt;&lt;br /&gt;____________________________________________________________________&lt;br /&gt;&lt;br /&gt;10) Il nous reste plus qu'à lancer le programme qui doit afficher&lt;br /&gt;"42" sur la sortie standard suivi d'un retour à la ligne.&lt;br /&gt;&lt;br /&gt;$&amp;gt;C:\Sun\SDK\jdk\bin\java.exe Main&lt;br /&gt;$&amp;gt;42&lt;br /&gt;$&amp;gt;&lt;br /&gt;&lt;br /&gt;____________________________________________________________________&lt;br /&gt;&lt;br /&gt;           &lt;span style="color: rgb(204, 0, 0);"&gt;--- Le bug du UnsatisfiedLinkError ---&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Il est possible qu'au moment où vous avez exécuter le programme&lt;br /&gt;de l'étape 10, une erreur est apparue:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;$&amp;gt;C:\Sun\SDK\jdk\bin\java.exe Main&lt;br /&gt;$&amp;gt;Exception in thread "main" java.lang.UnsatisfiedLinkError: Init&lt;br /&gt;$&amp;gt;        at Hello.Test(Native Method)&lt;br /&gt;$&amp;gt;        at Main.main(Main.java:8)&lt;br /&gt;&lt;br /&gt;Ce problème vient du fait que Java ne trouve pas le symbole de la&lt;br /&gt;fonction "Test" dans notre DLL. Pour résoudre ce problème,&lt;br /&gt;il nous faut revenir à l'étape 6. Dans le fichier "Hello.def"&lt;br /&gt;où l'on peut lire les lignes ci-dessous:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;EXPORTS&lt;br /&gt;  Java_Hello_Test&lt;span style="color: rgb(204, 0, 0);"&gt;@8&lt;/span&gt; @ 1&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Le problème vient des caractères que j'ai souligné en rouge.&lt;br /&gt;Les noms des fonctions générées par les compilateurs ont toujours ces symboles.&lt;br /&gt;La solution consiste à exporter les fonctions de la DLL sous un autre nom.&lt;br /&gt;Pour cela il existe l'option -k de dlltool qui supprime les décorations&lt;br /&gt;autour des fonctions. Par conséquent nous allons remplacer l'étape 6&lt;br /&gt;par l'étape ci-dessous:&lt;br /&gt;&lt;br /&gt;$&amp;gt;dlltool -k Hello.o -z Hello.def&lt;br /&gt;&lt;br /&gt;    Cela donne:&lt;br /&gt;&lt;br /&gt;EXPORTS&lt;br /&gt;  Java_Hello_Test @ 1&lt;br /&gt;&lt;br /&gt;Nous pouvons maintenant recompiler le projet qui fonctionne parfaitement.&lt;br /&gt;---&lt;br /&gt;Sous Microsoft Visual C, il faut utiliser le programme "dumpbin" afin&lt;br /&gt;de récupérer les symbole de la DLL:&lt;br /&gt;&lt;br /&gt;$&amp;gt;dumpbin Hello.dll /EXPORTS&lt;br /&gt;&lt;br /&gt;Puis rajouter des directives pré-processeur #pragma pour chaque symbole&lt;br /&gt;utilisé dans le fichier source ("Hello.c").&lt;br /&gt;&lt;br /&gt;Exemple:&lt;br /&gt;&lt;br /&gt;#pragma comment(linker, "/EXPORT:Java_Hello_Test=_Java_Hello_Test@8")&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6238714725528798977-7242107263910339918?l=johannes-fetz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johannes-fetz.blogspot.com/feeds/7242107263910339918/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://johannes-fetz.blogspot.com/2009/07/debuter-avec-jni.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6238714725528798977/posts/default/7242107263910339918'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6238714725528798977/posts/default/7242107263910339918'/><link rel='alternate' type='text/html' href='http://johannes-fetz.blogspot.com/2009/07/debuter-avec-jni.html' title='Débuter avec JNI'/><author><name>Johannes Fetz</name><uri>http://www.blogger.com/profile/06529824680182774898</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://1.bp.blogspot.com/_hm-8HpFJuDs/TG-yB2CwfoI/AAAAAAAAAH0/1zpAykiGiVA/S220/fetz_j.PNG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6238714725528798977.post-3767204483419269793</id><published>2009-07-17T14:45:00.000-07:00</published><updated>2009-07-21T05:03:58.433-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C'/><category scheme='http://www.blogger.com/atom/ns#' term='stdargs'/><category scheme='http://www.blogger.com/atom/ns#' term='varargs'/><title type='text'>Simple implémentation des varargs grâce au pré-processeur C</title><content type='html'>&lt;span style="font-family:courier new;"&gt;Voici une implémentation des varargs que j'ai fait dans&lt;br /&gt;le train ce soir.&lt;/span&gt;&lt;span style="font-family:courier new;"&gt; Elle n'est certes pas portable, mais elle&lt;br /&gt;montre le principe de fonctionnement.&lt;/span&gt;&lt;span style="font-family:courier new;"&gt; Idéal pour un cours de C.&lt;/span&gt;&lt;br /&gt;_______________________________________________________________&lt;br /&gt;&lt;pre&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;#include &amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;#include &amp;lt;stdlib.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;#include &amp;lt;string.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;# define Xva_list           &lt;/span&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;long&lt;/span&gt;&lt;span style="color: rgb(0, 153, 0);"&gt; *&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;# define Xva_start(L, X)    (L) = (((Xva_list)(&amp;amp;(X))) + 1)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;# define Xva_arg(L, T)      (*(T *)(L++))&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;void&lt;/span&gt;         test(&lt;span style="color: rgb(51, 102, 255);"&gt;int&lt;/span&gt; s, ...)&lt;br /&gt;{&lt;br /&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;   /* on déclare un pointeur pour stocker l'adresse dans la pile */&lt;/span&gt;&lt;br /&gt;  Xva_list  list;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;   /* on récupère l'adresse de "s" que l'on décale de x octet */&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;   /* x est égale a la taille en octet d'un pointeur. */&lt;/span&gt;&lt;br /&gt;  Xva_start(list, s);&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;   /* on récupère nos arguments sur la pile */&lt;/span&gt;&lt;br /&gt;  printf(&lt;span style="color: rgb(204, 0, 0);"&gt;"a = %d\n"&lt;/span&gt;, Xva_arg(list, &lt;span style="color: rgb(51, 102, 255);"&gt;int&lt;/span&gt;));&lt;br /&gt;  printf(&lt;span style="color: rgb(204, 0, 0);"&gt;"b = %c\n"&lt;/span&gt;, Xva_arg(list, &lt;span style="color: rgb(51, 102, 255);"&gt;char&lt;/span&gt;));&lt;br /&gt;  printf(&lt;span style="color: rgb(204, 0, 0);"&gt;"c = %s\n"&lt;/span&gt;, Xva_arg(list, &lt;span style="color: rgb(51, 102, 255);"&gt;char&lt;/span&gt; *));&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;int&lt;/span&gt;      main()&lt;br /&gt;{&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;  int&lt;/span&gt;   a = 42;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;  char&lt;/span&gt;  b = &lt;span style="color: rgb(204, 0, 0);"&gt;'a'&lt;/span&gt;;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;  char&lt;/span&gt;  *c = strdup(&lt;span style="color: rgb(204, 0, 0);"&gt;"chaine"&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;  test(10, a, b, c);&lt;br /&gt;  free(c);&lt;br /&gt;&lt;span style="color: rgb(255, 102, 0);"&gt;  return&lt;/span&gt; (EXIT_SUCCESS);&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6238714725528798977-3767204483419269793?l=johannes-fetz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johannes-fetz.blogspot.com/feeds/3767204483419269793/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://johannes-fetz.blogspot.com/2009/07/funny-implementation-of-varargs-i-using.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6238714725528798977/posts/default/3767204483419269793'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6238714725528798977/posts/default/3767204483419269793'/><link rel='alternate' type='text/html' href='http://johannes-fetz.blogspot.com/2009/07/funny-implementation-of-varargs-i-using.html' title='Simple implémentation des varargs grâce au pré-processeur C'/><author><name>Johannes Fetz</name><uri>http://www.blogger.com/profile/06529824680182774898</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://1.bp.blogspot.com/_hm-8HpFJuDs/TG-yB2CwfoI/AAAAAAAAAH0/1zpAykiGiVA/S220/fetz_j.PNG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6238714725528798977.post-3429579035181174116</id><published>2009-07-17T14:29:00.000-07:00</published><updated>2009-07-19T04:08:33.720-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Event'/><category scheme='http://www.blogger.com/atom/ns#' term='Reflection'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='PressKey'/><title type='text'>Envoyer l'événement "PressKey" à n'importe quel contrôle en C#</title><content type='html'>&lt;pre&gt;&lt;span style="font-family:courier new;"&gt;Voici une méthode pour envoyer un évènement "KeyPress" à un&lt;br /&gt;contrôle C#. Elle ne nécessite pas d'avoir le "focus" sur&lt;br /&gt;l'élément visé.&lt;br /&gt;---------------------------------------------------------------&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;using&lt;/span&gt; System;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;using&lt;/span&gt; System.Windows.Forms;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;using&lt;/span&gt; System.Reflection;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;namespace &lt;/span&gt;Test&lt;br /&gt;{&lt;br /&gt;  &lt;span style="color: rgb(51, 102, 255);"&gt;public sealed class &lt;/span&gt;KeyEventSender&lt;br /&gt;  {&lt;br /&gt;     &lt;span style="color: rgb(51, 102, 255);"&gt;private &lt;/span&gt;KeyEventSender()&lt;br /&gt;     {&lt;br /&gt;     }&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;      // WM_CHAR est définit dans l'API de windows&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;      // notification d'un événement clavier&lt;/span&gt;&lt;br /&gt;     &lt;span style="color: rgb(51, 102, 255);"&gt;internal static readonly int&lt;/span&gt; WM_CHAR = 258;&lt;br /&gt;&lt;br /&gt;     &lt;span style="color: rgb(51, 102, 255);"&gt;public static void&lt;/span&gt; Send(&lt;span style="color: rgb(51, 102, 255);"&gt;Control &lt;/span&gt;control, &lt;span style="color: rgb(51, 102, 255);"&gt;char &lt;/span&gt;c)&lt;br /&gt;     {&lt;br /&gt;        Message m = &lt;span style="color: rgb(255, 102, 0);"&gt;new &lt;/span&gt;Message();&lt;br /&gt;        m.HWnd = (&lt;span style="color: rgb(51, 102, 255);"&gt;IntPtr&lt;/span&gt;)control.Handle; &lt;span style="color: rgb(204, 51, 204);"&gt;// "Handle" du contrôle.&lt;/span&gt;&lt;br /&gt;        m.Msg = KeyEventSender.WM_CHAR; &lt;span style="color: rgb(204, 51, 204);"&gt;// type de l'évènement windows&lt;/span&gt;&lt;br /&gt;        m.LParam = &lt;span style="color: rgb(51, 102, 255);"&gt;IntPtr&lt;/span&gt;.Zero; &lt;span style="color: rgb(204, 51, 204);"&gt;// pas d'option&lt;/span&gt;&lt;br /&gt;        m.WParam = (&lt;span style="color: rgb(51, 102, 255);"&gt;IntPtr&lt;/span&gt;)c; &lt;span style="color: rgb(204, 51, 204);"&gt;// valeur de caractère&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;         // on récupère la définition de la méthode par réflexion&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;         // car la méthode n'est pas publique&lt;/span&gt;&lt;br /&gt;        MethodInfo dynMethod = control.GetType().GetMethod(&lt;span style="color: rgb(204, 0, 0);"&gt;"ProcessKeyEventArgs"&lt;/span&gt;,&lt;br /&gt;                                  BindingFlags.NonPublic  BindingFlags.Instance);&lt;br /&gt;&lt;span style="color: rgb(204, 51, 204);"&gt;         // on invoque la méthode.&lt;/span&gt;&lt;br /&gt;        dynMethod.Invoke(control, &lt;span style="color: rgb(255, 102, 0);"&gt;new &lt;/span&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;object&lt;/span&gt;[] { m });&lt;br /&gt;     }&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: rgb(51, 102, 255);"&gt; public static void&lt;/span&gt; Send(&lt;span style="color: rgb(51, 102, 255);"&gt;Control &lt;/span&gt;control, KeyPressEventArgs e)&lt;br /&gt;     {&lt;br /&gt;           KeyEventSender.Send(control, e.KeyChar);&lt;br /&gt;     }&lt;br /&gt;  }&lt;br /&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6238714725528798977-3429579035181174116?l=johannes-fetz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://johannes-fetz.blogspot.com/feeds/3429579035181174116/comments/default' title='Publier les commentaires'/><link rel='replies' type='text/html' href='http://johannes-fetz.blogspot.com/2009/07/send-presskey-event-to-any-control-in-c.html#comment-form' title='0 commentaires'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6238714725528798977/posts/default/3429579035181174116'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6238714725528798977/posts/default/3429579035181174116'/><link rel='alternate' type='text/html' href='http://johannes-fetz.blogspot.com/2009/07/send-presskey-event-to-any-control-in-c.html' title='Envoyer l&apos;événement &quot;PressKey&quot; à n&apos;importe quel contrôle en C#'/><author><name>Johannes Fetz</name><uri>http://www.blogger.com/profile/06529824680182774898</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://1.bp.blogspot.com/_hm-8HpFJuDs/TG-yB2CwfoI/AAAAAAAAAH0/1zpAykiGiVA/S220/fetz_j.PNG'/></author><thr:total>0</thr:total></entry></feed>
