Feb.09

La galère des Threads sous .NET 2.0 :-)

On s’est retrouvé, ben et moi, lors de l’ecriture de notre logiciel Skin.be dans une petite galère avec l’utilisation des Threads sous le .NET 2.0 !

C’est quoi un thread ?
Lorsque vous démarrez une application, Windows crée automatiquement un nouveau « thread » d’exécution spécialement pour votre application. Ce « thread » permet d’isoler votre application dans son propre environnement unique, bien séparé de tout autre application. Attention, il ne faut pas les confondre avec les AppDomain ! Un thread est une « unité d’execution » alors qu’un domaine d’application et une « unité d’isolation d’execution » !! J’eclaircirai tout cela plus tard…

A quoi ca sert un thread ?
Les threads permettent d’effectuer plusieurs taches dans votre programme en même temps : le multi-tache ! Imaginez un serveur web mono-thread où 2 clients se connecte en meme temps : 1er arrivé, 1er servi : 1 seul client à la fois ce qui n’est pas super !! Hors avec les threads, dès qu’un client se connecte, un nouveau thread est lancé independement des autres pour pouvoir « s’occuper » de nouveau client !

Rapport entre Skin.be et les threads
Dans notre petit logiciel, quand vous cliquez sur « Télécharger », une fonction est appellée et vient faire une boucle pour télécharger toutes les images. Seulement cette fonction étant très gourmande et étant executée dans le meme thread fige l’interface graphique !
Notre programme devient donc tout « blanc » (plus de rafraichissement graphique) et on peut plus le controler a moins d’attendre la fin du téléchargement ! Pas génial hein !
Donc pour remedier a cela, nous executons la fonction de téléchargement dans un autre thread ce qui permet de garder le contrôle sur notre GUI (interface graphique du programme).

La où ca devient galère !
Le probleme dans notre cas, c’est qu’a chaque image téléchargée, notre fonction de Telechargement rafraichit la GUI au moyen d’une ProgressBar (10%..20%..30%…) et d’un petit label: « Telechargement de la photo 2/8 ».
Seulement sous .NET 2.0, si vous modifiez un controle d’un autre thread vous aurez un beau message de votre compilateur :

Illegal cross-thread operation: Control ‘ProgressBar’ accessed from a thread other than the thread it was created on

Le .NET framework 2.0 détecte lui même que l’on cherche a modifier une propriété du label dans un autre thread que le thread principal ce qui provoque cette erreur !

Comment fait on alors ?
Il faut en fait demander au contrôle d’effectuer lui même la resynchronisation ! Pour cela on va utiliser des délégués.
Déclarons-le au debut de notre programme :

Puis dans votre code, créez une fonction pour la mise a jour de votre contrôle (ou vos contrôles) :

Dans notre cas la fonction UpdateControlProgress récupérera l’avancement dans l’objet sender qui sera convertie en Integer, puis on viendra mettre a jour notre ProgressBar et label en fonction.
Il ne reste plus qu’a appeler cette fonction par notre délégué dans le code de votre Thread :

(nb: i est un Integer representant l’avancement du téléchargement dans notre application !)

C’etait simple non ? 🙂

Dev,.NET
Share this Story:
  • facebook
  • twitter
  • gplus

Comments(5)

  1. kinji
    le 12 février 2006 à 00:07

    Eh bah, heureusement que je regarde mes referrers pour retrouver des sites hein 😉
    Sympa le blog, on voit l’accro à Microsoft 😉

  2. tservolle
    le 4 septembre 2006 à 10:40

    Enfin un article qui commente clairement ce probleme .Net 2.0

    Juste un petit commentaire, ya un probleme de mise en page, on voit pas ton code, alors qu’il est tres important pour la comprehension d l’article

  3. sebeuh
    le 4 septembre 2006 à 13:49

    En effet, il y a des petits problèmes de mise en page sous IE. Utilisant Firefox, je n’avais pas remarqué ce problème. Je le corrige dès que je peux 🙂 Merci pour ton commentaire tservolle.

  4. Incigalk
    le 13 décembre 2008 à 20:17

    Thanks!,

  5. billy_600
    le 8 mars 2009 à 12:04

    Y a -t-il la même chose pour une page WEB
    sous Framework 2.0 et sans Ajax?????

Leave a comment

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur la façon dont les données de vos commentaires sont traitées.

Comment