<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet title="XSL formatting" type="text/xsl" href="http://www.shadoware.org/feed/rss2/xslt" ?><rss version="2.0"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:wfw="http://wellformedweb.org/CommentAPI/"
  xmlns:content="http://purl.org/rss/1.0/modules/content/"
  xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
  <title>Shadoware.Org - Mot-clé - kde</title>
  <link>http://www.shadoware.org/</link>
  <atom:link href="http://www.shadoware.org/index.php/feed/tag/kde/rss2" rel="self" type="application/rss+xml"/>
  <description>Moi, mes idées, mes logiciels ...</description>
  <language>fr</language>
  <pubDate>Mon, 06 Feb 2012 15:38:11 +0100</pubDate>
  <copyright>Ulrich VANDENHEKKE</copyright>
  <docs>http://blogs.law.harvard.edu/tech/rss</docs>
  <generator>Dotclear</generator>
  
    
  <item>
    <title>KMDAlert - Logiciel de surveillance de périphérique RAID - Version pour KDE 4.0</title>
    <link>http://www.shadoware.org/post/kmdalert-0.2</link>
    <guid isPermaLink="false">urn:md5:34b6a6d32b5e50755d5fe92a063ea2be</guid>
    <pubDate>Sun, 14 Aug 2011 20:43:00 +0200</pubDate>
    <dc:creator>Ulrich Van Den Hekke</dc:creator>
        <category>KMDAlert</category>
        <category>kde</category><category>kmdalert</category><category>libre</category><category>mdadm</category><category>planet</category><category>raid</category><category>systray</category>    
    <description>    &lt;h2&gt;Présentation&lt;/h2&gt;


&lt;p&gt;Possédant chez moi des disques durs en RAID logiciels sous Gnu/Linux, en 2007 (cela fait déjà 4 ans), &lt;a href=&quot;http://www.shadoware.org/post/kmdalert&quot;&gt;j'avais écrit un petit logiciel&lt;/a&gt; dont le but était de faire du monitoring RAID.&lt;/p&gt;


&lt;p&gt;En cas de reconstruction du RAID ou de  disque défectueux, le logiciel affiche une notification à l'utilisateur, et change le statut affiché dans la barre de notification (&lt;em&gt;systray&lt;/em&gt;). L'icône change bien sur en fonction de l'état du RAID&amp;nbsp;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;dégradé (avec un point d'exclamation)&lt;/li&gt;
&lt;li&gt;en cours de synchronisation (avec une barre de progression)&lt;/li&gt;
&lt;li&gt;disque RAID dans un état normal&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ce logiciel ne tournait que sous KDE 3.X.&lt;/p&gt;


&lt;p&gt;Voici donc une nouvelle version (qui a mis le temps de sortir) qui est un portage de l'application sous KDE 4.X. Elle utilise donc le nouveau système de notification de KDE (pour l'instant en passant uniquement par les notifications standard). Quelques améliorations y seront apportées plus tard.&lt;/p&gt;


&lt;h2&gt;Requis&lt;/h2&gt;


&lt;p&gt;Pour fonctionner &lt;em&gt;KMDAlert&lt;/em&gt; nécessite que le dossier &lt;code&gt;/sys&lt;/code&gt; soit monté et que &lt;code&gt;/sys/block/&lt;/code&gt; soit renseigné pour chaque volume RAID (exemple &lt;code&gt;/sys/block/md0&lt;/code&gt;, &lt;code&gt;/sys/block/md1&lt;/code&gt;, ...). &lt;code&gt;KMDAlert&lt;/code&gt; observe ensuite les modifications faites sur les fichiers pour informer l'utilisateur des modifications faites sur le volume RAID ou sur les disques le composant.&lt;/p&gt;


&lt;p&gt;De nos jours le dossier &lt;code&gt;/sys&lt;/code&gt; et &lt;code&gt;/sys/block&lt;/code&gt; devraient être toujours présents.&lt;/p&gt;


&lt;p&gt;L'application a été développée sur &lt;em&gt;Gnu/Debian Squeeze&lt;/em&gt;, sur un KDE 4.4.5 avec un noyau 2.6.32.&lt;/p&gt;


&lt;p&gt;&lt;em&gt;KMDAlert&lt;/em&gt; ne nécessite pas de &lt;em&gt;Inotify&lt;/em&gt;. &lt;em&gt;KMDAlert&lt;/em&gt; lit le contenu de plusieurs fichiers dans le dossier &lt;code&gt;/sys&lt;/code&gt; toutes les 6 secondes pour être informé de la modification de l'état du périphérique. Sur l'application d'origine, développé sous un noyau 2.6.18, &lt;em&gt;Inotify&lt;/em&gt; n'est pas averti des modifications faites sur le système de fichier &lt;code&gt;/sys&lt;/code&gt;. Les dates de ces fichiers ne sont pas non plus modifiées. Si quelqu'un a une autre méthode à me proposer, je reste ouvert à toutes propositions.&lt;/p&gt;


