Bonjour,
Je n'arrive pas bien à cerner la différence entre les threads, les delegates, la méthode Me.Invoke et Me.BeginInvoke....
Je me perds un peu avec tous cela.
Quelqu'un a-t'il la science infuse pour me l'expliquer ?
D'avance merci beaucoup
Bonjour,
Je n'arrive pas bien à cerner la différence entre les threads, les delegates, la méthode Me.Invoke et Me.BeginInvoke....
Je me perds un peu avec tous cela.
Quelqu'un a-t'il la science infuse pour me l'expliquer ?
D'avance merci beaucoup
un thread instancié via system.threading.thread permet de démarrer un nouveau processus à l'adresse d'une sub
ca permet de ne pas bloquer l'interface utilisateur pendant des traitements long
une fois la sub terminée, le thread s'arrete naturrelement (la sub peut en appeler d'autres)
un délégué est un genre de pointeur de sub
ca peut servir à de l'évènementiel, ca peut aussi servir à changer de thread
explication du changement de thread:
un thread autre que le thread principal n'a pas le droit de manipuler des objets graphiques des fenetres (sinon erreur)
donc dans ce cas on passe par un délégué
la classe control (rappel, form hérite de control) possède une propriété InvokeRequired qui permet de savoir s'il est nécessaire de changer de thread
quand le processus qui appelle InvokeRequired est celui qui a créé le control ca retourne false (= pas besoin) si on est sur un autre thread ca va retourner true
ici j'explique comment écrire une delegate sub
http://www.developpez.net/forums/sho...21&postcount=9
donc revenons à nos moutons, imaginons une sub qui va modifier la propriété texte d'un bouton et que cette sub pourra etre appelée par différentes sub
me étant la fenetre, si on vient d'un autre thread, invokerequired =true, donc on demande à me d'appeler sur son thread le délégué, qui pointe vers la meme sub, et donc on se retrouve au meme endroit, mais ce coup ci invokerequired est false donc ca tape le textbox
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 private Delegate Sub DS_ModifierTexte private _Var_DS_ModifierTexte as new ModifierTexte(adressof ModifierTexte) public sub ModifierTexte() if me.invokerequired then me.invoke(_Var_DS_ModifierTexte) end if textbox1.text = "" end sub
pour ce qui est du begininvoke, ca fait la meme chose qu'invoke sauf que ca part sur un autre thread (géré par la classe qui propose begininvoke)
donc ca n'attend pas que le traitement soit fini pour passer à la ligne d'après dans le code
alors qu'invoke attend que l'invoke soit fini pour passer à la suite
Partager