2018-08-19

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.

Leave a Reply

Your email address will not be published. Required fields are marked *