&lt;p&gt;&lt;em&gt;KMDAlert&lt;/em&gt; est une application écrite en utilisant les librairies de KDE, mais devrait tout de même fonctionner sous Gnome. Les messages de notification utilisent donc le système de notification de KDE (bien que je n'utilise pas toutes ses possibilités).&lt;/p&gt;


&lt;h2&gt;Compilation / Installation&lt;/h2&gt;


&lt;p&gt;La compilation et l'installation de &lt;em&gt;KMDAlert&lt;/em&gt; se fait à l'aide du trio habituel&amp;nbsp;:&lt;/p&gt;

&lt;pre class=&quot;bash bash&quot; style=&quot;font-family:inherit&quot;&gt;&lt;span style=&quot;color: #666666; font-style: italic;&quot;&gt;# Décompression de KMDAlert&lt;/span&gt;
&lt;span style=&quot;color: #c20cb9; font-weight: bold;&quot;&gt;tar&lt;/span&gt; xjfv kmdalert-&lt;span style=&quot;color: #000000;&quot;&gt;0.2&lt;/span&gt;-77c0d6b4d49f.tar.gz
&lt;span style=&quot;color: #7a0874; font-weight: bold;&quot;&gt;cd&lt;/span&gt; kmdalert-77c0d6b4d49f
&amp;nbsp;
&lt;span style=&quot;color: #666666; font-style: italic;&quot;&gt;# Préparation de la compilation&lt;/span&gt;
&lt;span style=&quot;color: #c20cb9; font-weight: bold;&quot;&gt;mkdir&lt;/span&gt; build
&lt;span style=&quot;color: #7a0874; font-weight: bold;&quot;&gt;cd&lt;/span&gt; build
&amp;nbsp;
&lt;span style=&quot;color: #666666; font-style: italic;&quot;&gt;# Comilation&lt;/span&gt;
cmake ..&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;/&lt;/span&gt;
&lt;span style=&quot;color: #c20cb9; font-weight: bold;&quot;&gt;make&lt;/span&gt;
&amp;nbsp;
&lt;span style=&quot;color: #666666; font-style: italic;&quot;&gt;# Installation&lt;/span&gt;
&lt;span style=&quot;color: #c20cb9; font-weight: bold;&quot;&gt;make&lt;/span&gt; &lt;span style=&quot;color: #c20cb9; font-weight: bold;&quot;&gt;install&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;La compilation nécessite les librairies de développement KDE et Qt3, ainsi que le compilateur GCC.&lt;/p&gt;


&lt;h2&gt;Licence&lt;/h2&gt;


&lt;p&gt;La licence choisie est la  &lt;a href=&quot;http://www.gnu.org/licenses/gpl-2.0.txt&quot; hreflang=&quot;en&quot; title=&quot;GNU GENERAL PUBLIC LICENCE&quot;&gt;GNU GENERAL PUBLIC LICENSE&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;Téléchargement&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Vous pouvez télécharger une archive déjà construite de l'application sur &lt;a href=&quot;http://kde-apps.org/content/show.php/KMDAlert?content=73373&quot; hreflang=&quot;fr&quot;&gt;KDE-Apps.org&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Le dépôt officiel pour télécharger les sources et participer&amp;nbsp;: &lt;a href=&quot;http://hg.shadoware.org/kmdalert?pk_campaign=shadoware&quot;&gt;http://hg.shadoware.org/kmdalert&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Vous pouvez également télécharger la version attachée au billet.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;Système de suivi&lt;/h2&gt;


&lt;p&gt;Il n'y a actuellement plus de système de suivi pour ce logiciel. En cas de problème, vous pouvez laisser un message dans les commentaires ou m'envoyer un mail.&lt;/p&gt;</description>
    
          <enclosure url="http://www.shadoware.org/public/download/kmdalert/kmdalert-0.2-77c0d6b4d49f.tar.gz"
      length="50726" type="application/x-gzip" />
    
    
          <comments>http://www.shadoware.org/post/kmdalert-0.2#comment-form</comments>
      <wfw:comment>http://www.shadoware.org/post/kmdalert-0.2#comment-form</wfw:comment>
      <wfw:commentRss>http://www.shadoware.org/feed/atom/comments/674</wfw:commentRss>
      </item>
    
  <item>
    <title>[C++/Qt] Performance de l'utilisation de QSharedPointer</title>
    <link>http://www.shadoware.org/post/2011/01/17/Performance-de-l-utilisation-de-QSharedPointer</link>
    <guid isPermaLink="false">urn:md5:f477dcc0189d180d38c2a61076493790</guid>
    <pubDate>Tue, 25 Jan 2011 12:00:00 +0100</pubDate>
    <dc:creator>Ulrich Van Den Hekke</dc:creator>
        <category>Performances</category>
        <category>kde</category><category>nokia</category><category>performance</category><category>planet</category><category>qmake</category><category>qt</category><category>trolltech</category>    
    <description>&lt;h3&gt;Présentation&lt;/h3&gt;


&lt;p&gt;&lt;em&gt;Qt&lt;/em&gt; est un framework orienté objet écrit en C++ et permettant de faire des interfaces graphiques. Ce framework est utilisé par le projet &lt;em&gt;KDE&lt;/em&gt; depuis ses débuts pour en faire un environnement de bureau très complet.&lt;/p&gt;


&lt;p&gt;&lt;em&gt;Qt&lt;/em&gt; fournit un ensemble de pointeur &lt;em&gt;intelligent&lt;/em&gt;&lt;sup&gt;[&lt;a href=&quot;http://www.shadoware.org/post/2011/01/17/Performance-de-l-utilisation-de-QSharedPointer#pnote-628-1&quot; id=&quot;rev-pnote-628-1&quot;&gt;1&lt;/a&gt;]&lt;/sup&gt; permettant de gérer plus facilement la mémoire. Le but est alors de ne plus avoir à supprimer des objets. La suppression se fera soit par un pointeur &lt;em&gt;intelligent&lt;/em&gt; soit par le système de hiérarchie d'objet existant en &lt;em&gt;Qt&lt;/em&gt; (l'objet père qui supprime l'ensemble des objets fils qui lui sont rattachés).&lt;/p&gt;


&lt;p&gt;&lt;em&gt;Qt&lt;/em&gt; propose l'ensemble des pointeurs &lt;em&gt;intelligents&lt;/em&gt; suivants:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://doc.qt.nokia.com/4.6/qshareddatapointer.html&quot; hreflang=&quot;en&quot; title=&quot;Documentation Qt de QSharedDataPointer&quot;&gt;QSharedDataPointer&lt;/a&gt; / &lt;a href=&quot;http://doc.qt.nokia.com/4.6/qshareddata.html&quot; hreflang=&quot;en&quot; title=&quot;Documentation Qt de QSharedData&quot;&gt;QSharedData&lt;/a&gt;&amp;nbsp;: ces deux classes utilisées ensemble permettent d'écrire un objet avec partage implicite. Cela signifie que l'objet fonctionnera comme la classe &lt;em&gt;QString&lt;/em&gt;. Tant que l'objet est copié, passé en paramètre, .... l'objet n'est pas dupliqué (tous les objets pointes vers le même espace mémoire). Au moment où l'objet est modifié, l'objet est dupliqué. C'est ce qu'on appelle le COW&lt;sup&gt;[&lt;a href=&quot;http://www.shadoware.org/post/2011/01/17/Performance-de-l-utilisation-de-QSharedPointer#pnote-628-2&quot; id=&quot;rev-pnote-628-2&quot;&gt;2&lt;/a&gt;]&lt;/sup&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://doc.qt.nokia.com/4.6/qexplicitlyshareddatapointer.html&quot; hreflang=&quot;en&quot; title=&quot;Documentation Qt de QExplictlySharedDataPointer&quot;&gt;QExplictlySharedDataPointer&lt;/a&gt; / &lt;a href=&quot;http://doc.qt.nokia.com/4.6/qshareddata.html&quot; hreflang=&quot;en&quot; title=&quot;Documentation Qt de QSharedData&quot;&gt;QSharedData&lt;/a&gt;&amp;nbsp;: QExplicitlySharedDataPointer est une variante de QSharedDataPointer. Ce pointeur &lt;em&gt;intelligent&lt;/em&gt;, comme son nom l'indique, est détaché uniquement lorsque la méthode detach() est appelée explicitement. Cette classe permet de faire des objets qui fonctionnent comme des pointeurs mais qui sont utilisés sans la notion de pointeur (le *). La suppression des données partagées se fait donc quand tous les objets ne sont plus utilisés.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://doc.qt.nokia.com/4.6/qscopedpointer.html&quot; hreflang=&quot;en&quot; title=&quot;Documentation Qt de QScopedPointer&quot;&gt;QScopedPointer&lt;/a&gt;&amp;nbsp;: Ce pointeur est le plus simple. Il permet de déclarer un pointeur sur le tas et s'occupe de la destruction de l'objet, lorsque le programme sort de la portée du bloc. Cela permet de ne plus se soucier de la libération du pointeur dans les cas d'erreur (exception, retour avant la fin de la fonction car le fichier n'a pu être ouvert, ...).&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://doc.qt.nokia.com/4.6/qsharedpointer.html&quot; hreflang=&quot;en&quot; title=&quot;Documentation Qt de QSharedPointer&quot;&gt;QSharedPointer&lt;/a&gt;&amp;nbsp;: Le pointeur dont on parlera dans la suite de ce billet. Il permet de partager non plus des données (comme le fait QSharedData) mais de partager un pointeur&lt;sup&gt;[&lt;a href=&quot;http://www.shadoware.org/post/2011/01/17/Performance-de-l-utilisation-de-QSharedPointer#pnote-628-3&quot; id=&quot;rev-pnote-628-3&quot;&gt;3&lt;/a&gt;]&lt;/sup&gt;. Nous allons voir dans la suite du billet, comment simplement utiliser ce pointeur, et les performances de ce pointeur par rapport à un pointeur standard.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Sommaire&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;http://www.shadoware.org/post/2011/01/17/Performance-de-l-utilisation-de-QSharedPointer#utilisation_qsharedpointer&quot;&gt;Utilisation de QSharedPointer&lt;/a&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;http://www.shadoware.org/post/2011/01/17/Performance-de-l-utilisation-de-QSharedPointer#a_quoi_sert_il&quot;&gt;A quoi sert-il ?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.shadoware.org/post/2011/01/17/Performance-de-l-utilisation-de-QSharedPointer#comment_l_utiliser&quot;&gt;Comment l'utiliser ?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.shadoware.org/post/2011/01/17/Performance-de-l-utilisation-de-QSharedPointer#comment_utiliser_this&quot;&gt;Comment utiliser this&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.shadoware.org/post/2011/01/17/Performance-de-l-utilisation-de-QSharedPointer#comment_eviter_les_references_circulaires&quot;&gt;Comment éviter les références circulaires&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.shadoware.org/post/2011/01/17/Performance-de-l-utilisation-de-QSharedPointer#utilisation_dans_les_applications_multi_thread&quot;&gt;Utilisation dans les applications multi-thread.&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.shadoware.org/post/2011/01/17/Performance-de-l-utilisation-de-QSharedPointer#utilisation_d_un_pool&quot;&gt;Utilisation d'un pool&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.shadoware.org/post/2011/01/17/Performance-de-l-utilisation-de-QSharedPointer#benchmark&quot;&gt;Benchmark&lt;/a&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;http://www.shadoware.org/post/2011/01/17/Performance-de-l-utilisation-de-QSharedPointer#code_source&quot;&gt;Code source&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.shadoware.org/post/2011/01/17/Performance-de-l-utilisation-de-QSharedPointer#le_jeu_de_test&quot;&gt;Le jeu de test&lt;/a&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;http://www.shadoware.org/post/2011/01/17/Performance-de-l-utilisation-de-QSharedPointer#test_de_l_allocation&quot;&gt;Test de l'allocation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.shadoware.org/post/2011/01/17/Performance-de-l-utilisation-de-QSharedPointer#test_de_modification_d_une_donnee&quot;&gt;Test de Modification d'une donnée&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.shadoware.org/post/2011/01/17/Performance-de-l-utilisation-de-QSharedPointer#test_d_affectation&quot;&gt;Test d'affectation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.shadoware.org/post/2011/01/17/Performance-de-l-utilisation-de-QSharedPointer#test_de_destruction&quot;&gt;Test de destruction&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.shadoware.org/post/2011/01/17/Performance-de-l-utilisation-de-QSharedPointer#resultat_du_test&quot;&gt;Résultat du test&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&quot;footnotes&quot;&gt;&lt;h4&gt;Notes&lt;/h4&gt;
&lt;p&gt;[&lt;a href=&quot;http://www.shadoware.org/post/2011/01/17/Performance-de-l-utilisation-de-QSharedPointer#rev-pnote-628-1&quot; id=&quot;pnote-628-1&quot;&gt;1&lt;/a&gt;] en anglais : smart-pointer&lt;/p&gt;
&lt;p&gt;[&lt;a href=&quot;http://www.shadoware.org/post/2011/01/17/Performance-de-l-utilisation-de-QSharedPointer#rev-pnote-628-2&quot; id=&quot;pnote-628-2&quot;&gt;2&lt;/a&gt;] COW = Copy On Write&lt;/p&gt;
&lt;p&gt;[&lt;a href=&quot;http://www.shadoware.org/post/2011/01/17/Performance-de-l-utilisation-de-QSharedPointer#rev-pnote-628-3&quot; id=&quot;pnote-628-3&quot;&gt;3&lt;/a&gt;] Ce pointeur est l'équivalent du pointeur &lt;em&gt;intelligent&lt;/em&gt; &lt;a href=&quot;http://www.boost.org/doc/libs/1_45_0/libs/smart_ptr/shared_ptr.htm&quot; hreflang=&quot;en&quot;&gt;boost::shared_ptr&lt;/a&gt; du projet &lt;a href=&quot;http://www.boost.org/&quot; hreflang=&quot;en&quot;&gt;Boost&lt;/a&gt;. Boost est une librairie qui ajoute beaucoup de facilité pour les programmes en C++, comme par exemple les smart-pointer dont certains seront inclus dans C++0x, ou de la boucle &lt;code&gt;std::for_each&lt;/code&gt;.&lt;/p&gt;&lt;/div&gt;
    &lt;p&gt;&lt;a name=&quot;utilisation_qsharedpointer&quot;&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;Utilisation de QSharedPointer&lt;/h3&gt;


&lt;p&gt;&lt;a name=&quot;a_quoi_sert_il&quot;&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;A quoi sert-il&amp;nbsp;?&lt;/h4&gt;


&lt;p&gt;L'objet &lt;code&gt;QSharedPointer&lt;/code&gt; fait partie des pointeurs &lt;em&gt;intelligents&lt;/em&gt;. Ces pointeurs permettent de gérer automatiquement la libération de la mémoire (plus besoin de faire &lt;code&gt;delete ptr;&lt;/code&gt; quand le pointeur n'est plus utilisé) tout en restant utilisable comme un pointeur normal.&lt;/p&gt;


&lt;p&gt;&lt;code&gt;QSharedPointer&lt;/code&gt; fonctionne par comptage de référence. Après la déclaration, à chaque affectation, on augmente le compteur de référence, lorsqu'on quitte la portée du bloc, on décrémente le compteur de référence. &lt;code&gt;QSharedPointer&lt;/code&gt; détruit donc automatiquement le pointeur quand il n'existe plus aucune référence vers ce pointeur. &lt;code&gt;QSharedPointer&lt;/code&gt; vient donc comme une encapsulation de notre pointeur.&lt;/p&gt;


&lt;p&gt;&lt;img src=&quot;http://www.shadoware.org/public/billets/qsharedpointer/QSharedPointer1.png&quot; alt=&quot;QSharedPointer1.png&quot; style=&quot;display:block; margin:0 auto;&quot; title=&quot;QSharedPointer1.png, janv. 2011&quot; /&gt;&lt;/p&gt;


&lt;p&gt;&lt;a name=&quot;comment_l_utiliser&quot;&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;Comment l'utiliser&amp;nbsp;?&lt;/h4&gt;


&lt;p&gt;La déclaration d'un pointeur en C, se fait en écrivant &lt;code&gt;MyObject*&lt;/code&gt;. La syntaxe en utilisant un QSharedPointer se fait en écrivant &lt;code&gt;QSharedPointer&amp;lt;MyObject&amp;gt;&lt;/code&gt;. Par la suite dans le programme, l'utilisation du pointeur &lt;code&gt;QSharedObject&lt;/code&gt; se fera de la même manière qu'un pointeur C. (Avec l'opérateur &lt;code&gt;-&amp;gt;&lt;/code&gt; pour appeler un membre, une méthode, ...) . Appelons dans la suite pointeur C, les pointeurs standards et &lt;code&gt;QSharedPointer&lt;/code&gt;, le pointeur intelligent.&lt;/p&gt;


&lt;p&gt;Afin d'éviter d'avoir un pointeur normal pouvant être supprimé à tout moment dans l'application, lors de l'utilisation de &lt;code&gt;QSharedPointer&lt;/code&gt;, il ne faut utiliser le pointeur C résultant du &lt;code&gt;new&lt;/code&gt; que pour la création du &lt;code&gt;QSharedPointer&lt;/code&gt;. On peut donc directement créer le &lt;code&gt;QSharedPointer&lt;/code&gt; en utilisant le constructeur &lt;code&gt;QSharedPointer ( T * ptr )&lt;/code&gt; qui prend en paramètre le pointeur C. C'est entre ces parenthèses que nous allons créer le pointeur C&lt;sup&gt;[&lt;a href=&quot;http://www.shadoware.org/post/2011/01/17/Performance-de-l-utilisation-de-QSharedPointer#pnote-628-1&quot; id=&quot;rev-pnote-628-1&quot;&gt;1&lt;/a&gt;]&lt;/sup&gt;.&lt;/p&gt;

&lt;pre class=&quot;cpp cpp&quot; style=&quot;font-family:inherit&quot;&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
  &lt;span style=&quot;color: #666666;&quot;&gt;// Création du pointeur intelligent à partir d'un pointeur normal.&lt;/span&gt;
  QSharedPointer&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt;MyObject&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt; ptr&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000dd;&quot;&gt;new&lt;/span&gt; MyObject&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;
&amp;nbsp;
  &lt;span style=&quot;color: #666666;&quot;&gt;// Utilisation du pointeur intelligent comme un pointeur normal.&lt;/span&gt;
  &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;ptr&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
  &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
    ptr&lt;span style=&quot;color: #000040;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt;setMembre&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;maValeur&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;
  &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
  &lt;span style=&quot;color: #666666;&quot;&gt;// Appel d'une méthode utilisant ce pointeur&lt;/span&gt;
  maMethode&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;ptr&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;Lorsque l'on quitte le bloc, si le comptage de référence tombe à 0, on supprime le pointeur. A l'intérieur de &lt;code&gt;maMethode()&lt;/code&gt; le nombre de référence sera passé à 2. Si la méthode utilise le pointeur mais ne l'assigne nul part, le nombre de référence devrait être retombé à 1 et donc ici sera décrémenté à 0.&lt;/p&gt;


&lt;p&gt;Si par contre, &lt;code&gt;maMethode()&lt;/code&gt; fait des opérations d'assignation de &lt;code&gt;ptr&lt;/code&gt; et conserve une copie, le comptage ne tombera pas à 0 tant que l'objet restera utilisé (assigné) ailleurs.&lt;/p&gt;


&lt;p&gt;Regardons un exemple de &lt;code&gt;maMethode()&lt;/code&gt;&amp;nbsp;:&lt;/p&gt;

&lt;pre class=&quot;cpp cpp&quot; style=&quot;font-family:inherit&quot;&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt; maMethode&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;QSharedPointer&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt;MyObject&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt; ptr&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
  ptr&lt;span style=&quot;color: #000040;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt;setMembre2&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;maValeur&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;Au début du bloc, ici le comptage de référence est à 2 et sera décrémenté à la sortie de la méthode. On peut modifier les membres de &lt;code&gt;ptr&lt;/code&gt;, et dans ce cas pas de changement du comptage de référence.&lt;/p&gt;

&lt;pre class=&quot;cpp cpp&quot; style=&quot;font-family:inherit&quot;&gt;this&lt;span style=&quot;color: #000040;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt;monPtr &lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; ptr&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;Au contraire, on peut également l'assigner à un autre objet. Dans ce cas le comptage de référence de cet objet passera à 3. A la sortie de la méthode il sera décrémenté et passera alors à 2. L'objet ne sera pas supprimé tant qu'on ne fera pas un &lt;code&gt;this-&amp;gt;monPtr.clear()&lt;/code&gt; ou que &lt;code&gt;this&lt;/code&gt; ne sera pas détruit.&lt;/p&gt;


&lt;p&gt;Si on veut garder une référence d'un pointeur mais qu'on ne souhaite pas que celle-ci incrémente le nombre de référence du &lt;code&gt;QSharedPointer&lt;/code&gt;, il est possible de créer un pointeur &lt;em&gt;faible&lt;/em&gt;. Ce pointeur passe par l'objet &lt;code&gt;QWeakPointer&lt;/code&gt;. Pour obtenir ce type de pointeur, il suffit de faire&amp;nbsp;:&lt;/p&gt;

&lt;pre class=&quot;cpp cpp&quot; style=&quot;font-family:inherit&quot;&gt;QWeakPointer&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt;MyObject&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt; ptrW &lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; ptr&lt;span style=&quot;color: #000040;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt;toWeakRef &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;&lt;code&gt;ptrW&lt;/code&gt; n'incrémente donc pas le comptage de référence, cela signifie donc que le pointeur peut être détruit même si un objet &lt;code&gt;QWeakPointer&lt;/code&gt; existe. Il sera alors possible de faire un &lt;code&gt;ptrW.isNull()&lt;/code&gt; pour savoir si le pointeur est toujours valide. Si l'utilisateur a également besoin d'avoir accès à un membre de l'objet, il pourra le transformer en &lt;code&gt;QSharedPointer&lt;/code&gt; avant de l'utiliser sauf si le pointeur est &lt;code&gt;null&lt;/code&gt;.&lt;/p&gt;

&lt;pre class=&quot;cpp cpp&quot; style=&quot;font-family:inherit&quot;&gt;QSharedPointer&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt;MyObject&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt; ptr2 &lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; ptrW&lt;span style=&quot;color: #000040;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt;toStrongRef &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;ptr&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt; 
&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
   ptr&lt;span style=&quot;color: #000040;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt;maMethodePtr&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;Il faut tester que &lt;code&gt;ptr2&lt;/code&gt; est encore valide, car tant que la transformation du pointeur &lt;em&gt;faible&lt;/em&gt; vers le &lt;code&gt;QSharedPointer&lt;/code&gt; n'a pas encore été fait, il est possible que le nombre de référence vers l'objet soit tombé à 0 et qu'il ait été supprimé.&lt;/p&gt;


&lt;p&gt;&lt;a name=&quot;comment_utiliser_this&quot;&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;Comment utiliser &lt;code&gt;this&lt;/code&gt;&lt;/h4&gt;


&lt;p&gt;Un des points peu pratique de l'utilisation de &lt;code&gt;QSharedPointer&lt;/code&gt; est que le comptage de référence ne fonctionne pas si plusieurs &lt;code&gt;QSharedPointer&lt;/code&gt; pointent vers le même objet mais ont tous été créés à partir du pointeur C. Prenons par exemple, le cas suivant&amp;nbsp;:&lt;/p&gt;

&lt;pre class=&quot;cpp cpp&quot; style=&quot;font-family:inherit&quot;&gt;MyObject &lt;span style=&quot;color: #000040;&quot;&gt;*&lt;/span&gt; ptr &lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #0000dd;&quot;&gt;new&lt;/span&gt; MyObject&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;
&amp;nbsp;
QSharedPointer&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt;MyObject&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt; ptr1 &lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; QSharedPointer&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;ptr&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;
QSharedPointer&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt;MyObject&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt; ptr2 &lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; QSharedPointer&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;ptr&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;Le problème d'écrire ces lignes ainsi, et que pour  &lt;code&gt;ptr1&lt;/code&gt; comme pour &lt;code&gt;ptr2&lt;/code&gt;, l'objet n'est référencé qu'une fois. Ainsi le premier qui tombera à 0 détruira l'objet, alors que l'autre pourrait encore l'utiliser. Il faut donc écrire les choses comme suite&amp;nbsp;:&lt;/p&gt;


&lt;p&gt;&lt;img src=&quot;http://www.shadoware.org/public/billets/qsharedpointer/QSharedPointer2.png&quot; alt=&quot;QSharedPointer2.png&quot; style=&quot;display:block; margin:0 auto;&quot; title=&quot;QSharedPointer2.png, janv. 2011&quot; /&gt;&lt;/p&gt;

&lt;pre class=&quot;cpp cpp&quot; style=&quot;font-family:inherit&quot;&gt;QSharedPointer&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt;MyObject&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt; ptr1 &lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; QSharedPointer&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000dd;&quot;&gt;new&lt;/span&gt; MyObject&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;
QSharedPointer&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt;MyObject&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt; ptr2 &lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; ptr1&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;Ainsi &lt;code&gt;ptr1&lt;/code&gt; et &lt;code&gt;ptr2&lt;/code&gt; ont bien chacun connaissance de l'existence de l'autre. Cela contraint donc à remplacer toutes les déclarations du type &lt;code&gt;MyObject*&lt;/code&gt; par &lt;code&gt;QSharedPointer&amp;lt;MyObject&amp;gt;&lt;/code&gt;. Ceci est donc à faire dans les paramètres des méthodes, dans les membres, dans la déclaration des variables locales, ... . On ne peut donc plus utiliser le pointeur C &lt;code&gt;MyObject*&lt;/code&gt; directement, mais seulement au travers de &lt;code&gt;QSharedPointer&lt;/code&gt; ou de &lt;code&gt;QWeakPointer&lt;/code&gt;.&lt;/p&gt;


&lt;p&gt;Cela commence à poser problème lors de l'utilisation de &lt;code&gt;this&lt;/code&gt; dans un objet. Imaginons une méthode d'un objet mettant à jour des membres fils avec en paramètre le père. Nous aurions alors tendance à écrire ceci&amp;nbsp;:&lt;/p&gt;

&lt;pre class=&quot;cpp cpp&quot; style=&quot;font-family:inherit&quot;&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt; Object2&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #007788;&quot;&gt;setParent&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;QSharedPointer&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt;MyObject&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt; parent&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
...
&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
....
&amp;nbsp;
&lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt; MyObject&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #007788;&quot;&gt;setMember&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;Object2 &lt;span style=&quot;color: #000040;&quot;&gt;*&lt;/span&gt; obj&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
  _membre &lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; obj&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;
  &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;obj&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
  &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
    obj&lt;span style=&quot;color: #000040;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt;setParent&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;QSharedPointer&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt;MyObject&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000dd;&quot;&gt;this&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;
  &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;Ceci ne marchera pas car on créerait un nouvel objet &lt;code&gt;QSharedPointer&lt;/code&gt; commençant son comptage de référence à 1, alors que nous en avons déjà au moins un autre pointant vers notre instance&lt;sup&gt;[&lt;a href=&quot;http://www.shadoware.org/post/2011/01/17/Performance-de-l-utilisation-de-QSharedPointer#pnote-628-2&quot; id=&quot;rev-pnote-628-2&quot;&gt;2&lt;/a&gt;]&lt;/sup&gt;. &lt;code&gt;MyObject&lt;/code&gt; pourrait alors être détruit alors qu'il est encore utilisé par &lt;code&gt;Object2&lt;/code&gt;.&lt;/p&gt;


&lt;p&gt;Pour éviter cela, il faut alors passer par un pointeur &lt;em&gt;intelligent&lt;/em&gt; &lt;code&gt;this&lt;/code&gt;. Pour cela nous allons utiliser deux choses&amp;nbsp;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Un membre nommé &lt;code&gt;_this&lt;/code&gt; de type pointeur &lt;em&gt;intelligent&lt;/em&gt; &lt;code&gt;QWeakPointer&lt;/code&gt;, contenant une référence à l'objet lui même. (Nous n'utilisons pas un QSharedPointer, pour éviter une référence circulaire, voir le paragraphe suivant).&lt;/li&gt;
&lt;li&gt;Une méthode statique utilisée pour la création (nous n'allons plus utiliser le constructeur, car à ce moment, il n'existe pas encore de QSharedPointer pointant vers notre objet).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Voici un exemple de comment écrire le constructeur maison&amp;nbsp;:&lt;/p&gt;
&lt;pre class=&quot;cpp cpp&quot; style=&quot;font-family:inherit&quot;&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;class&lt;/span&gt; MyObject
&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
&lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;:&lt;/span&gt;
  &lt;span style=&quot;color: #0000ff;&quot;&gt;static&lt;/span&gt; QSharedPointer&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt;MyObject&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt; create&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;QString parametre&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
  &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
    QSharedPointer&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt;MyObject&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt; ptr&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000dd;&quot;&gt;new&lt;/span&gt; MyObject&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;parametre&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;
    ptr&lt;span style=&quot;color: #000040;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt;_this &lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; ptr.&lt;span style=&quot;color: #007788;&quot;&gt;toWeakRef&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; ptr&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;
  &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
&lt;span style=&quot;color: #0000ff;&quot;&gt;private&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;:&lt;/span&gt;
  MyObject&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;QString parametre&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
  &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
    ...
  &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
  QWeakPointer&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt;MyObject&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt; _this&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;Le constructeur devient alors privé (ou protégé si on a besoin de la notion d'héritage) afin d'obliger l'utilisateur de la classe à utiliser notre méthode de création. Dans notre nouvelle méthode de création &lt;code&gt;create&lt;/code&gt;, qui est une méthode statique, nous allons créer le pointeur et initialiser le &lt;code&gt;QWeakPointer&lt;/code&gt; de notre objet avec le pointeur &lt;em&gt;intelligent&lt;/em&gt; que nous venons de créer. Nous retournons un &lt;code&gt;QSharedPointer&lt;/code&gt;. La méthode &lt;code&gt;create&lt;/code&gt; devient alors notre nouveau constructeur, mais créant des instances d'objets de type &lt;code&gt;QSharedPointer&amp;lt;MyObject&amp;gt;&lt;/code&gt; et non plus des instances d'objet &lt;code&gt;MyObject*&lt;/code&gt;.&lt;/p&gt;


&lt;p&gt;Notre méthode &lt;code&gt;setMember()&lt;/code&gt; peut alors être ré-écrite&amp;nbsp;:&lt;/p&gt;

&lt;pre class=&quot;cpp cpp&quot; style=&quot;font-family:inherit&quot;&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt; MyObject&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #007788;&quot;&gt;setMember&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;Object2 &lt;span style=&quot;color: #000040;&quot;&gt;*&lt;/span&gt; obj&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
  _membre &lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; obj&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;
  &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;obj&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
  &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
    obj&lt;span style=&quot;color: #000040;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt;setParent&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;_this.&lt;span style=&quot;color: #007788;&quot;&gt;toStrongRef&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;
  &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;&lt;a name=&quot;comment_eviter_les_references_circulaires&quot;&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;Comment éviter les références circulaires&lt;/h4&gt;


&lt;p&gt;Le principe d'une référence circulaire est qu'un objet A référence l'objet B et l'objet B référence l'objet A.&lt;/p&gt;


&lt;p&gt;Voici par exemple, un cas de référence circulaire&amp;nbsp;:&lt;/p&gt;

&lt;pre class=&quot;cpp cpp&quot; style=&quot;font-family:inherit&quot;&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;class&lt;/span&gt; A
&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
&lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;:&lt;/span&gt;
  &lt;span style=&quot;color: #0000ff;&quot;&gt;static&lt;/span&gt; create&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
  &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
    QSharedPointer&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt;A&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt; ptr&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000dd;&quot;&gt;new&lt;/span&gt; A&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; ptr&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;
  &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
  ~A&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
  &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
  &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
&lt;span style=&quot;color: #0000ff;&quot;&gt;private&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;:&lt;/span&gt;
  A&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
  &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
    b &lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; B&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #007788;&quot;&gt;create&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;
    b&lt;span style=&quot;color: #000040;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt;setA&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;_this&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;
  &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
  QSharedPointer&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt;B&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt; b&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;
  QWeakPointer&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt;A&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt; _this&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;
&amp;nbsp;
&lt;span style=&quot;color: #0000ff;&quot;&gt;class&lt;/span&gt; B
&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
&lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;:&lt;/span&gt;
  &lt;span style=&quot;color: #0000ff;&quot;&gt;static&lt;/span&gt; QSharedPointer&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt;B&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt; create&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt; 
  &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
    QSharedPointer&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt;B&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt; ptr&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000dd;&quot;&gt;new&lt;/span&gt; B&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; ptr&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;
  &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
  &lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt; setA&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;QSharedPointer&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt;A&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt; b&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;
  QSharedPointer&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt;A&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt; getA&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: #0000ff;&quot;&gt;private&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;:&lt;/span&gt;
  QSharedPointer&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt;A&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt;  a&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;Cela peut-être aussi le cas, si par exemple une instance d'objet C référence des instances d'objets fils C, qui possèdent eux-même un pointeur vers l'objet C père.&lt;/p&gt;

&lt;pre class=&quot;cpp cpp&quot; style=&quot;font-family:inherit&quot;&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;class&lt;/span&gt; C
&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
&lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;:&lt;/span&gt;
  &lt;span style=&quot;color: #0000ff;&quot;&gt;static&lt;/span&gt; QSharedPointer&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt;C&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt; create&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
  &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
    QSharedPointer&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt;C&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt; ptr&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000dd;&quot;&gt;new&lt;/span&gt; C&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;
    _this &lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; ptr.&lt;span style=&quot;color: #007788;&quot;&gt;toWeakPtr&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; ptr&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;
  &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
  ~C&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
  &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
  &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
  &lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt; addChild&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;QSharedPointer&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt;C&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt; c&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
  &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
    _childs.&lt;span style=&quot;color: #007788;&quot;&gt;append&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;c&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;
    c&lt;span style=&quot;color: #000040;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt;setParent&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;_this&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;
  &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
  &lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt; setParent&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;QSharedPointer&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt;C&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt; c&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;
  QSharedPointer&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt;C&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt; getParent&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: #0000ff;&quot;&gt;private&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;:&lt;/span&gt;
  C&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
  &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
  &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
  QWeakPointer&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt;C&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt; _this&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;
  QSharedPointer&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt;C&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt; _parent&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;
  QList&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt; QSharedPointer&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt;C&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt; _childs&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;Dans ces cas là, on a&amp;nbsp;:
- L'objet A possède la référence vers l'objet B
- L'objet B possède une référence vers l'objet A.
- Même principe avec l'objet C&lt;/p&gt;


&lt;p&gt;&lt;img src=&quot;http://www.shadoware.org/public/billets/qsharedpointer/QSharedPointer3.png&quot; alt=&quot;QSharedPointer3.png&quot; style=&quot;display:block; margin:0 auto;&quot; title=&quot;QSharedPointer3.png, janv. 2011&quot; /&gt;&lt;/p&gt;


&lt;p&gt;Dans ce cas, il restera alors toujours une référence vers A, et une vers B, même si plus aucune variable ne référence ces objets. Cette référence circulaire fait que l'objet ne sera jamais détruit même si on n'a plus besoin de l'objet.&lt;/p&gt;


&lt;p&gt;Si on décide que l'objet A sera l'objet maitre (donc que sa destruction engendrera la destruction de l'objet B), on peut alors écrire les choses ainsi pour l'objet B&amp;nbsp;:&lt;/p&gt;

&lt;pre class=&quot;cpp cpp&quot; style=&quot;font-family:inherit&quot;&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;class&lt;/span&gt; B
&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
&lt;span style=&quot;color: #0000ff;&quot;&gt;public&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;:&lt;/span&gt;
  &lt;span style=&quot;color: #0000ff;&quot;&gt;static&lt;/span&gt; QSharedPointer&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt;B&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt; create&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt; 
  &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
    QSharedPointer&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt;B&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt; ptr&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000dd;&quot;&gt;new&lt;/span&gt; B&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;
    &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; ptr&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;
  &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
  &lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt; setA&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;QWeakPointer&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt;A&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt; b&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;
  QWeakPointer&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt;A&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt; getA&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: #0000ff;&quot;&gt;private&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;:&lt;/span&gt;
  QWeakPointer&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt;A&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt;  a&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;Dans ce cas, avec l'utilisation d'un &lt;code&gt;QWeakPointer&lt;/code&gt;, lorsque qu'il n'existera plus de référence vers l'objet A, le pointeur &lt;em&gt;faible&lt;/em&gt; &lt;code&gt;a&lt;/code&gt; sera mis à jour comme ne contenant plus de référence&lt;sup&gt;[&lt;a href=&quot;http://www.shadoware.org/post/2011/01/17/Performance-de-l-utilisation-de-QSharedPointer#pnote-628-3&quot; id=&quot;rev-pnote-628-3&quot;&gt;3&lt;/a&gt;]&lt;/sup&gt;. L'instance de l'objet A sera réellement détruite. Il n'y aura alors plus aucune référence vers l'objet B qui sera alors également détruit&lt;sup&gt;[&lt;a href=&quot;http://www.shadoware.org/post/2011/01/17/Performance-de-l-utilisation-de-QSharedPointer#pnote-628-4&quot; id=&quot;rev-pnote-628-4&quot;&gt;4&lt;/a&gt;]&lt;/sup&gt;.&lt;/p&gt;


&lt;p&gt;&lt;a name=&quot;utilisation_dans_les_applications_multi_thread&quot;&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;Utilisation dans les applications multi-thread.&lt;/h4&gt;


&lt;p&gt;L'utilisation de &lt;code&gt;QSharedPointer&lt;/code&gt; simplifie l'écriture des applications multi-thread (les objets &lt;code&gt;QSharedPointer&lt;/code&gt; et &lt;code&gt;QWeakPointer&lt;/code&gt; sont thread-safe).&lt;/p&gt;


&lt;p&gt;Dans ces applications il n'y a alors plus besoin de se soucier si l'objet est en cours d'utilisation ailleurs dans l'application avant de le supprimer&lt;sup&gt;[&lt;a href=&quot;http://www.shadoware.org/post/2011/01/17/Performance-de-l-utilisation-de-QSharedPointer#pnote-628-5&quot; id=&quot;rev-pnote-628-5&quot;&gt;5&lt;/a&gt;]&lt;/sup&gt;. Lorsqu'un pointeur ne devient plus utilisé dans un thread donné, il ne sera détruit que s'il n'y a pas d'autres références dans d'autres threads de l'application&lt;sup&gt;[&lt;a href=&quot;http://www.shadoware.org/post/2011/01/17/Performance-de-l-utilisation-de-QSharedPointer#pnote-628-6&quot; id=&quot;rev-pnote-628-6&quot;&gt;6&lt;/a&gt;]&lt;/sup&gt;.&lt;/p&gt;


&lt;p&gt;Avec l'utilisation de &lt;code&gt;QWeakPointer&lt;/code&gt;, un thread pourra tester l'existence du pointeur avant d'effectuer une opération et pourra aviser le cas échéant sans faire planter toute l'application&lt;sup&gt;[&lt;a href=&quot;http://www.shadoware.org/post/2011/01/17/Performance-de-l-utilisation-de-QSharedPointer#pnote-628-7&quot; id=&quot;rev-pnote-628-7&quot;&gt;7&lt;/a&gt;]&lt;/sup&gt;.&lt;/p&gt;


&lt;p&gt;&lt;a name=&quot;utilisation_d_un_pool&quot;&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;Utilisation d'un pool&lt;/h4&gt;


&lt;p&gt;Si la création et la destruction d'un objet est coûteux, il est envisageable de diminuer le coût de destruction et de création d'un thread en utilisant un Pool d'objet. Dans ce cas l'objet &lt;a href=&quot;http://doc.qt.nokia.com/4.6/qqueue.html&quot; hreflang=&quot;en&quot; title=&quot;Documentation de QQueue&quot;&gt;QQueue&lt;/a&gt; pourra être utilisé pour représenter notre Pool.&lt;/p&gt;


&lt;p&gt;Lors de la demande de création, en utilisant notre méthode &lt;code&gt;create&lt;/code&gt; ci-dessus, on prend alors une valeur du pool (si disponible) et on la retourne sous forme d'un &lt;code&gt;QSharedPointer&lt;/code&gt;.&lt;/p&gt;

&lt;pre class=&quot;cpp cpp&quot; style=&quot;font-family:inherit&quot;&gt;QSharedPointer&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt;MyObject&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt; MyObject&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #007788;&quot;&gt;create&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
  MyObject &lt;span style=&quot;color: #000040;&quot;&gt;*&lt;/span&gt; c_ptr&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;
  &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;_queue.&lt;span style=&quot;color: #007788;&quot;&gt;size&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
  &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
	c_ptr &lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; _queue.&lt;span style=&quot;color: #007788;&quot;&gt;dequeue&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;
  &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
  &lt;span style=&quot;color: #0000ff;&quot;&gt;else&lt;/span&gt;
  &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt; 
	c_ptr &lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #0000dd;&quot;&gt;new&lt;/span&gt; MyObject&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;
  &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
  QSharedPointer&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt;MyObject&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt; ptr&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;c_ptr, ReturnToPool&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;
  ptr&lt;span style=&quot;color: #000040;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt;_this &lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; ptr.&lt;span style=&quot;color: #007788;&quot;&gt;toWeakRef&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;
  &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; ptr&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;Dans l'exemple ci-dessus&lt;sup&gt;[&lt;a href=&quot;http://www.shadoware.org/post/2011/01/17/Performance-de-l-utilisation-de-QSharedPointer#pnote-628-8&quot; id=&quot;rev-pnote-628-8&quot;&gt;8&lt;/a&gt;]&lt;/sup&gt;, on demande à la queue, qui doit être une variable globale ou statique, un élément, et si ce n'est pas possible, on crée un nouvel objet de type &lt;code&gt;MyObject&lt;/code&gt; (dont on suppose la création coûteuse).&lt;/p&gt;


&lt;p&gt;Lors de la création du &lt;code&gt;QSharedPointer&lt;/code&gt; on utilise alors le constructeur &lt;code&gt;QSharedPointer ( T * ptr, Deleter deleter )&lt;/code&gt; sur lequel on définit une méthode &lt;code&gt;Deleter&lt;/code&gt; nommée &lt;code&gt;ReturnToPool&lt;/code&gt; dont le but est de remettre les objets en pool.&lt;/p&gt;

&lt;pre class=&quot;cpp cpp&quot; style=&quot;font-family:inherit&quot;&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;static&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt; ReturnToPool&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;MyObject &lt;span style=&quot;color: #000040;&quot;&gt;*&lt;/span&gt;obj&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
  &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;_queue.&lt;span style=&quot;color: #007788;&quot;&gt;size&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt; MAX_SIZE_QUEUE&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
  &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
	_queue.&lt;span style=&quot;color: #007788;&quot;&gt;enqueue&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;obj&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;
  &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
  &lt;span style=&quot;color: #0000ff;&quot;&gt;else&lt;/span&gt;
  &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
	&lt;span style=&quot;color: #0000dd;&quot;&gt;delete&lt;/span&gt; obj&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;
  &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;Dans ce cas de retour au pool, si le pool est rempli, on détruit l'objet (pour éviter de consommer trop de mémoire), sinon on l'ajoute au pool. Dans ce cas, le pool est agrandi au fur et à mesure des besoins, jusqu'à une taille limite.&lt;/p&gt;


&lt;p&gt;Bien sûr il faut que la performance de l'utilisation d'un pool soit plus intéressante que celle de la création de l'objet et de son initialisation.&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;&lt;ins&gt;Attention&lt;/ins&gt;&amp;nbsp;: Ce point ne fonctionne, par contre, pas si l'objet (&lt;code&gt;MyObject&lt;/code&gt;) est un descendant de &lt;code&gt;QObject&lt;/code&gt;. En effet &lt;code&gt;QObject&lt;/code&gt; garde une référence du &lt;code&gt;QSharedPointer&lt;/code&gt; en mémoire et lors de la réutilisation du &lt;code&gt;QObject&lt;/code&gt; une erreur indique que l'objet n'a pas été détruit et est déjà utilisé par un &lt;code&gt;QSharedPointer&lt;/code&gt;. On n'a pas le problème avec &lt;code&gt;std::tr1::shared_ptr&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;


&lt;p&gt;&lt;a name=&quot;benchmark&quot;&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;Benchmark&lt;/h3&gt;


&lt;p&gt;Le but du benchmark est de se faire une idée sur les performances d'une application utilisant des &lt;code&gt;QSharedPointer&lt;/code&gt; à la place des pointeurs normaux. Attention, ce bench ne prend pas en compte le besoin potentiel de Mutex, de comptage de référence manuel, ... dans les applications multi-thread qui pourrait être nécessaire pour ne pas supprimer le pointeur si besoin.&lt;/p&gt;


&lt;p&gt;Dans ce test nous allons tester également (en comparaison), le pointeur &lt;em&gt;intelligent&lt;/em&gt; du C++0x&lt;sup&gt;[&lt;a href=&quot;http://www.shadoware.org/post/2011/01/17/Performance-de-l-utilisation-de-QSharedPointer#pnote-628-9&quot; id=&quot;rev-pnote-628-9&quot;&gt;9&lt;/a&gt;]&lt;/sup&gt;.&lt;/p&gt;


&lt;p&gt;Nous allons donc tester les opérations courantes de création, destruction, modification, affectation.&lt;/p&gt;


&lt;p&gt;&lt;a name=&quot;code_source&quot;&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;Code source&lt;/h4&gt;


&lt;p&gt;Le code source est disponible, attaché au billet. Dans la suite du billet, seuls les morceaux intéressants du benchmark seront décris. Le benchmark utilise QTest. Nous avons créé un objet bidon &lt;code&gt;ObjetTest&lt;/code&gt; qui dans le constructeur allouera un pointeur et remplira une liste, et le destructeur supprime ce pointeur (et forcément la liste).&lt;/p&gt;


&lt;p&gt;Pour que chaque test soit indépendant, le jeu de test sera initialisé avant le début de chaque QBENCHMARK et détruit à la fin du bloc. Nous aurons quatre méthodes&amp;nbsp;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Allocation&lt;/li&gt;
&lt;li&gt;Modification&lt;/li&gt;
&lt;li&gt;Affectation&lt;/li&gt;
&lt;li&gt;Nettoyage&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pour chaque test nous allons faire le test avec&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;un pointeur C standard&lt;/li&gt;
&lt;li&gt;le pointeur &lt;code&gt;QSharedPointer&lt;/code&gt; de &lt;em&gt;Qt&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;le pointeur &lt;code&gt;std::tr1::shared_ptr&lt;/code&gt; de &lt;em&gt;C++0x&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pour le test d'allocation et le test de nettoyage, nous allons également utiliser l'optimisation possible, vu ci-dessus, d'un Pool d'objet. Nous allons faire le test avec&amp;nbsp;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;le pointeur &lt;code&gt;QSharedPointer&lt;/code&gt; de &lt;em&gt;Qt&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;le pointeur &lt;code&gt;std::tr1::shared_ptr&lt;/code&gt; de &lt;em&gt;C++0x&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a name=&quot;le_jeu_de_test&quot;&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;Le jeu de test&lt;/h4&gt;


&lt;p&gt;&lt;a name=&quot;test_de_l_allocation&quot;&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h5&gt;Test de l'allocation&lt;/h5&gt;


&lt;p&gt;La création du pointeur en utilisant &lt;code&gt;QSharedPointer&lt;/code&gt; instancie le pointeur ainsi que le &lt;code&gt;QSharedPointer&lt;/code&gt;. Le temps d'exécution est donc potentiellement deux fois plus long (voir le benchmark à la fin de ce billet).&lt;/p&gt;


&lt;p&gt;Pour la création du pool, nous allons utiliser une méthode qui créera le pointeur s'il n'est pas dans le pool, et sinon prendra le pointeur du pool. Dans notre cas de test, il y aura toujours une valeur dans le pool, que l'on aura rempli au préalable.&lt;/p&gt;


&lt;p&gt;La méthode &lt;code&gt;createFromPool()&lt;/code&gt; et &lt;code&gt;createFromBoostPool()&lt;/code&gt; est sensiblement identique&amp;nbsp;:&lt;/p&gt;
&lt;pre class=&quot;cpp cpp&quot; style=&quot;font-family:inherit&quot;&gt;QSharedPointer&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt;ObjetTest&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt; createFromPool&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
        ObjetTest &lt;span style=&quot;color: #000040;&quot;&gt;*&lt;/span&gt; c_ptr&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;
        &lt;span style=&quot;color: #0000ff;&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;_queue.&lt;span style=&quot;color: #007788;&quot;&gt;size&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
          c_ptr &lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; _queue.&lt;span style=&quot;color: #007788;&quot;&gt;dequeue&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
        &lt;span style=&quot;color: #0000ff;&quot;&gt;else&lt;/span&gt;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
          c_ptr &lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #0000dd;&quot;&gt;new&lt;/span&gt; ObjetTest&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;
        &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
        QSharedPointer&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt;ObjetTest&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt; ptr&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;c_ptr, returnToPool&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;
        &lt;span style=&quot;color: #0000ff;&quot;&gt;return&lt;/span&gt; ptr&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;

&lt;table&gt;
&lt;tr&gt;&lt;th&gt;C Pointer&lt;/th&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;

&lt;pre class=&quot;cpp cpp&quot; style=&quot;font-family:inherit&quot;&gt;ObjetTest&lt;span style=&quot;color: #000040;&quot;&gt;*&lt;/span&gt; ptr &lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #0000dd;&quot;&gt;new&lt;/span&gt; ObjetTest&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;&lt;/pre&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;Qt Smart Pointer&lt;/th&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;

&lt;pre class=&quot;cpp cpp&quot; style=&quot;font-family:inherit&quot;&gt;QSharedPointer&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt;ObjetTest&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt; ptr&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000dd;&quot;&gt;new&lt;/span&gt; ObjetTest&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;&lt;/pre&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;Qt Smart Pointer as Pool&lt;/th&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;

&lt;pre class=&quot;cpp cpp&quot; style=&quot;font-family:inherit&quot;&gt;QSharedPointer&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt;ObjetTest&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt; ptr &lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; createFromPool &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;&lt;/pre&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;C++0x Smart Pointer&lt;/th&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;

&lt;pre class=&quot;cpp cpp&quot; style=&quot;font-family:inherit&quot;&gt;std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #007788;&quot;&gt;tr1&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #007788;&quot;&gt;shared_ptr&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt;ObjetTest&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt; ptr&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000dd;&quot;&gt;new&lt;/span&gt; ObjetTest&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;&lt;/pre&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;C++0x Smart Pointer as Pool&lt;/th&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;

&lt;pre class=&quot;cpp cpp&quot; style=&quot;font-family:inherit&quot;&gt;std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #007788;&quot;&gt;tr1&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #007788;&quot;&gt;shared_ptr&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt;ObjetTest&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt; ptr &lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; createFromBoostPool &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;&lt;/pre&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;



&lt;p&gt;&lt;a name=&quot;test_de_modification_d_une_donnee&quot;&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h5&gt;Test de Modification d'une donnée&lt;/h5&gt;


&lt;p&gt;Pour la modification d'une donnée, on génère un nombre aléatoire que l'on va stocker (toujours le même pour chaque test, cela n'a pas d'importance). La génération du nombre aléatoire se fait en dehors du bloc, pour éviter de polluer le test avec le calcul d'un nombre aléatoire. Ici il n'y a pas création d'affectation du pointeur, juste une affectation d'une valeur dans le contenu du pointeur. La syntaxe pour le C, et pour le pointeur intelligent est identique.&lt;/p&gt;

&lt;table&gt;
&lt;tr&gt;&lt;th&gt;C Pointer / Qt Smart Pointer / C++0x Smart Pointer&lt;/th&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;

&lt;pre class=&quot;cpp cpp&quot; style=&quot;font-family:inherit&quot;&gt;obj&lt;span style=&quot;color: #000040;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt;value &lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; random_number&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;&lt;/pre&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;



&lt;p&gt;&lt;a name=&quot;test_d_affectation&quot;&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h5&gt;Test d'affectation&lt;/h5&gt;


&lt;p&gt;Pour l'affectation nous allons créer une nouvelle variable qui pointera sur le même pointeur, et sur lequel on fera une modification. La création d'un pointeur peut arriver par exemple lors du passage du pointeur à une fonction, ou lors de la déclaration d'une variable devant contenir la même valeur. Cette déclaration supplémentaire a peu d'impact pour un pointeur C mais pour un pointeur &lt;em&gt;intelligent&lt;/em&gt; oblige la création d'un objet, et l'incrément d'un nombre d'instance (qu'on décrémente ici dans la même boucle).&lt;/p&gt;

&lt;table&gt;
&lt;tr&gt;&lt;th&gt;C Pointer&lt;/th&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;

&lt;pre class=&quot;cpp cpp&quot; style=&quot;font-family:inherit&quot;&gt;ObjetTest &lt;span style=&quot;color: #000040;&quot;&gt;*&lt;/span&gt; obj2 &lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; obj&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;
obj2&lt;span style=&quot;color: #000040;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt;value &lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; random_number&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;&lt;/pre&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;Qt Smart Pointer&lt;/th&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;

&lt;pre class=&quot;cpp cpp&quot; style=&quot;font-family:inherit&quot;&gt;QSharedPointer&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt;ObjetTest&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt; obj2 &lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; obj&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;
obj2&lt;span style=&quot;color: #000040;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt;value &lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; random_number&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;&lt;/pre&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;C++0x Smart Pointer&lt;/th&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;

&lt;pre class=&quot;cpp cpp&quot; style=&quot;font-family:inherit&quot;&gt;std&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #007788;&quot;&gt;tr1&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #007788;&quot;&gt;shared_ptr&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;lt;&lt;/span&gt;ObjetTest&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt; obj2 &lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; obj&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;
obj2&lt;span style=&quot;color: #000040;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #000080;&quot;&gt;&amp;gt;&lt;/span&gt;value &lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; random_number&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;&lt;/pre&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;



&lt;p&gt;&lt;a name=&quot;test_de_destruction&quot;&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h5&gt;Test de destruction&lt;/h5&gt;


&lt;p&gt;Pour ce test, nous allons initialiser une liste de pointeur, et pour le benchmark, nous allons supprimer un à un chaque élément de la liste.
La destruction du pointeur en C se fait par un &lt;code&gt;delete&lt;/code&gt;. Pour le pointeur ''intelligent', il n'y a pas de destruction explicite. Nous allons juste supprimer le pointeur de la liste, le pointeur sera alors automatiquement détruit car il n'y aura plus de référence vers ce pointeur.&lt;/p&gt;


&lt;p&gt;Pour le cas de test utilisant la notion du Pool, on aura créé le pointeur avec le delete &lt;code&gt;returnToPool()&lt;/code&gt;&amp;nbsp;:&lt;/p&gt;
&lt;pre class=&quot;cpp cpp&quot; style=&quot;font-family:inherit&quot;&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;void&lt;/span&gt; returnToPool&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;ObjetTest &lt;span style=&quot;color: #000040;&quot;&gt;*&lt;/span&gt;obj&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;
&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#123;&lt;/span&gt;
        _queue.&lt;span style=&quot;color: #007788;&quot;&gt;enqueue&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;obj&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;/pre&gt;


&lt;p&gt;Cette méthode ne fait pas de réelle destruction, mais juste un ajout de l'objet au pool.&lt;/p&gt;

&lt;table&gt;
&lt;tr&gt;&lt;th&gt;C Pointer&lt;/th&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;

&lt;pre class=&quot;cpp cpp&quot; style=&quot;font-family:inherit&quot;&gt;&lt;span style=&quot;color: #0000dd;&quot;&gt;delete&lt;/span&gt; c_ptr_list.&lt;span style=&quot;color: #007788;&quot;&gt;at&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #0000dd;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;
c_ptr_list.&lt;span style=&quot;color: #007788;&quot;&gt;removeFirst&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;&lt;/pre&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;Qt Smart Pointer / Qt Smart Pointer as Pool / C++0x Smart Pointer / C++0x Smart Pointer as Pool &lt;/th&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;

&lt;pre class=&quot;cpp cpp&quot; style=&quot;font-family:inherit&quot;&gt;smart_ptr_list.&lt;span style=&quot;color: #007788;&quot;&gt;removeFirst&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #008080;&quot;&gt;;&lt;/span&gt;&lt;/pre&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;



&lt;p&gt;&lt;a name=&quot;resultat_du_test&quot;&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h5&gt;Résultat du test&lt;/h5&gt;


&lt;p&gt;Le test a été fait en utilisant la version 4.6.3 de Qt. Test effectué pour 5 000 000 itérations.&lt;/p&gt;

&lt;table&gt;
&lt;tr&gt;&lt;th/&gt;&lt;th&gt;Pointeur C&lt;/th&gt;&lt;th&gt;Pointeur Qt&lt;/th&gt;&lt;th&gt;Pointeur C++0x&lt;/th&gt;&lt;th&gt;Pool en utilisant QSharedPointer&lt;/th&gt;&lt;th&gt;Pool en utilisant std::tr1::shared_ptr&lt;/th&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;Allocation&lt;/th&gt;&lt;td&gt;0.0004275 msec&lt;/td&gt;&lt;td&gt;0.0007692 msec&lt;/td&gt;&lt;td&gt;0.0006604 msec&lt;/td&gt;&lt;td&gt;0.0002590 msec&lt;/td&gt;&lt;td&gt;0.0002286 msec&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;Modification&lt;/th&gt;&lt;td&gt;0.000010 msec&lt;/td&gt;&lt;td&gt;0.000012 msec&lt;/td&gt;&lt;td&gt;0.000012 msec&lt;/td&gt;&lt;td colspan=&quot;2&quot; rowspan=&quot;2&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;Affectation&lt;/th&gt;&lt;td&gt;0.000010 msec&lt;/td&gt;&lt;td&gt;0.0000386 msec&lt;/td&gt;&lt;td&gt;0.0000230 msec&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;Destruction&lt;/th&gt;&lt;td&gt;0.000190 msec&lt;/td&gt;&lt;td&gt;0.0003161 msec&lt;/td&gt;&lt;td&gt;0.0003359 msec&lt;/td&gt;&lt;td&gt;0.0004003 msec&lt;/td&gt;&lt;td&gt;0.0003601 msec&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;



&lt;p&gt;Conclusion que l'on peut en tirer, le pointeur C est ce qu'il y a de plus rapide à partir du moment où on fait de l'allocation de l'affectation ou de la destruction. Par contre il n'apporte pas la souplesse qu'apporte les pointeurs &lt;em&gt;intelligents&lt;/em&gt; entre autre pour les applications multi-threadé.&lt;/p&gt;


&lt;p&gt;On remarque que le pointeur C++0x est plus rapide pour la création, mais apparemment plus lent en destruction. Il est également possible avec le pool de gagner en performance (surtout en création). Par contre le coût de destruction de l'objet n'est pas encore assez fort pour y gagner en utilisant le pool.&lt;/p&gt;


&lt;p&gt;Ensuite il est important de se faire son propre jugement selon ses besoins. Si besoin le source est attaché, vous pouvez faire vos propres tests.&lt;/p&gt;
&lt;div class=&quot;footnotes&quot;&gt;&lt;h4&gt;Notes&lt;/h4&gt;
&lt;p&gt;[&lt;a href=&quot;http://www.shadoware.org/post/2011/01/17/Performance-de-l-utilisation-de-QSharedPointer#rev-pnote-628-1&quot; id=&quot;pnote-628-1&quot;&gt;1&lt;/a&gt;] Si à un moment donné il faut utiliser le pointeur C pour une raison quelconque, on peut utiliser &lt;code&gt;ptr.data()&lt;/code&gt; mais il faut s'assurer que le pointeur ne sera pas détruit en déclarant un &lt;code&gt;QSharedPointer&lt;/code&gt; dans le même bloc utilisant le pointeur C. Le &lt;code&gt;QSharedPointer&lt;/code&gt; ne devra être détruit qu'après utilisation du pointeur C. Ceci peut être fait dans certain cas pour des raisons de performance.&lt;/p&gt;
&lt;p&gt;[&lt;a href=&quot;http://www.shadoware.org/post/2011/01/17/Performance-de-l-utilisation-de-QSharedPointer#rev-pnote-628-2&quot; id=&quot;pnote-628-2&quot;&gt;2&lt;/a&gt;] Sinon nous ne serions plus là pour lancer la méthode&lt;/p&gt;
&lt;p&gt;[&lt;a href=&quot;http://www.shadoware.org/post/2011/01/17/Performance-de-l-utilisation-de-QSharedPointer#rev-pnote-628-3&quot; id=&quot;pnote-628-3&quot;&gt;3&lt;/a&gt;] Le &lt;code&gt;QWeakPointeur&lt;/code&gt; ne gardant pas d'instance d'objet, car il n'incrémente pas le compteur de référence&lt;/p&gt;
&lt;p&gt;[&lt;a href=&quot;http://www.shadoware.org/post/2011/01/17/Performance-de-l-utilisation-de-QSharedPointer#rev-pnote-628-4&quot; id=&quot;pnote-628-4&quot;&gt;4&lt;/a&gt;] s'il n'existe pas de référence vers l'objet B ailleurs dans l'application&lt;/p&gt;
&lt;p&gt;[&lt;a href=&quot;http://www.shadoware.org/post/2011/01/17/Performance-de-l-utilisation-de-QSharedPointer#rev-pnote-628-5&quot; id=&quot;pnote-628-5&quot;&gt;5&lt;/a&gt;] Attention quand même, &lt;code&gt;QSharedPointer&lt;/code&gt; protège le pointeur mais pas le contenu&lt;/p&gt;
&lt;p&gt;[&lt;a href=&quot;http://www.shadoware.org/post/2011/01/17/Performance-de-l-utilisation-de-QSharedPointer#rev-pnote-628-6&quot; id=&quot;pnote-628-6&quot;&gt;6&lt;/a&gt;] d'autres threads pouvant inclure le thread principal&lt;/p&gt;
&lt;p&gt;[&lt;a href=&quot;http://www.shadoware.org/post/2011/01/17/Performance-de-l-utilisation-de-QSharedPointer#rev-pnote-628-7&quot; id=&quot;pnote-628-7&quot;&gt;7&lt;/a&gt;] Si l'objet est supprimé, &lt;code&gt;QWeakPointer&lt;/code&gt;, sera alors remis à &lt;code&gt;null&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;[&lt;a href=&quot;http://www.shadoware.org/post/2011/01/17/Performance-de-l-utilisation-de-QSharedPointer#rev-pnote-628-8&quot; id=&quot;pnote-628-8&quot;&gt;8&lt;/a&gt;] Dans le code en question, il faudrait ajouter la notion de mutex autour de la gestion de la queue, en cas de création parallèle.&lt;/p&gt;
&lt;p&gt;[&lt;a href=&quot;http://www.shadoware.org/post/2011/01/17/Performance-de-l-utilisation-de-QSharedPointer#rev-pnote-628-9&quot; id=&quot;pnote-628-9&quot;&gt;9&lt;/a&gt;] Le pointeur &lt;em&gt;intelligent&lt;/em&gt; &lt;code&gt;shared_ptr&lt;/code&gt; de C++0x à pour origine le pointeur Boost&lt;/p&gt;&lt;/div&gt;
</description>
    
          <enclosure url="http://www.shadoware.org/public/billets/qsharedpointer/smart_benchmark.7z"
      length="1805" type="text/plain" />
    
    
          <comments>http://www.shadoware.org/post/2011/01/17/Performance-de-l-utilisation-de-QSharedPointer#comment-form</comments>
      <wfw:comment>http://www.shadoware.org/post/2011/01/17/Performance-de-l-utilisation-de-QSharedPointer#comment-form</wfw:comment>
      <wfw:commentRss>http://www.shadoware.org/feed/atom/comments/628</wfw:commentRss>
      </item>
    
  <item>
    <title>KMyMoney - Logiciel de compte</title>
    <link>http://www.shadoware.org/post/2009/02/24/KMyMoney-Logiciel-de-compte</link>
    <guid isPermaLink="false">urn:md5:a8f1185e40fdd9ff15ac06145d59a8af</guid>
    <pubDate>Sat, 23 May 2009 12:31:00 +0200</pubDate>
    <dc:creator>Ulrich Van Den Hekke</dc:creator>
        <category>Logiciels</category>
        <category>argent</category><category>debian</category><category>kde</category><category>libre</category><category>planet</category><category>qt</category>    
    <description>    &lt;p&gt;&lt;img src=&quot;http://www.shadoware.org/public/billets/kmymoney/logo.png&quot; alt=&quot;Logo KMyMoney&quot; style=&quot;float:left; margin: 0 1em 1em 0;&quot; title=&quot;Logo KMyMoney, fév. 2009&quot; /&gt;&lt;/p&gt;


&lt;p&gt;Voilà un bon logiciel sur lequel on peut compter (mouarf&amp;nbsp;! mouarf&amp;nbsp;! mouarf !), KMyMoney est un éditeur de compte. Je l'utilise quotidiennement,  et je décide donc d'en parler un peu, pour que d'autres personnes puissent s'intéresser aussi à  ce logiciel.&lt;/p&gt;


&lt;p&gt;&lt;img src=&quot;http://www.shadoware.org/public/billets/kmymoney/.Summary_m.jpg&quot; alt=&quot;Summary.png&quot; style=&quot;display:block; margin:0 auto;&quot; title=&quot;Summary.png, mai 2009&quot; /&gt;&lt;/p&gt;


&lt;p&gt;KMyMoney est un logiciel de gestion de compte pour particulier. Il vous permet de gérer plusieurs de vos comptes en banque, en vous permettant de saisir les dépenses et les recettes sur chacun de vos comptes.&lt;/p&gt;


&lt;p&gt;&lt;img src=&quot;http://www.shadoware.org/public/billets/kmymoney/.Registres_m.jpg&quot; alt=&quot;Registres.png&quot; style=&quot;display:block; margin:0 auto;&quot; title=&quot;Registres.png, mai 2009&quot; /&gt;&lt;/p&gt;


&lt;p&gt;Vous pouvez également lui indiquer vos échéances (par exemple&amp;nbsp;: forfait téléphone, prêt immobilier&lt;sup&gt;[&lt;a href=&quot;http://www.shadoware.org/post/2009/02/24/KMyMoney-Logiciel-de-compte#pnote-615-1&quot; id=&quot;rev-pnote-615-1&quot;&gt;1&lt;/a&gt;]&lt;/sup&gt;, mais aussi salaire, vos virements internes ou externes, ...) qu'il s'occupera de mettre à jour dans le registre automatiquement ou à votre demande.&lt;/p&gt;


&lt;p&gt;&lt;img src=&quot;http://www.shadoware.org/public/billets/kmymoney/.Echeancier_m.jpg&quot; alt=&quot;Echeancier.png&quot; style=&quot;display:block; margin:0 auto;&quot; title=&quot;Echeancier.png, mai 2009&quot; /&gt;&lt;/p&gt;


&lt;p&gt;Après une année d'utilisation, il vous permet également de sortir un rapport détaillé sur vos dépenses et vos recettes suivant les catégories saisies pour vos opérations. Cette information peut vous être très utile pour voir où se trouve le &quot;trou&quot; de votre porte monnaie et ainsi  faire une rustine. Il vous permet aussi de vous projeter vers l'avenir et de faire votre budget pour l'année prochaine. KMyMoney vous offre pour cela, la saisie de votre budget, ainsi que plusieurs rapports d'écart, vous permettant ainsi de retrouver facilement où vous avez finalement dépensé plus que le budget prévu, et où vous avez dépensé moins.&lt;/p&gt;


&lt;p&gt;&lt;img src=&quot;http://www.shadoware.org/public/billets/kmymoney/.Rapport_m.jpg&quot; alt=&quot;Rapport.png&quot; style=&quot;display:block; margin:0 auto;&quot; title=&quot;Rapport.png, mai 2009&quot; /&gt;&lt;/p&gt;


&lt;p&gt;En plus de vos comptes en banque &lt;em&gt;normaux&lt;/em&gt;, KMyMoney vous permet également de gérer vos comptes titre, et les actions que vous y avez mises. Vous pouvez alors facilement suivre la chute vertigineuse de la bourse et votre portefeuille fondre littéralement, mais aussi la remontée (on espère), des actions d'ici quelques ... siècles.&lt;/p&gt;


&lt;p&gt;Enfin pour les paranos, vos comptes peuvent être cryptés à l'aide de votre clé GnuPG automatiquement par KMyMoney &lt;img src=&quot;/dotclear/themes/default/smilies/smile.png&quot; alt=&quot;:)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;


&lt;p&gt;&lt;img src=&quot;http://www.shadoware.org/public/billets/kmymoney/.Cryptage_m.jpg&quot; alt=&quot;Cryptage.png&quot; style=&quot;display:block; margin:0 auto;&quot; title=&quot;Cryptage.png, mai 2009&quot; /&gt;&lt;/p&gt;


&lt;p&gt;Après cette courte présentation, je vous souhaite bon compte &lt;img src=&quot;/dotclear/themes/default/smilies/wink.png&quot; alt=&quot;;)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;


&lt;blockquote&gt;&lt;p&gt;Pour une vie équilibrée, n'oubliez pas de profiter du soleil, au lieu de passer votre temps sur votre ordinateur&lt;/p&gt;&lt;/blockquote&gt;
&lt;div class=&quot;footnotes&quot;&gt;&lt;h4&gt;Notes&lt;/h4&gt;
&lt;p&gt;[&lt;a href=&quot;http://www.shadoware.org/post/2009/02/24/KMyMoney-Logiciel-de-compte#rev-pnote-615-1&quot; id=&quot;pnote-615-1&quot;&gt;1&lt;/a&gt;] Il s'occupera d'ailleurs de calculer la durée des échéances, ... en fonction des différents chiffres que vous allez lui entrer.&lt;/p&gt;&lt;/div&gt;
</description>
    
    
    
          <comments>http://www.shadoware.org/post/2009/02/24/KMyMoney-Logiciel-de-compte#comment-form</comments>
      <wfw:comment>http://www.shadoware.org/post/2009/02/24/KMyMoney-Logiciel-de-compte#comment-form</wfw:comment>
      <wfw:commentRss>http://www.shadoware.org/feed/atom/comments/615</wfw:commentRss>
      </item>
    
  <item>
    <title>KDE4 devient instable ...</title>
    <link>http://www.shadoware.org/post/2009/04/11/KDE4-passe-dans-sid</link>
    <guid isPermaLink="false">urn:md5:8d9737fde2f18ddfb08a0869850ed3d6</guid>
    <pubDate>Sat, 11 Apr 2009 11:29:00 +0200</pubDate>
    <dc:creator>Ulrich Van Den Hekke</dc:creator>
        <category>Logiciels</category>
        <category>debian</category><category>kde</category><category>planet</category><category>qt</category>    
    <description>    &lt;p&gt;Titre trolleur, cela ne veux pas dire que KDE 4 est moins stable qu'avant mais qu'il a passé une étape supplémentaire chez Debian.&lt;/p&gt;


&lt;p&gt;Voilà quelques jours déjà que la distribution &lt;strong&gt;Gnu/Debian&lt;/strong&gt; intègre &lt;strong&gt;KDE 4&lt;/strong&gt; dans sa version instable. C'est une grande nouvelle car cela va permettre à toute les personnes se trouvant en instable et n'ayant pas touchées à la branche expérimental de Debian de pouvoir tester &lt;strong&gt;KDE 4&lt;/strong&gt;.&lt;/p&gt;


&lt;p&gt;Malheureusement pour les &lt;em&gt;traumatisé de KDE 4&lt;/em&gt;, l'intégration de ce dernier remplace KDE 3.5 et ne viens pas se positionner en parallèle. Il me semble pourtant que lors du passage de KDE 2 à KDE 3, il était possible d'avoir les deux bureaux en même temps sur sa machine et de switcher de l'un à l'autre sans difficulté. Cela signifie donc peut-être aussi la perte d'utilisateur pour KDE sous Gnu/Debian au profit d'un autre environnement de bureau.&lt;/p&gt;


&lt;p&gt;Afin d'effectuer la migration en douceur, Gnu/Debian propose un assistant de migration de KDE du nom de Kaboom. Cet assistant, démarrer lors de la première connexion de l'utilisateur et vous propose alors de sauvegarder votre ancien dossier de configuration KDE 3 et de migrer le dossier .kde vers la version 4.&lt;/p&gt;


&lt;p&gt;&lt;img src=&quot;http://www.shadoware.org/public/billets/kaboom/.kaboom1_s.jpg&quot; alt=&quot;kaboom1.png&quot; title=&quot;kaboom1.png, avr. 2009&quot; /&gt;&lt;img src=&quot;http://www.shadoware.org/public/billets/kaboom/.kaboom2_s.jpg&quot; alt=&quot;kaboom2.png&quot; title=&quot;kaboom2.png, avr. 2009&quot; /&gt;&lt;img src=&quot;http://www.shadoware.org/public/billets/kaboom/.kaboom3_s.jpg&quot; alt=&quot;kaboom3.png&quot; title=&quot;kaboom3.png, avr. 2009&quot; /&gt;&lt;/p&gt;


&lt;p&gt;Je viens donc de passer à KDE 4 et m'émerveille des nouvelles fonctionnalités de KWin (cube, placement des fenêtres) que je n'avais pas avant, car n'avait jamais installé Compiz ...&lt;/p&gt;


&lt;p&gt;Bonne installation,&lt;/p&gt;</description>
    
    
    
          <comments>http://www.shadoware.org/post/2009/04/11/KDE4-passe-dans-sid#comment-form</comments>
      <wfw:comment>http://www.shadoware.org/post/2009/04/11/KDE4-passe-dans-sid#comment-form</wfw:comment>
      <wfw:commentRss>http://www.shadoware.org/feed/atom/comments/619</wfw:commentRss>
      </item>
    
  <item>
    <title>Qt 4.5 est sortie</title>
    <link>http://www.shadoware.org/post/2009/03/03/Qt-4.5-est-sortie</link>
    <guid isPermaLink="false">urn:md5:64ae6f28b3981e32fa5d8e9568c8220c</guid>
    <pubDate>Tue, 03 Mar 2009 16:42:00 +0100</pubDate>
    <dc:creator>Ulrich Van Den Hekke</dc:creator>
        <category>Logiciels</category>
        <category>kde</category><category>nokia</category><category>planet</category><category>qmake</category><category>qt</category>    
    <description>    &lt;p&gt;Voilà quelques heures que la dernière version de &lt;em&gt;Qt&lt;/em&gt; est sortie. Cette version, numéroté 4.5, est essentiellement orienté performance.&lt;/p&gt;


&lt;p&gt;&lt;img src=&quot;http://www.shadoware.org/public/billets/qt/logo_nokia_qt.png&quot; alt=&quot;Logo Nokia/Qt&quot; style=&quot;display:block; margin:0 auto;&quot; title=&quot;Logo Nokia/Qt, fév. 2009&quot; /&gt;&lt;/p&gt;


&lt;p&gt;Elle contient entre autre &lt;sup&gt;[&lt;a href=&quot;http://www.shadoware.org/post/2009/03/03/Qt-4.5-est-sortie#pnote-617-1&quot; id=&quot;rev-pnote-617-1&quot;&gt;1&lt;/a&gt;]&lt;/sup&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Une mise à jour de &lt;em&gt;QtWebKit&lt;/em&gt; vers un version de &lt;em&gt;WebKit&lt;/em&gt; plus récente (avec un nouveau moteur JavaScript plus rapide, la possibilité d'ajouter des greffons comme &lt;em&gt;Flash&lt;/em&gt;...). Il est également possible d'utiliser les balises d'HTML 5.&lt;/li&gt;
&lt;li&gt;Amélioration des performances sur le moteur de rendu ainsi que sur le rendu du texte. Une librairie permettant de faire des tests de performance a été incluse&amp;nbsp;: &lt;em&gt;QtBenchLib&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Le support de &lt;em&gt;Mac OS X Cocoa&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;La possibilité de faire des transformations XSLT&lt;/li&gt;
&lt;li&gt;Un débuggeur &lt;em&gt;QtScript&lt;/em&gt;&lt;sup&gt;[&lt;a href=&quot;http://www.shadoware.org/post/2009/03/03/Qt-4.5-est-sortie#pnote-617-2&quot; id=&quot;rev-pnote-617-2&quot;&gt;2&lt;/a&gt;]&lt;/sup&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src=&quot;http://www.shadoware.org/public/billets/qt/qtscript-debugger-small.png&quot; alt=&quot;Qt Script Debuger&quot; style=&quot;display:block; margin:0 auto;&quot; title=&quot;Qt Script Debugger, mar. 2009&quot; /&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Le support du format &lt;em&gt;OpenDocument&lt;/em&gt; (ODF version 1.0, ne supportant que le texte et les images)&lt;/li&gt;
&lt;li&gt;Amélioration du support des proxys&lt;/li&gt;
&lt;li&gt;Amélioration de &lt;em&gt;QtDesigner&lt;/em&gt;, &lt;em&gt;QtLinguist&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Une meilleur intégration au thème Gtk&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cette nouvelle version apporte également une grande nouveauté puisqu'elle est &lt;em&gt;LGPL&lt;/em&gt;. Il est donc désormais possible de faire une application propriétaire à l'aide de cette librairie sans prendre une licence chez &lt;em&gt;Qt Software&lt;/em&gt;. Par contre si une entreprise souhaite un support pour la librairie, il faudra tout de même acheter une licence.&lt;/p&gt;


&lt;p&gt;&lt;img src=&quot;http://www.shadoware.org/public/billets/qt/.ScreenShot166_s.jpg&quot; alt=&quot;Téléchargement de Qt 4.5&quot; style=&quot;float:right; margin: 0 0 1em 1em;&quot; title=&quot;Téléchargement de Qt 4.5, mar. 2009&quot; /&gt;&lt;/p&gt;


&lt;p&gt;La sortie de &lt;em&gt;Qt&lt;/em&gt; 4.5 est accompagné de &lt;em&gt;Qt Creator&lt;/em&gt; 1.0. &lt;em&gt;Qt Creator&lt;/em&gt; est l'outil dernier né de chez &lt;em&gt;Qt Software&lt;/em&gt; (branche de &lt;em&gt;Nokia&lt;/em&gt;) et est un IDE de développement de programme &lt;em&gt;Qt&lt;/em&gt;. Un paquet est proposé contenant &lt;em&gt;Qt&lt;/em&gt;, &lt;em&gt;Qt Creator&lt;/em&gt;, ainsi que &lt;em&gt;MinGW&lt;/em&gt; et permettant d'avoir une installation tout en un d'un poste de développement.&lt;/p&gt;


&lt;p&gt;Vous pouvez donc aller télécharger la dernière version de &lt;em&gt;Qt&lt;/em&gt;, ainsi que de &lt;em&gt;Qt Creator&lt;/em&gt; (attention les serveurs sont surchargés) à cette &lt;a href=&quot;http://www.qtsoftware.com/downloads&quot; hreflang=&quot;fr&quot;&gt;adresse&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;Je remercie toute l'équipe de nouvellement &lt;em&gt;Qt Software&lt;/em&gt; de cette nouvelle version.&lt;/p&gt;
&lt;div class=&quot;footnotes&quot;&gt;&lt;h4&gt;Notes&lt;/h4&gt;
&lt;p&gt;[&lt;a href=&quot;http://www.shadoware.org/post/2009/03/03/Qt-4.5-est-sortie#rev-pnote-617-1&quot; id=&quot;pnote-617-1&quot;&gt;1&lt;/a&gt;] pour plus de détail voir &lt;a href=&quot;http://doc.trolltech.com/4.5/qt4-5-intro.html&quot; hreflang=&quot;fr&quot;&gt;http://doc.trolltech.com/4.5/qt4-5-intro.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[&lt;a href=&quot;http://www.shadoware.org/post/2009/03/03/Qt-4.5-est-sortie#rev-pnote-617-2&quot; id=&quot;pnote-617-2&quot;&gt;2&lt;/a&gt;] L'image du debugger viens du site &lt;em&gt;Qt Software&lt;/em&gt;&lt;/p&gt;&lt;/div&gt;
</description>
    
          <enclosure url="http://www.shadoware.org/public/billets/qt/changes-4.5"
      length="59463" type="text/plain" />
    
    
          <comments>http://www.shadoware.org/post/2009/03/03/Qt-4.5-est-sortie#comment-form</comments>
      <wfw:comment>http://www.shadoware.org/post/2009/03/03/Qt-4.5-est-sortie#comment-form</wfw:comment>
      <wfw:commentRss>http://www.shadoware.org/feed/atom/comments/617</wfw:commentRss>
      </item>
    
  <item>
    <title>Debian Lenny est sortie</title>
    <link>http://www.shadoware.org/post/2009/02/15/Debian-Lenny-est-sortie</link>
    <guid isPermaLink="false">urn:md5:1de72db849f36d393c469df0b42620f2</guid>
    <pubDate>Sun, 15 Feb 2009 11:41:00 +0000</pubDate>
    <dc:creator>Ulrich Van Den Hekke</dc:creator>
        <category>Logiciels</category>
        <category>debian</category><category>kde</category><category>planet</category>    
    <description>    &lt;p&gt;Bonjours à tous,&lt;/p&gt;


&lt;p&gt;Voici la grande nouvelle de ce Week-End&amp;nbsp;:
Hier, le jour de la &lt;strong&gt;St Valentin&lt;/strong&gt;, la distribution stable &lt;strong&gt;Gnu/Debian&lt;/strong&gt; est passé de &lt;strong&gt;Etch&lt;/strong&gt; à &lt;strong&gt;Lenny&lt;/strong&gt;&lt;sup&gt;[&lt;a href=&quot;http://www.shadoware.org/post/2009/02/15/Debian-Lenny-est-sortie#pnote-612-1&quot; id=&quot;rev-pnote-612-1&quot;&gt;1&lt;/a&gt;]&lt;/sup&gt;.&lt;/p&gt;


&lt;p&gt;&lt;img src=&quot;http://www.shadoware.org/public/billets/lenny/debian-logo.png&quot; alt=&quot;Logo Debian&quot; style=&quot;display:block; margin:0 auto;&quot; title=&quot;Logo Debian, fév. 2009&quot; /&gt;&lt;/p&gt;


&lt;p&gt;Cela annonce donc non seulement une nouvelle version stable de &lt;strong&gt;Gnu/Debian&lt;/strong&gt; (ce qui est loin d'arriver tous les jours) mais aussi le déblocage de &lt;strong&gt;sid&lt;/strong&gt;.&lt;/p&gt;


&lt;p&gt;Attention lors des prochaines mises à jour, &lt;strong&gt;KDE 4&lt;/strong&gt; (ainsi que les dernières versions de tous les logiciels) arrivera doucement sur votre bureau&lt;sup&gt;[&lt;a href=&quot;http://www.shadoware.org/post/2009/02/15/Debian-Lenny-est-sortie#pnote-612-2&quot; id=&quot;rev-pnote-612-2&quot;&gt;2&lt;/a&gt;]&lt;/sup&gt; si vous êtes en &lt;strong&gt;sid&lt;/strong&gt; ou en &lt;strong&gt;testing&lt;/strong&gt;. Cela va de même pour les dernières versions du noyau qui devrait arriver également.&lt;/p&gt;


&lt;p&gt;La prochaine, future distribution stable (qui apparaîtra sûrement d'ici 5 ans) sera &lt;strong&gt;squeeze&lt;/strong&gt;.&lt;/p&gt;
&lt;div class=&quot;footnotes&quot;&gt;&lt;h4&gt;Notes&lt;/h4&gt;
&lt;p&gt;[&lt;a href=&quot;http://www.shadoware.org/post/2009/02/15/Debian-Lenny-est-sortie#rev-pnote-612-1&quot; id=&quot;pnote-612-1&quot;&gt;1&lt;/a&gt;] http://blog.ganneff.de/blog/2009/02/14/lenny-release.html&lt;/p&gt;
&lt;p&gt;[&lt;a href=&quot;http://www.shadoware.org/post/2009/02/15/Debian-Lenny-est-sortie#rev-pnote-612-2&quot; id=&quot;pnote-612-2&quot;&gt;2&lt;/a&gt;] http://pusling.com/blog/?p=94&lt;/p&gt;&lt;/div&gt;
</description>
    
    
    
          <comments>http://www.shadoware.org/post/2009/02/15/Debian-Lenny-est-sortie#comment-form</comments>
      <wfw:comment>http://www.shadoware.org/post/2009/02/15/Debian-Lenny-est-sortie#comment-form</wfw:comment>
      <wfw:commentRss>http://www.shadoware.org/feed/atom/comments/612</wfw:commentRss>
      </item>
    
  <item>
    <title>De retour</title>
    <link>http://www.shadoware.org/post/2007/08/04/25-de-retour</link>
    <guid isPermaLink="false">urn:md5:f930020e8cded8b402f64cb4783501e2</guid>
    <pubDate>Sat, 04 Aug 2007 10:45:00 +0000</pubDate>
    <dc:creator>Ulrich Van Den Hekke</dc:creator>
        <category>Ma Vie</category>
        <category>dédié</category><category>kde</category><category>qt</category><category>raid</category><category>vie</category>    
    <description>&lt;p&gt;Salut tout le monde,&lt;/p&gt;


&lt;p&gt;Cela fait très longtemps que je n'ai pas écrit sur ce blog&lt;sup&gt;[&lt;a href=&quot;http://www.shadoware.org/post/2007/08/04/25-de-retour#pnote-23-1&quot; id=&quot;rev-pnote-23-1&quot;&gt;1&lt;/a&gt;]&lt;/sup&gt;. Donc me voilà de retour à écrire quelques lignes.
Bon, je suis sûr que ma vie ne vous intéresse pas et que vous vous foutez de mon voyage à &lt;a href=&quot;http://ulrich.vdh.free.fr/blog/index.php?gallery/vie-courrante/la-rochelle&quot; hreflang=&quot;fr&quot;&gt;La Rochelle&lt;/a&gt; ou de celui que j'ai fait à &lt;a href=&quot;http://ulrich.vdh.free.fr/blog/index.php?gallery/vie-courrante/tours&quot; hreflang=&quot;fr&quot;&gt;Tours&lt;/a&gt;, mais je vais quand même vous en parler un peu.  Mais rien qu'un peu.&lt;/p&gt;
&lt;div class=&quot;footnotes&quot;&gt;&lt;h4&gt;Notes&lt;/h4&gt;
&lt;p&gt;[&lt;a href=&quot;http://www.shadoware.org/post/2007/08/04/25-de-retour#rev-pnote-23-1&quot; id=&quot;pnote-23-1&quot;&gt;1&lt;/a&gt;] Et certaines personnes sont là pour me le faire constater &lt;img src=&quot;/dotclear/themes/default/smilies/wink.png&quot; alt=&quot;;)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;&lt;/div&gt;
    &lt;h3&gt;Les aléas du métier&lt;/h3&gt;


&lt;p&gt;Donc il y a environ 2 mois de cela, j'étais parti en clientel en Belgique. Bon, même si de par chez moi, la Belgique n'est pas loin, Bruxelles est quand même à 1 heure et demi de route. J'ai donc fait l'aller-retour presque tous les jours, et je n'ai pas trouvé beaucoup le temps d'écrire&lt;sup&gt;[&lt;a href=&quot;http://www.shadoware.org/post/2007/08/04/25-de-retour#pnote-23-1&quot; id=&quot;rev-pnote-23-1&quot;&gt;1&lt;/a&gt;]&lt;/sup&gt;. Dur de rester éveillé avec 3 heures de voiture par jour, pendant plus d'un mois et demi .... Ce projet ne m'a, bien sûr, pas déplu, ayant appris pas mal de choses au cours de ce mois et demi, même si parfois il y avait un peu de pression dans la cocotte.
Ensuite après cela, je me suis retrouvé sur un autre projet&lt;sup&gt;[&lt;a href=&quot;http://www.shadoware.org/post/2007/08/04/25-de-retour#pnote-23-2&quot; id=&quot;rev-pnote-23-2&quot;&gt;2&lt;/a&gt;]&lt;/sup&gt;, qui me prenaient jusqu'ici un peu (euphémisme ...) de temps. Je suis d'ailleurs pour l'instant toujours sur ce projet, projet que j'apprécie également.&lt;/p&gt;


&lt;p&gt;Bref le soir, un peu crevé, je n'écris pas sur mon blog, et le week-end ....&lt;/p&gt;


&lt;h3&gt;Qt4&lt;/h3&gt;


&lt;p&gt;Depuis quelques temps je m'intéresse à &lt;a href=&quot;http://trolltech.com/products/qt&quot; hreflang=&quot;en&quot;&gt;Qt4&lt;/a&gt; de la société &lt;a href=&quot;http://trolltech.com/&quot; hreflang=&quot;en&quot;&gt;Trolltech&lt;/a&gt;. Qt est un toolkit graphique permettant le développement d'application multi-plateforme (pour ceux qui ne connaissent pas). Qt est le toolkit graphique utilisé par l'environnement &lt;a href=&quot;http://www.kde.org/&quot; hreflang=&quot;en&quot;&gt;KDE&lt;/a&gt; sous Gnu/Linux.&lt;/p&gt;


&lt;p&gt;Jusqu'ici KDE 3.5 utilisait la bibliothèque Qt3. Cette bibliothèque permettait le développement d'application libre&lt;sup&gt;[&lt;a href=&quot;http://www.shadoware.org/post/2007/08/04/25-de-retour#pnote-23-3&quot; id=&quot;rev-pnote-23-3&quot;&gt;3&lt;/a&gt;]&lt;/sup&gt; sous Linux, et devenait payante pour des développements d'applications Windows (libre ou non) ainsi que pour faire des applications commerciales (Linux ou non).&lt;/p&gt;


&lt;p&gt;La version 4 de Qt permet quant à elle la création d'application Windows et Linux sous licence libre&lt;sup&gt;[&lt;a href=&quot;http://www.shadoware.org/post/2007/08/04/25-de-retour#pnote-23-4&quot; id=&quot;rev-pnote-23-4&quot;&gt;4&lt;/a&gt;]&lt;/sup&gt; à l'aide d'une version Opensource de Qt. Par contre pour le développement d'application commercial, il faut toujours payer une licence à la société Trolltech. (Un prêté pour un rendu). Cette bibliothèque est la base du future KDE 4.&lt;/p&gt;


&lt;p&gt;J'ai donc décidé de m'intéresser à cette bibliothèque, et d'apprendre à l'utiliser. J'avais d'ailleurs écrit une application sous KDE 3 en utilisant l'ancienne version de Qt (programme dont je parle ici). Ce programme n'avance malheureusement pas beaucoup. Je n'en ai pas trop la motivation en ce moment&lt;sup&gt;[&lt;a href=&quot;http://www.shadoware.org/post/2007/08/04/25-de-retour#pnote-23-5&quot; id=&quot;rev-pnote-23-5&quot;&gt;5&lt;/a&gt;]&lt;/sup&gt;. J'espère ainsi, en apprenant à utiliser cette techno qu'est Qt4 de pouvoir écrire plus tard des applications pour le futur KDE4&lt;sup&gt;[&lt;a href=&quot;http://www.shadoware.org/post/2007/08/04/25-de-retour#pnote-23-6&quot; id=&quot;rev-pnote-23-6&quot;&gt;6&lt;/a&gt;]&lt;/sup&gt;&lt;/p&gt;


&lt;p&gt;Pour cela je me suis lancé dans l'écriture d'une application en Qt4. Cette application étant projet personnel, n'est diffusée qu'à un nombre restreint de personne, pour le moment. Ce programme en Qt4 essaie d'utiliser toute la puissance du toolkit graphique&lt;sup&gt;[&lt;a href=&quot;http://www.shadoware.org/post/2007/08/04/25-de-retour#pnote-23-7&quot; id=&quot;rev-pnote-23-7&quot;&gt;7&lt;/a&gt;]&lt;/sup&gt;. J'utilise les outils pour faire de la Complétion, pour faire de la coloration syntaxique, surveillance de la modification des fichiers, Thread, Processus, Model/View, .... Le but de l'application est un éditeur XSL et Javascript, un peu avancé. Je peux toujours vous montrer une petite capture d'écran, qui ne vous donne qu'un petit aperçu.&lt;/p&gt;


&lt;p&gt;&lt;img src=&quot;http://www.shadoware.org/blog/images/xinx/xinx1.png&quot; alt=&quot;Capture d&amp;#039;écran de XINX&quot; style=&quot;display:block; margin:0 auto;&quot; /&gt;&lt;/p&gt;


&lt;p&gt;Mouais, pas très nette cette photo ....&lt;/p&gt;


&lt;p&gt;Je passe donc depuis quelques temps déjà quelques heures le soir, et quelques heures le Week-end à écrire cet éditeur de fichier XML et Javascript. J'y ai même écris un petit module WebServices (qui ne comprend pas tout, mais bon ...).  Bon celle-ci possède encore quelques malheureux bugs, mais à part cela elle est tout à fait fonctionnelle.&lt;/p&gt;


&lt;h3&gt;Projets&lt;/h3&gt;


&lt;h4&gt;C'est RAID&lt;/h4&gt;


&lt;p&gt;Comme j'en ai déjà parlé précédemment, j'ai monté mes disques durs sur un RAID 1. Lors de coupure de courant (ou après le plantage de Gnu/Linux lors du réveil d'une mise en veille), le RAID se reconstruit. La reconstruction du RAID prend un peu de temps (presque deux heures). Je n'ai pour l'instant trouvé aucune application graphique qui permettrait de voir que le système reconstruit son RAID, où il en est, .... . Pour l'instant je dois faire un &lt;code&gt;cat /proc/mdstat&lt;/code&gt; pour avoir toutes ces informations.&lt;/p&gt;


&lt;p&gt;J'ai donc bien envie d'écrire un petit outil graphique qui permettrait de voir cela rapidement (EVMS ne me convient pas).&lt;/p&gt;


&lt;p&gt;Enfin j'ai bien envie de faire marcher cette mise en veille, continuer un peu le programme que je nomme XINX.&lt;/p&gt;


&lt;h4&gt;Serveur dédié&lt;/h4&gt;


&lt;p&gt;Je réfléchis également à l'utilité d'avoir son propre serveur dédié. Je pense par exemple au billet suivant sur le site &lt;a href=&quot;http://linuxfr.org/comments/854857.html#854857&quot; hreflang=&quot;fr&quot;&gt;LinuxFR&lt;/a&gt; qui parle du serveur dédié http://www.kimsufi.com/&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Hébergement site&lt;/li&gt;
&lt;li&gt;Stockage d'un Subversion pour mes différents projets&lt;/li&gt;
&lt;li&gt;Un serveur IMAP me permettant d'accéder à mes mails perso de n'importe où&lt;/li&gt;
&lt;li&gt;Backup crypté.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Quel est également l'utilité par rapport à un serveur tournant 24h/24 dans son chez soi&amp;nbsp;?&lt;/p&gt;
&lt;div class=&quot;footnotes&quot;&gt;&lt;h4&gt;Notes&lt;/h4&gt;
&lt;p&gt;[&lt;a href=&quot;http://www.shadoware.org/post/2007/08/04/25-de-retour#rev-pnote-23-1&quot; id=&quot;pnote-23-1&quot;&gt;1&lt;/a&gt;] Bien que sans ça, je n'aurais pas forcément trouvé le temps non plus&lt;/p&gt;
&lt;p&gt;[&lt;a href=&quot;http://www.shadoware.org/post/2007/08/04/25-de-retour#rev-pnote-23-2&quot; id=&quot;pnote-23-2&quot;&gt;2&lt;/a&gt;] qui me permet de changer un peu des habituels projets.&lt;/p&gt;
&lt;p&gt;[&lt;a href=&quot;http://www.shadoware.org/post/2007/08/04/25-de-retour#rev-pnote-23-3&quot; id=&quot;pnote-23-3&quot;&gt;3&lt;/a&gt;] sous licence GPL&lt;/p&gt;
&lt;p&gt;[&lt;a href=&quot;http://www.shadoware.org/post/2007/08/04/25-de-retour#rev-pnote-23-4&quot; id=&quot;pnote-23-4&quot;&gt;4&lt;/a&gt;] toujours GPL&lt;/p&gt;
&lt;p&gt;[&lt;a href=&quot;http://www.shadoware.org/post/2007/08/04/25-de-retour#rev-pnote-23-5&quot; id=&quot;pnote-23-5&quot;&gt;5&lt;/a&gt;] surtout que je vois des applications tel que Clonzilla, Partimage, ... qui fonctionnent très bien, ils ne leur manquent plus qu'une bonne interface graphique &lt;img src=&quot;/dotclear/themes/default/smilies/wink.png&quot; alt=&quot;;)&quot; class=&quot;smiley&quot; /&gt;&lt;/p&gt;
&lt;p&gt;[&lt;a href=&quot;http://www.shadoware.org/post/2007/08/04/25-de-retour#rev-pnote-23-6&quot; id=&quot;pnote-23-6&quot;&gt;6&lt;/a&gt;] Même si je n'écris pas énormément d'application pour la communauté, j'ai toujours la profonde motivation de le faire. Il ne reste plus qu'à trouver le projet qui me motive suffisamment.&lt;/p&gt;
&lt;p&gt;[&lt;a href=&quot;http://www.shadoware.org/post/2007/08/04/25-de-retour#rev-pnote-23-7&quot; id=&quot;pnote-23-7&quot;&gt;7&lt;/a&gt;] que je parle bien moi !!&lt;/p&gt;&lt;/div&gt;
</description>
    
    
    
          <comments>http://www.shadoware.org/post/2007/08/04/25-de-retour#comment-form</comments>
      <wfw:comment>http://www.shadoware.org/post/2007/08/04/25-de-retour#comment-form</wfw:comment>
      <wfw:commentRss>http://www.shadoware.org/feed/atom/comments/23</wfw:commentRss>
      </item>
    
</channel>
</rss>
