j'ai un problème tout simple :
dans une windows Form, j'au un bouton 'Go' qui va appeler la fonction
MaClasse.Go( ).
la fonction MaClasse.Go( ) va démarrer un thread pour faire un calcul, et le
laisser tourner jusqu'à ce qu'il ait fini.
j'aimerai que la classe MaClasse soit prévenue lorsque ce thread se termine.
Mais je ne peux pas faire de pooling... Ma windows Form qui a initié le
thread via la fonction Go ne peut pas tester à intervale régulier l'état du
thread pour savoir quand il a fini.
j'aimerai donc que 'MaClasse' mette en public une delegate
'OperationIsFinished', dans laquelle la classe MaClase, mais aussi la
windows Form pourrait ajouter des event handler à exécuter lorsque le thread
se termine.
C'est là qu'est mon problème : L'event sera levé par le thread qui a fait le
calcul, et si ma windows form a ajouté un event handler pour faire des
opérations sur ses contrôles, il y aura un pb multithread sur les controls.
Je voudrai pouvoir utiliser le systeme Invoke pour déclencher cet événement,
mais MaClasse, qui défini cette delegate, ne dérive pas de Control...
Comment puis-je faire ?
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Patrick Philippot
palaga wrote:
j'ai un problème tout simple : dans une windows Form, j'au un bouton 'Go' qui va appeler la fonction MaClasse.Go( ). la fonction MaClasse.Go( ) va démarrer un thread pour faire un calcul, et le laisser tourner jusqu'à ce qu'il ait fini. j'aimerai que la classe MaClasse soit prévenue lorsque ce thread se termine. Mais je ne peux pas faire de pooling... Ma windows Form qui a initié le thread via la fonction Go ne peut pas tester à intervale régulier l'état du thread pour savoir quand il a fini.
Si le code (disons thread principal) qui a lancé le thread de calcul ne peut pas lui-même se mettre en attente par un Join une fois qu'il n'a plus rien à faire, le plus simple est de démarrer, avant de lancer le thread de calcul, un deuxième thread qui se synchronise sur l'event qui va être généré par le dit thread de calcul. Quand ce deuxième thread en attente est libéré (parce que l'event a été activé), il effectue le travail prévu. Cela n'a pas d'impact sur ce que le thread principal est en train de faire à ce moment-là.
-- Patrick Philippot - Microsoft MVP MainSoft Consulting Services www.mainsoft.fr
palaga wrote:
j'ai un problème tout simple :
dans une windows Form, j'au un bouton 'Go' qui va appeler la fonction
MaClasse.Go( ).
la fonction MaClasse.Go( ) va démarrer un thread pour faire un
calcul, et le laisser tourner jusqu'à ce qu'il ait fini.
j'aimerai que la classe MaClasse soit prévenue lorsque ce thread se
termine. Mais je ne peux pas faire de pooling... Ma windows Form qui
a initié le thread via la fonction Go ne peut pas tester à intervale
régulier l'état du thread pour savoir quand il a fini.
Si le code (disons thread principal) qui a lancé le thread de calcul ne
peut pas lui-même se mettre en attente par un Join une fois qu'il n'a
plus rien à faire, le plus simple est de démarrer, avant de lancer le
thread de calcul, un deuxième thread qui se synchronise sur l'event qui
va être généré par le dit thread de calcul. Quand ce deuxième thread en
attente est libéré (parce que l'event a été activé), il effectue le
travail prévu. Cela n'a pas d'impact sur ce que le thread principal est
en train de faire à ce moment-là.
--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr
j'ai un problème tout simple : dans une windows Form, j'au un bouton 'Go' qui va appeler la fonction MaClasse.Go( ). la fonction MaClasse.Go( ) va démarrer un thread pour faire un calcul, et le laisser tourner jusqu'à ce qu'il ait fini. j'aimerai que la classe MaClasse soit prévenue lorsque ce thread se termine. Mais je ne peux pas faire de pooling... Ma windows Form qui a initié le thread via la fonction Go ne peut pas tester à intervale régulier l'état du thread pour savoir quand il a fini.
Si le code (disons thread principal) qui a lancé le thread de calcul ne peut pas lui-même se mettre en attente par un Join une fois qu'il n'a plus rien à faire, le plus simple est de démarrer, avant de lancer le thread de calcul, un deuxième thread qui se synchronise sur l'event qui va être généré par le dit thread de calcul. Quand ce deuxième thread en attente est libéré (parce que l'event a été activé), il effectue le travail prévu. Cela n'a pas d'impact sur ce que le thread principal est en train de faire à ce moment-là.
-- Patrick Philippot - Microsoft MVP MainSoft Consulting Services www.mainsoft.fr