<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Je hack donc je suis &#187; GTK+</title>
	<atom:link href="http://frederic.logier.org/category/gtk/feed/" rel="self" type="application/rss+xml" />
	<link>http://frederic.logier.org</link>
	<description>pour une écologie numérique</description>
	<lastBuildDate>Wed, 21 Jul 2010 19:19:13 +0000</lastBuildDate>
	<language>fr</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='frederic.logier.org' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://1.gravatar.com/blavatar/1f06d42ecd282c7191503daa4ec60e0c?s=96&#038;d=http://s2.wp.com/i/buttonw-com.png</url>
		<title>Je hack donc je suis &#187; GTK+</title>
		<link>http://frederic.logier.org</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://frederic.logier.org/osd.xml" title="Je hack donc je suis" />
	<atom:link rel='hub' href='http://frederic.logier.org/?pushpress=hub'/>
		<item>
		<title>IHM asynchrone</title>
		<link>http://frederic.logier.org/2006/04/11/ihm-asynchrone/</link>
		<comments>http://frederic.logier.org/2006/04/11/ihm-asynchrone/#comments</comments>
		<pubDate>Tue, 11 Apr 2006 14:09:00 +0000</pubDate>
		<dc:creator>fredix</dc:creator>
				<category><![CDATA[GTK+]]></category>
		<category><![CDATA[MondeLibre]]></category>

		<guid isPermaLink="false">http://fredix.wordpress.com/2006/04/11/ihm-asynchrone/</guid>
		<description><![CDATA[J’avais parlé d’interface asynchrone dans ce billet. Cela consiste tout simplement à ce qu’une interface puisse continuer à prendre les évènements de l’utilisateur pendant qu’elle se met à jour. L’exemple typique est celui d’un treeview mettant un certain temps à se remplir. Dans un programme classique, l’interface sera figée le temps que le treeview soit [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=frederic.logier.org&amp;blog=3098224&amp;post=52&amp;subd=fredix&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<div class="post-body">
<p>J’avais parlé d’interface asynchrone dans ce billet.</p>
<p>Cela consiste tout simplement à ce qu’une interface puisse continuer à prendre les évènements de l’utilisateur pendant qu’elle se met à jour.</p>
<p>L’exemple typique est celui d’un treeview mettant un certain temps à se remplir. Dans un programme classique, l’interface sera figée le temps que le treeview soit remplit.</p>
<p>Une interface asynchrone permet d’être mise à jour à mesure, et de répondre aux évènements de l’utilisateur. Pour faire cela le programmeur lambda (moi le premier <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  pensera à un thread pour résoudre ce problème.<br />Le thread contenant la partie du code insérant les données dans le treeview. Il va s’en dire qu’un thread pour cette tâche est plutôt “overkill”. De plus on ajoute un élément rendant le programme difficile à débuguer.</p>
<p>   La Glib propose la méthode <a href="http://developer.gnome.org/doc/API/2.0/glib/glib-The-Main-Event-Loop.html#g-idle-add">g_idle_add</a>. Cette fonction permet d’effecter un traitement lorsque la boucle d’évènement de <span class="caps">GTK</span>+ idle, c’est à dire lorsqu’il n’y a plus d’évènement hautement prioritaire à gérer.<br />Cette fonction est bien sûr bindé en <span class="caps">RG2</span> :
<pre>GLib::Idle.add { traitement}</pre>
<p>Voir l’exemple dans le paquet libglib2-ruby : /usr/share/doc/libglib2-ruby/examples/idle.rb</p>
<p>Ensuite, si vous avez un traitement répétitif à effectuer, il existe la fonction <a href="http://developer.gnome.org/doc/API/2.0/glib/glib-The-Main-Event-Loop.html#g-timeout-add">g_timeout_add</a>. Cette fonction exécute votre traitement dans un intervale régulier et selon une priorité définissable. Voir l’exemple dans /usr/share/doc/libglib2-ruby/examples/timeout.rb</p>
<p>Ces deux fonctions permettent d’éviter les threads et rendent votre <span class="caps">IHM</span> un peu plus asynchrone. Voir les explications détaillées en C sur ce billet : <a href="http://log.emmanuelebassi.net/documentation/lazy-loading/">Lazy Loading Using The Main Loop</a> et un exemple plus simple en python : <a href="http://blogs.gnome.org/view/jamesh/2006/03/31/0">Re: Lazy loading</a></p>
<p>   Malgré ceci, il se peut que vous deviez forcer <span class="caps">GTK</span>+ à se mettre à jour :
<pre>while (Gtk.events_pending?)             Gtk.main_iterationend</pre>
<p> En gros, tant que <span class="caps">GTK</span>+ a des évènement en attente, on lui laisse la main. Ceci me sert à forcer le rafraichissement du treeview des pages jaunes. Pour <a href="http://www.peercast.org/forum/viewtopic.php?t=3149">diverses raisons</a> (callback <span class="caps">SAX2</span>) je ne peux pas mettre la boucle alimentant le model du treeview dans un g_idle_add. Cette boucle me permet donc d’arriver à un résultat similaire même si le g_idle_add est à privilégier.
<p>Merci aux conseils de Dodji, teuf et HappyPeng.</p>
</div>
<br /><img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/fredix.wordpress.com/52/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/fredix.wordpress.com/52/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/fredix.wordpress.com/52/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/fredix.wordpress.com/52/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/fredix.wordpress.com/52/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/fredix.wordpress.com/52/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/fredix.wordpress.com/52/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/fredix.wordpress.com/52/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/fredix.wordpress.com/52/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/fredix.wordpress.com/52/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/fredix.wordpress.com/52/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/fredix.wordpress.com/52/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/fredix.wordpress.com/52/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/fredix.wordpress.com/52/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/fredix.wordpress.com/52/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/fredix.wordpress.com/52/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=frederic.logier.org&amp;blog=3098224&amp;post=52&amp;subd=fredix&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://frederic.logier.org/2006/04/11/ihm-asynchrone/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/0fc8e5d51ed3c0726b2826e8caeb8017?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">fredix</media:title>
		</media:content>
	</item>
	</channel>
</rss>