Multi tâche et composants graphiques


Voilà une action que je dois réaliser régulièrement (presque à chaque développement) : mettre en place un processus multi-thread qui doit gérer des objets du premier thread (les composants graphiques de la Windows Form).

Classe de traitement

La première étape est de créer une classe qui sera exécutée plusieurs fois (en multi-thread). Elle peut communiquer avec le processus principal via un événement StatusChanged qui retourne un objet contenant le message du statut. Pour cela nous devons créer la classe StatusChangedEventArgs qui est utilisée en argument de l’événement .

Ensuite, nous pouvons créer la classe de traiement ConversionProcess qui dispose d’une méthode Start pour démarrer le processus et d’un événement StatusChanged.

La dernière étape est d’utiliser le processus, et donc de créer un Thread.

Comme on le voit dans la méthode qui capture l’événement StatusChanged, nous récupérons le contenu du message (e.Message) pour l’afficher dans un composant graphique qui fait partie du thread principal (la fenêtre windows).

L’exécution de ce message enclenche automatiquement une erreur de type Cross-thread operation not valid.

Gestion du Cross-Threading

Afin déviter ce message d’erreur, et donc de gérer le Cross-Threading simplement, il suffit de passer la référence au processus principal (la fenêtre windows) à l’objet de gestion, via le constructeur et l’interface ISynchronizeInvoke.

Comme on peut le voir dans l’exemple précédent, nous créons également une méthode InvoqueStatusChanged qui se charge de vérifier si le processus principal (_owner) accepte le cross-threading.

Conclusion

L’exécution de ce code (et de l’interface ISynchronizeInvoke) permet ainsi de facilement récupérer le message e.Message de l’évenement StatusChanged envoyé par un thread de gestion, et de l’afficher dans un composant graphique du thread principal.

Cliquez ici pour télécharger le code source.

Advertisements
Tagged with:
Posted in Formation

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

Follow me
   RSS Feed    Twitter    Linked In

Write you email address to subscribe at this blog and to receive new posts by mail.

Join 565 other followers

Who I am?






%d bloggers like this: