je ne maîtrise pas vraiment les threads, mais je pense que mon problème
n'est pas trop compliqué. Je vous remercie d'avance de m'éclairer.
Dans un formulaire MaFeuille, j'ai bouton (qui s'appelle BoutonAnnuler)
et un UserControl MonControle.
Lors du chargement de la feuille (évènement MaFeuille_Load), je crée un
thread qui va appeller une certaine méthode MonControle.Calculer().
Jusque là, tout se passe bien : mon controle fait ses calculs, et
l'utilisateur peut arrêter à n'importe quel moment en appuyant su le
bouton BoutonAnnuler (méthode Abort de Thread).
Le souci, c'est si l'utilisateur ne fait rien et attend la fin du
calcul. Dans ce cas, MonControle.Execute() tente de rendre invisible le
controle :
this.visible = false;
Et j'obtiens une exception m'indiquant que le thread en cours n'est pas
celui qui a créé l'objet (ce que je comprends tout à fait).
Ce que j'aimerais, c'est que le thread secondaire (celui qui fait les
calculs) rende la main au thread principal pour que l'application suive
son cours normalement.
Je ne sais pas comment faire.
Merci pour votre aide et joyeux Noël à tous.
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
Simon Mourier |MS]
Je vous conseille la lecture de cet excellent article
How To Stop a Thread in .NET (and Why Thread.Abort is Evil) http://www.interact-sw.co.uk/iangblog/2004/11/12/cancellation
Simon.
"Boris Sargos" wrote in message news:41c9a4a0$0$30813$
Salut à tous,
je ne maîtrise pas vraiment les threads, mais je pense que mon problème n'est pas trop compliqué. Je vous remercie d'avance de m'éclairer.
Dans un formulaire MaFeuille, j'ai bouton (qui s'appelle BoutonAnnuler) et un UserControl MonControle. Lors du chargement de la feuille (évènement MaFeuille_Load), je crée un thread qui va appeller une certaine méthode MonControle.Calculer(). Jusque là, tout se passe bien : mon controle fait ses calculs, et l'utilisateur peut arrêter à n'importe quel moment en appuyant su le bouton BoutonAnnuler (méthode Abort de Thread). Le souci, c'est si l'utilisateur ne fait rien et attend la fin du calcul. Dans ce cas, MonControle.Execute() tente de rendre invisible le controle : this.visible = false; Et j'obtiens une exception m'indiquant que le thread en cours n'est pas celui qui a créé l'objet (ce que je comprends tout à fait). Ce que j'aimerais, c'est que le thread secondaire (celui qui fait les calculs) rende la main au thread principal pour que l'application suive son cours normalement.
Je ne sais pas comment faire. Merci pour votre aide et joyeux Noël à tous.
Boris.
Je vous conseille la lecture de cet excellent article
How To Stop a Thread in .NET (and Why Thread.Abort is Evil)
http://www.interact-sw.co.uk/iangblog/2004/11/12/cancellation
Simon.
"Boris Sargos" <bsargos@wanadoo.fr> wrote in message
news:41c9a4a0$0$30813$8fcfb975@news.wanadoo.fr...
Salut à tous,
je ne maîtrise pas vraiment les threads, mais je pense que mon problème
n'est pas trop compliqué. Je vous remercie d'avance de m'éclairer.
Dans un formulaire MaFeuille, j'ai bouton (qui s'appelle BoutonAnnuler)
et un UserControl MonControle.
Lors du chargement de la feuille (évènement MaFeuille_Load), je crée un
thread qui va appeller une certaine méthode MonControle.Calculer().
Jusque là, tout se passe bien : mon controle fait ses calculs, et
l'utilisateur peut arrêter à n'importe quel moment en appuyant su le
bouton BoutonAnnuler (méthode Abort de Thread).
Le souci, c'est si l'utilisateur ne fait rien et attend la fin du
calcul. Dans ce cas, MonControle.Execute() tente de rendre invisible le
controle :
this.visible = false;
Et j'obtiens une exception m'indiquant que le thread en cours n'est pas
celui qui a créé l'objet (ce que je comprends tout à fait).
Ce que j'aimerais, c'est que le thread secondaire (celui qui fait les
calculs) rende la main au thread principal pour que l'application suive
son cours normalement.
Je ne sais pas comment faire.
Merci pour votre aide et joyeux Noël à tous.
Je vous conseille la lecture de cet excellent article
How To Stop a Thread in .NET (and Why Thread.Abort is Evil) http://www.interact-sw.co.uk/iangblog/2004/11/12/cancellation
Simon.
"Boris Sargos" wrote in message news:41c9a4a0$0$30813$
Salut à tous,
je ne maîtrise pas vraiment les threads, mais je pense que mon problème n'est pas trop compliqué. Je vous remercie d'avance de m'éclairer.
Dans un formulaire MaFeuille, j'ai bouton (qui s'appelle BoutonAnnuler) et un UserControl MonControle. Lors du chargement de la feuille (évènement MaFeuille_Load), je crée un thread qui va appeller une certaine méthode MonControle.Calculer(). Jusque là, tout se passe bien : mon controle fait ses calculs, et l'utilisateur peut arrêter à n'importe quel moment en appuyant su le bouton BoutonAnnuler (méthode Abort de Thread). Le souci, c'est si l'utilisateur ne fait rien et attend la fin du calcul. Dans ce cas, MonControle.Execute() tente de rendre invisible le controle : this.visible = false; Et j'obtiens une exception m'indiquant que le thread en cours n'est pas celui qui a créé l'objet (ce que je comprends tout à fait). Ce que j'aimerais, c'est que le thread secondaire (celui qui fait les calculs) rende la main au thread principal pour que l'application suive son cours normalement.
Je ne sais pas comment faire. Merci pour votre aide et joyeux Noël à tous.
Boris.
Boris Sargos
Simon Mourier |MS] a écrit :
Je vous conseille la lecture de cet excellent article
How To Stop a Thread in .NET (and Why Thread.Abort is Evil) http://www.interact-sw.co.uk/iangblog/2004/11/12/cancellation
Simon.
Merci Simon pour ta réponse rapide. L'article est très intéressant. J'ai bien conscience que Abort n'est pas une bonne alternative. Mais pour l'instant, mon souci n'est pas d'interrompre mon thread. Il est plutôt : comment revenir au thread principal (donc celui qui a créé ce second thread) une fois les calculs sur le second thread terminé ?
Merci.
Boris.
Simon Mourier |MS] a écrit :
Je vous conseille la lecture de cet excellent article
How To Stop a Thread in .NET (and Why Thread.Abort is Evil)
http://www.interact-sw.co.uk/iangblog/2004/11/12/cancellation
Simon.
Merci Simon pour ta réponse rapide. L'article est très intéressant.
J'ai bien conscience que Abort n'est pas une bonne alternative. Mais
pour l'instant, mon souci n'est pas d'interrompre mon thread. Il est
plutôt : comment revenir au thread principal (donc celui qui a créé ce
second thread) une fois les calculs sur le second thread terminé ?
Je vous conseille la lecture de cet excellent article
How To Stop a Thread in .NET (and Why Thread.Abort is Evil) http://www.interact-sw.co.uk/iangblog/2004/11/12/cancellation
Simon.
Merci Simon pour ta réponse rapide. L'article est très intéressant. J'ai bien conscience que Abort n'est pas une bonne alternative. Mais pour l'instant, mon souci n'est pas d'interrompre mon thread. Il est plutôt : comment revenir au thread principal (donc celui qui a créé ce second thread) une fois les calculs sur le second thread terminé ?
Merci.
Boris.
Simon Mourier [MS]
L'intêret de l'arcticle c'est aussi de comprendre que normalement, il n'y a pas de raison pour avoir un Abort. Ca veut dire qu'on peut concevoir son application différemment, et je pense que c'est votre cas.
Si le thread a fini son travail, je ne comprends pas comment il peut garder "la main"? (sachant qu'en fait le problème vient des forms, pas des threads)
Simon.
"Boris Sargos" a écrit dans le message de news: 41c9ac32$0$9536$
Simon Mourier |MS] a écrit :
Je vous conseille la lecture de cet excellent article
How To Stop a Thread in .NET (and Why Thread.Abort is Evil) http://www.interact-sw.co.uk/iangblog/2004/11/12/cancellation
Simon.
Merci Simon pour ta réponse rapide. L'article est très intéressant. J'ai bien conscience que Abort n'est pas une bonne alternative. Mais pour l'instant, mon souci n'est pas d'interrompre mon thread. Il est plutôt : comment revenir au thread principal (donc celui qui a créé ce second thread) une fois les calculs sur le second thread terminé ?
Merci.
Boris.
L'intêret de l'arcticle c'est aussi de comprendre que normalement, il n'y a
pas de raison pour avoir un Abort. Ca veut dire qu'on peut concevoir son
application différemment, et je pense que c'est votre cas.
Si le thread a fini son travail, je ne comprends pas comment il peut garder
"la main"? (sachant qu'en fait le problème vient des forms, pas des threads)
Simon.
"Boris Sargos" <bsargos@wanadoo.fr> a écrit dans le message de news:
41c9ac32$0$9536$8fcfb975@news.wanadoo.fr...
Simon Mourier |MS] a écrit :
Je vous conseille la lecture de cet excellent article
How To Stop a Thread in .NET (and Why Thread.Abort is Evil)
http://www.interact-sw.co.uk/iangblog/2004/11/12/cancellation
Simon.
Merci Simon pour ta réponse rapide. L'article est très intéressant.
J'ai bien conscience que Abort n'est pas une bonne alternative. Mais pour
l'instant, mon souci n'est pas d'interrompre mon thread. Il est plutôt :
comment revenir au thread principal (donc celui qui a créé ce second
thread) une fois les calculs sur le second thread terminé ?
L'intêret de l'arcticle c'est aussi de comprendre que normalement, il n'y a pas de raison pour avoir un Abort. Ca veut dire qu'on peut concevoir son application différemment, et je pense que c'est votre cas.
Si le thread a fini son travail, je ne comprends pas comment il peut garder "la main"? (sachant qu'en fait le problème vient des forms, pas des threads)
Simon.
"Boris Sargos" a écrit dans le message de news: 41c9ac32$0$9536$
Simon Mourier |MS] a écrit :
Je vous conseille la lecture de cet excellent article
How To Stop a Thread in .NET (and Why Thread.Abort is Evil) http://www.interact-sw.co.uk/iangblog/2004/11/12/cancellation
Simon.
Merci Simon pour ta réponse rapide. L'article est très intéressant. J'ai bien conscience que Abort n'est pas une bonne alternative. Mais pour l'instant, mon souci n'est pas d'interrompre mon thread. Il est plutôt : comment revenir au thread principal (donc celui qui a créé ce second thread) une fois les calculs sur le second thread terminé ?
Merci.
Boris.
Boris Sargos
Oui Simon, j'ai très bien compris que je ne dois pas utiliser Abort. D'ailleurs je connaissais l'utilisation d'une variable d'état préconisée dans l'article. Mais avant de modifier significativement un code qui marchait très bien en mode synchrone, je souhaitais construire une bonne structure de threads sur ma feuille. Donc, pour le moment, Abort n'est pas ma préoccupation, puisque je sais comment le résoudre.
En revanche, effectivement, c'est peut-être l'architecture de mon application qui est à revoir. Et c'est la raison de mon mail ... Tu as tout à fait raison dans ton mail précédent en t'étonnant que mon thread "garde la main". Je me suis mal exprimé. En fait, si tu as encore un peu de patience, voilà ce qui se passe. Pendant que mon thread secondaire fait ses calculs, l'utilisateur a la possibilité d'arrêter l'application par le bouton BoutonAnnuler. Jusque là c'est classique. Dans le cas contraire, une fois les calculs finis, la feuille conteneur de l'objet MonControle, doit rendre invisible MonControle pour en afficher un autre (du genre Label, qui récapitule les calculs effectués). En fait, une fois les calculs terminés, MonControle informe la feuille conteneur que les calculs sont finis. En théorie, celle-ci devrait pouvoir rendre MonControle invisible. Mais, ca ne fonctionne pas. Car le thread qui a créé MonControle est le thread principal, et celui qui cherche à le masquer est le thread secondaire. Donc, comme tu peux le voir, mon problème n'a rien à voir avec Abort :-)
Voilà, merci pour ton aide et joyeux Noël Simon.
Boris.
Oui Simon, j'ai très bien compris que je ne dois pas utiliser Abort.
D'ailleurs je connaissais l'utilisation d'une variable d'état préconisée
dans l'article. Mais avant de modifier significativement un code qui
marchait très bien en mode synchrone, je souhaitais construire une bonne
structure de threads sur ma feuille. Donc, pour le moment, Abort n'est
pas ma préoccupation, puisque je sais comment le résoudre.
En revanche, effectivement, c'est peut-être l'architecture de mon
application qui est à revoir. Et c'est la raison de mon mail ...
Tu as tout à fait raison dans ton mail précédent en t'étonnant que mon
thread "garde la main". Je me suis mal exprimé.
En fait, si tu as encore un peu de patience, voilà ce qui se passe.
Pendant que mon thread secondaire fait ses calculs, l'utilisateur a la
possibilité d'arrêter l'application par le bouton BoutonAnnuler. Jusque
là c'est classique. Dans le cas contraire, une fois les calculs finis,
la feuille conteneur de l'objet MonControle, doit rendre invisible
MonControle pour en afficher un autre (du genre Label, qui récapitule
les calculs effectués).
En fait, une fois les calculs terminés, MonControle informe la feuille
conteneur que les calculs sont finis. En théorie, celle-ci devrait
pouvoir rendre MonControle invisible. Mais, ca ne fonctionne pas. Car le
thread qui a créé MonControle est le thread principal, et celui qui
cherche à le masquer est le thread secondaire.
Donc, comme tu peux le voir, mon problème n'a rien à voir avec Abort :-)
Oui Simon, j'ai très bien compris que je ne dois pas utiliser Abort. D'ailleurs je connaissais l'utilisation d'une variable d'état préconisée dans l'article. Mais avant de modifier significativement un code qui marchait très bien en mode synchrone, je souhaitais construire une bonne structure de threads sur ma feuille. Donc, pour le moment, Abort n'est pas ma préoccupation, puisque je sais comment le résoudre.
En revanche, effectivement, c'est peut-être l'architecture de mon application qui est à revoir. Et c'est la raison de mon mail ... Tu as tout à fait raison dans ton mail précédent en t'étonnant que mon thread "garde la main". Je me suis mal exprimé. En fait, si tu as encore un peu de patience, voilà ce qui se passe. Pendant que mon thread secondaire fait ses calculs, l'utilisateur a la possibilité d'arrêter l'application par le bouton BoutonAnnuler. Jusque là c'est classique. Dans le cas contraire, une fois les calculs finis, la feuille conteneur de l'objet MonControle, doit rendre invisible MonControle pour en afficher un autre (du genre Label, qui récapitule les calculs effectués). En fait, une fois les calculs terminés, MonControle informe la feuille conteneur que les calculs sont finis. En théorie, celle-ci devrait pouvoir rendre MonControle invisible. Mais, ca ne fonctionne pas. Car le thread qui a créé MonControle est le thread principal, et celui qui cherche à le masquer est le thread secondaire. Donc, comme tu peux le voir, mon problème n'a rien à voir avec Abort :-)
Voilà, merci pour ton aide et joyeux Noël Simon.
Boris.
Simon Mourier [MS]
Hum... ce que je veux dire, c'est qu'il y a donc une contrainte et cette contrainte force l'architecture. Il faut peut-être changer le fonctionnement pour que justement le même thread créee, affiche et masque le contrôle?
Je ne suis pas sûr de comprendre d'ou vient le problème. Le code suivant par exemple fonctionne (bien que Abort, beeerk)
public class Form1 : System.Windows.Forms.Form { private WindowsApplication1.UserControl1 userControl11; private System.Windows.Forms.Button buttonStart; private System.Windows.Forms.Button buttonStop; private System.ComponentModel.Container components = null; private Thread _thread; private int _i;
public Form1() { InitializeComponent(); buttonStart_Click(this, EventArgs.Empty); }
"Boris Sargos" a écrit dans le message de news: 41c9ba19$0$12877$
Oui Simon, j'ai très bien compris que je ne dois pas utiliser Abort. D'ailleurs je connaissais l'utilisation d'une variable d'état préconisée dans l'article. Mais avant de modifier significativement un code qui marchait très bien en mode synchrone, je souhaitais construire une bonne structure de threads sur ma feuille. Donc, pour le moment, Abort n'est pas ma préoccupation, puisque je sais comment le résoudre.
En revanche, effectivement, c'est peut-être l'architecture de mon application qui est à revoir. Et c'est la raison de mon mail ... Tu as tout à fait raison dans ton mail précédent en t'étonnant que mon thread "garde la main". Je me suis mal exprimé. En fait, si tu as encore un peu de patience, voilà ce qui se passe. Pendant que mon thread secondaire fait ses calculs, l'utilisateur a la possibilité d'arrêter l'application par le bouton BoutonAnnuler. Jusque là c'est classique. Dans le cas contraire, une fois les calculs finis, la feuille conteneur de l'objet MonControle, doit rendre invisible MonControle pour en afficher un autre (du genre Label, qui récapitule les calculs effectués). En fait, une fois les calculs terminés, MonControle informe la feuille conteneur que les calculs sont finis. En théorie, celle-ci devrait pouvoir rendre MonControle invisible. Mais, ca ne fonctionne pas. Car le thread qui a créé MonControle est le thread principal, et celui qui cherche à le masquer est le thread secondaire. Donc, comme tu peux le voir, mon problème n'a rien à voir avec Abort :-)
Voilà, merci pour ton aide et joyeux Noël Simon.
Boris.
Hum... ce que je veux dire, c'est qu'il y a donc une contrainte et cette
contrainte force l'architecture. Il faut peut-être changer le fonctionnement
pour que
justement le même thread créee, affiche et masque le contrôle?
Je ne suis pas sûr de comprendre d'ou vient le problème. Le code suivant par
exemple fonctionne (bien que Abort, beeerk)
public class Form1 : System.Windows.Forms.Form
{
private WindowsApplication1.UserControl1 userControl11;
private System.Windows.Forms.Button buttonStart;
private System.Windows.Forms.Button buttonStop;
private System.ComponentModel.Container components = null;
private Thread _thread;
private int _i;
public Form1()
{
InitializeComponent();
buttonStart_Click(this, EventArgs.Empty);
}
"Boris Sargos" <bsargos@wanadoo.fr> a écrit dans le message de news:
41c9ba19$0$12877$8fcfb975@news.wanadoo.fr...
Oui Simon, j'ai très bien compris que je ne dois pas utiliser Abort.
D'ailleurs je connaissais l'utilisation d'une variable d'état préconisée
dans l'article. Mais avant de modifier significativement un code qui
marchait très bien en mode synchrone, je souhaitais construire une bonne
structure de threads sur ma feuille. Donc, pour le moment, Abort n'est pas
ma préoccupation, puisque je sais comment le résoudre.
En revanche, effectivement, c'est peut-être l'architecture de mon
application qui est à revoir. Et c'est la raison de mon mail ...
Tu as tout à fait raison dans ton mail précédent en t'étonnant que mon
thread "garde la main". Je me suis mal exprimé.
En fait, si tu as encore un peu de patience, voilà ce qui se passe.
Pendant que mon thread secondaire fait ses calculs, l'utilisateur a la
possibilité d'arrêter l'application par le bouton BoutonAnnuler. Jusque là
c'est classique. Dans le cas contraire, une fois les calculs finis, la
feuille conteneur de l'objet MonControle, doit rendre invisible
MonControle pour en afficher un autre (du genre Label, qui récapitule les
calculs effectués).
En fait, une fois les calculs terminés, MonControle informe la feuille
conteneur que les calculs sont finis. En théorie, celle-ci devrait pouvoir
rendre MonControle invisible. Mais, ca ne fonctionne pas. Car le thread
qui a créé MonControle est le thread principal, et celui qui cherche à le
masquer est le thread secondaire.
Donc, comme tu peux le voir, mon problème n'a rien à voir avec Abort :-)
Hum... ce que je veux dire, c'est qu'il y a donc une contrainte et cette contrainte force l'architecture. Il faut peut-être changer le fonctionnement pour que justement le même thread créee, affiche et masque le contrôle?
Je ne suis pas sûr de comprendre d'ou vient le problème. Le code suivant par exemple fonctionne (bien que Abort, beeerk)
public class Form1 : System.Windows.Forms.Form { private WindowsApplication1.UserControl1 userControl11; private System.Windows.Forms.Button buttonStart; private System.Windows.Forms.Button buttonStop; private System.ComponentModel.Container components = null; private Thread _thread; private int _i;
public Form1() { InitializeComponent(); buttonStart_Click(this, EventArgs.Empty); }
"Boris Sargos" a écrit dans le message de news: 41c9ba19$0$12877$
Oui Simon, j'ai très bien compris que je ne dois pas utiliser Abort. D'ailleurs je connaissais l'utilisation d'une variable d'état préconisée dans l'article. Mais avant de modifier significativement un code qui marchait très bien en mode synchrone, je souhaitais construire une bonne structure de threads sur ma feuille. Donc, pour le moment, Abort n'est pas ma préoccupation, puisque je sais comment le résoudre.
En revanche, effectivement, c'est peut-être l'architecture de mon application qui est à revoir. Et c'est la raison de mon mail ... Tu as tout à fait raison dans ton mail précédent en t'étonnant que mon thread "garde la main". Je me suis mal exprimé. En fait, si tu as encore un peu de patience, voilà ce qui se passe. Pendant que mon thread secondaire fait ses calculs, l'utilisateur a la possibilité d'arrêter l'application par le bouton BoutonAnnuler. Jusque là c'est classique. Dans le cas contraire, une fois les calculs finis, la feuille conteneur de l'objet MonControle, doit rendre invisible MonControle pour en afficher un autre (du genre Label, qui récapitule les calculs effectués). En fait, une fois les calculs terminés, MonControle informe la feuille conteneur que les calculs sont finis. En théorie, celle-ci devrait pouvoir rendre MonControle invisible. Mais, ca ne fonctionne pas. Car le thread qui a créé MonControle est le thread principal, et celui qui cherche à le masquer est le thread secondaire. Donc, comme tu peux le voir, mon problème n'a rien à voir avec Abort :-)
Voilà, merci pour ton aide et joyeux Noël Simon.
Boris.
Boris Sargos
Merci pour ton code Simon. C'est à quelques mots près, l'essence même de mon code. Je suis donc très étonné de savoir que ça fonctionne chez toi. Il faut vraiment que je regarde çà de plus près. Dommage, je pars quelques jours en vacances ...
Je te recontacterai à mon retour pour te dire ce que j'en ai compris. Encore merci, et bonnes fêtes.
Boris.
Merci pour ton code Simon.
C'est à quelques mots près, l'essence même de mon code. Je suis donc
très étonné de savoir que ça fonctionne chez toi. Il faut vraiment que
je regarde çà de plus près. Dommage, je pars quelques jours en vacances ...
Je te recontacterai à mon retour pour te dire ce que j'en ai compris.
Encore merci, et bonnes fêtes.
Merci pour ton code Simon. C'est à quelques mots près, l'essence même de mon code. Je suis donc très étonné de savoir que ça fonctionne chez toi. Il faut vraiment que je regarde çà de plus près. Dommage, je pars quelques jours en vacances ...
Je te recontacterai à mon retour pour te dire ce que j'en ai compris. Encore merci, et bonnes fêtes.
Boris.
palaga
je n'ai pas tout suivi dans le détail, mais si je peux apporter un éclaircissement sur un point particulier : Les 'Forms' n'aiment pas du tout le multithread. Il faut que ce soit toujours le même thread qui ouvre, met à jour, et ferme un Control. Pour ça, les thread 'worker' (ceux qui font les calculs) on la possibilité de provoquer des update dans les controls, ou de déclencher dans le thread qui gère les controls des événements, et c'est la seule bonne façon de faire.
Là où ça peche chez toi, c'est le usercontrol1.visible = false que tu exécutes dans ton deuxième thread !! Tu accèdes à un contrôle depuis un thread qui ne l'a pas créé !!! Ca va marcher... ou pas... tout dépend de comment ça ce passe entre les threads... ça marche chez le voisin, pas chez toi, etc...
Regarde dans le détail la doc sur BeginInvoke et les fonctions connexes (EndInvoke, etc...). Ces fonctiosn permettent de déclencher (de manière synchrone ou pas) un évenement (via une delegate) sur le contrôle que tu veux, mais en assurant que ce sera le thread qui a créé le contrôle en question qui va exécuter l'événement ! C'est un peu plus lourd (à peine) à faire, car il faut déclarer la/les delegates dans tes controles, mais c'est garanti que ça ne te petera pas à la g***** un jour ou l'autre.
"Boris Sargos" a écrit dans le message de news: 41c9fb8f$0$12876$
Merci pour ton code Simon. C'est à quelques mots près, l'essence même de mon code. Je suis donc très étonné de savoir que ça fonctionne chez toi. Il faut vraiment que je regarde çà de plus près. Dommage, je pars quelques jours en vacances ...
Je te recontacterai à mon retour pour te dire ce que j'en ai compris. Encore merci, et bonnes fêtes.
Boris.
je n'ai pas tout suivi dans le détail, mais si je peux apporter un
éclaircissement sur un point particulier : Les 'Forms' n'aiment pas du tout
le multithread. Il faut que ce soit toujours le même thread qui ouvre, met à
jour, et ferme un Control. Pour ça, les thread 'worker' (ceux qui font les
calculs) on la possibilité de provoquer des update dans les controls, ou de
déclencher dans le thread qui gère les controls des événements, et c'est la
seule bonne façon de faire.
Là où ça peche chez toi, c'est le usercontrol1.visible = false que tu
exécutes dans ton deuxième thread !! Tu accèdes à un contrôle depuis un
thread qui ne l'a pas créé !!! Ca va marcher... ou pas... tout dépend de
comment ça ce passe entre les threads... ça marche chez le voisin, pas chez
toi, etc...
Regarde dans le détail la doc sur BeginInvoke et les fonctions connexes
(EndInvoke, etc...). Ces fonctiosn permettent de déclencher (de manière
synchrone ou pas) un évenement (via une delegate) sur le contrôle que tu
veux, mais en assurant que ce sera le thread qui a créé le contrôle en
question qui va exécuter l'événement !
C'est un peu plus lourd (à peine) à faire, car il faut déclarer la/les
delegates dans tes controles, mais c'est garanti que ça ne te petera pas à
la g***** un jour ou l'autre.
"Boris Sargos" <bsargos@wanadoo.fr> a écrit dans le message de news:
41c9fb8f$0$12876$8fcfb975@news.wanadoo.fr...
Merci pour ton code Simon.
C'est à quelques mots près, l'essence même de mon code. Je suis donc très
étonné de savoir que ça fonctionne chez toi. Il faut vraiment que je
regarde çà de plus près. Dommage, je pars quelques jours en vacances ...
Je te recontacterai à mon retour pour te dire ce que j'en ai compris.
Encore merci, et bonnes fêtes.
je n'ai pas tout suivi dans le détail, mais si je peux apporter un éclaircissement sur un point particulier : Les 'Forms' n'aiment pas du tout le multithread. Il faut que ce soit toujours le même thread qui ouvre, met à jour, et ferme un Control. Pour ça, les thread 'worker' (ceux qui font les calculs) on la possibilité de provoquer des update dans les controls, ou de déclencher dans le thread qui gère les controls des événements, et c'est la seule bonne façon de faire.
Là où ça peche chez toi, c'est le usercontrol1.visible = false que tu exécutes dans ton deuxième thread !! Tu accèdes à un contrôle depuis un thread qui ne l'a pas créé !!! Ca va marcher... ou pas... tout dépend de comment ça ce passe entre les threads... ça marche chez le voisin, pas chez toi, etc...
Regarde dans le détail la doc sur BeginInvoke et les fonctions connexes (EndInvoke, etc...). Ces fonctiosn permettent de déclencher (de manière synchrone ou pas) un évenement (via une delegate) sur le contrôle que tu veux, mais en assurant que ce sera le thread qui a créé le contrôle en question qui va exécuter l'événement ! C'est un peu plus lourd (à peine) à faire, car il faut déclarer la/les delegates dans tes controles, mais c'est garanti que ça ne te petera pas à la g***** un jour ou l'autre.
"Boris Sargos" a écrit dans le message de news: 41c9fb8f$0$12876$
Merci pour ton code Simon. C'est à quelques mots près, l'essence même de mon code. Je suis donc très étonné de savoir que ça fonctionne chez toi. Il faut vraiment que je regarde çà de plus près. Dommage, je pars quelques jours en vacances ...
Je te recontacterai à mon retour pour te dire ce que j'en ai compris. Encore merci, et bonnes fêtes.
Boris.
Gislain
Bonjour,
Pour faire suite à la longue discution, je pense qu'il peut être interressant de regarder cet exemple (en vb.net, désolé)
j'espère que cela pourra faire avancer les schimilibilik
a+
Gislain.
"Boris Sargos" wrote in message news:41c9a4a0$0$30813$
Salut à tous,
je ne maîtrise pas vraiment les threads, mais je pense que mon problème n'est pas trop compliqué. Je vous remercie d'avance de m'éclairer.
Dans un formulaire MaFeuille, j'ai bouton (qui s'appelle BoutonAnnuler) et un UserControl MonControle. Lors du chargement de la feuille (évènement MaFeuille_Load), je crée un thread qui va appeller une certaine méthode MonControle.Calculer(). Jusque là, tout se passe bien : mon controle fait ses calculs, et l'utilisateur peut arrêter à n'importe quel moment en appuyant su le bouton BoutonAnnuler (méthode Abort de Thread). Le souci, c'est si l'utilisateur ne fait rien et attend la fin du calcul. Dans ce cas, MonControle.Execute() tente de rendre invisible le controle : this.visible = false; Et j'obtiens une exception m'indiquant que le thread en cours n'est pas celui qui a créé l'objet (ce que je comprends tout à fait). Ce que j'aimerais, c'est que le thread secondaire (celui qui fait les calculs) rende la main au thread principal pour que l'application suive son cours normalement.
Je ne sais pas comment faire. Merci pour votre aide et joyeux Noël à tous.
Boris.
Bonjour,
Pour faire suite à la longue discution, je pense qu'il peut être
interressant de regarder cet exemple (en vb.net, désolé)
j'espère que cela pourra faire avancer les schimilibilik
a+
Gislain.
"Boris Sargos" <bsargos@wanadoo.fr> wrote in message
news:41c9a4a0$0$30813$8fcfb975@news.wanadoo.fr...
Salut à tous,
je ne maîtrise pas vraiment les threads, mais je pense que mon problème
n'est pas trop compliqué. Je vous remercie d'avance de m'éclairer.
Dans un formulaire MaFeuille, j'ai bouton (qui s'appelle BoutonAnnuler)
et un UserControl MonControle.
Lors du chargement de la feuille (évènement MaFeuille_Load), je crée un
thread qui va appeller une certaine méthode MonControle.Calculer().
Jusque là, tout se passe bien : mon controle fait ses calculs, et
l'utilisateur peut arrêter à n'importe quel moment en appuyant su le
bouton BoutonAnnuler (méthode Abort de Thread).
Le souci, c'est si l'utilisateur ne fait rien et attend la fin du
calcul. Dans ce cas, MonControle.Execute() tente de rendre invisible le
controle :
this.visible = false;
Et j'obtiens une exception m'indiquant que le thread en cours n'est pas
celui qui a créé l'objet (ce que je comprends tout à fait).
Ce que j'aimerais, c'est que le thread secondaire (celui qui fait les
calculs) rende la main au thread principal pour que l'application suive
son cours normalement.
Je ne sais pas comment faire.
Merci pour votre aide et joyeux Noël à tous.
j'espère que cela pourra faire avancer les schimilibilik
a+
Gislain.
"Boris Sargos" wrote in message news:41c9a4a0$0$30813$
Salut à tous,
je ne maîtrise pas vraiment les threads, mais je pense que mon problème n'est pas trop compliqué. Je vous remercie d'avance de m'éclairer.
Dans un formulaire MaFeuille, j'ai bouton (qui s'appelle BoutonAnnuler) et un UserControl MonControle. Lors du chargement de la feuille (évènement MaFeuille_Load), je crée un thread qui va appeller une certaine méthode MonControle.Calculer(). Jusque là, tout se passe bien : mon controle fait ses calculs, et l'utilisateur peut arrêter à n'importe quel moment en appuyant su le bouton BoutonAnnuler (méthode Abort de Thread). Le souci, c'est si l'utilisateur ne fait rien et attend la fin du calcul. Dans ce cas, MonControle.Execute() tente de rendre invisible le controle : this.visible = false; Et j'obtiens une exception m'indiquant que le thread en cours n'est pas celui qui a créé l'objet (ce que je comprends tout à fait). Ce que j'aimerais, c'est que le thread secondaire (celui qui fait les calculs) rende la main au thread principal pour que l'application suive son cours normalement.
Je ne sais pas comment faire. Merci pour votre aide et joyeux Noël à tous.
Boris.
Bruno Jouhier [MVP]
Il ne faut pas appeler directement this.visible = false à partir de l'autre thread, il faut passer par Control.Invoke. Regarde la doc de Control.Invoke.
Bruno.
"Boris Sargos" a écrit dans le message de news: 41c9a4a0$0$30813$
Salut à tous,
je ne maîtrise pas vraiment les threads, mais je pense que mon problème n'est pas trop compliqué. Je vous remercie d'avance de m'éclairer.
Dans un formulaire MaFeuille, j'ai bouton (qui s'appelle BoutonAnnuler) et un UserControl MonControle. Lors du chargement de la feuille (évènement MaFeuille_Load), je crée un thread qui va appeller une certaine méthode MonControle.Calculer(). Jusque là, tout se passe bien : mon controle fait ses calculs, et l'utilisateur peut arrêter à n'importe quel moment en appuyant su le bouton BoutonAnnuler (méthode Abort de Thread). Le souci, c'est si l'utilisateur ne fait rien et attend la fin du calcul. Dans ce cas, MonControle.Execute() tente de rendre invisible le controle : this.visible = false; Et j'obtiens une exception m'indiquant que le thread en cours n'est pas celui qui a créé l'objet (ce que je comprends tout à fait). Ce que j'aimerais, c'est que le thread secondaire (celui qui fait les calculs) rende la main au thread principal pour que l'application suive son cours normalement.
Je ne sais pas comment faire. Merci pour votre aide et joyeux Noël à tous.
Boris.
Il ne faut pas appeler directement this.visible = false à partir de l'autre
thread, il faut passer par Control.Invoke. Regarde la doc de Control.Invoke.
Bruno.
"Boris Sargos" <bsargos@wanadoo.fr> a écrit dans le message de news:
41c9a4a0$0$30813$8fcfb975@news.wanadoo.fr...
Salut à tous,
je ne maîtrise pas vraiment les threads, mais je pense que mon problème
n'est pas trop compliqué. Je vous remercie d'avance de m'éclairer.
Dans un formulaire MaFeuille, j'ai bouton (qui s'appelle BoutonAnnuler) et
un UserControl MonControle.
Lors du chargement de la feuille (évènement MaFeuille_Load), je crée un
thread qui va appeller une certaine méthode MonControle.Calculer().
Jusque là, tout se passe bien : mon controle fait ses calculs, et
l'utilisateur peut arrêter à n'importe quel moment en appuyant su le
bouton BoutonAnnuler (méthode Abort de Thread).
Le souci, c'est si l'utilisateur ne fait rien et attend la fin du calcul.
Dans ce cas, MonControle.Execute() tente de rendre invisible le controle :
this.visible = false;
Et j'obtiens une exception m'indiquant que le thread en cours n'est pas
celui qui a créé l'objet (ce que je comprends tout à fait).
Ce que j'aimerais, c'est que le thread secondaire (celui qui fait les
calculs) rende la main au thread principal pour que l'application suive
son cours normalement.
Je ne sais pas comment faire.
Merci pour votre aide et joyeux Noël à tous.
Il ne faut pas appeler directement this.visible = false à partir de l'autre thread, il faut passer par Control.Invoke. Regarde la doc de Control.Invoke.
Bruno.
"Boris Sargos" a écrit dans le message de news: 41c9a4a0$0$30813$
Salut à tous,
je ne maîtrise pas vraiment les threads, mais je pense que mon problème n'est pas trop compliqué. Je vous remercie d'avance de m'éclairer.
Dans un formulaire MaFeuille, j'ai bouton (qui s'appelle BoutonAnnuler) et un UserControl MonControle. Lors du chargement de la feuille (évènement MaFeuille_Load), je crée un thread qui va appeller une certaine méthode MonControle.Calculer(). Jusque là, tout se passe bien : mon controle fait ses calculs, et l'utilisateur peut arrêter à n'importe quel moment en appuyant su le bouton BoutonAnnuler (méthode Abort de Thread). Le souci, c'est si l'utilisateur ne fait rien et attend la fin du calcul. Dans ce cas, MonControle.Execute() tente de rendre invisible le controle : this.visible = false; Et j'obtiens une exception m'indiquant que le thread en cours n'est pas celui qui a créé l'objet (ce que je comprends tout à fait). Ce que j'aimerais, c'est que le thread secondaire (celui qui fait les calculs) rende la main au thread principal pour que l'application suive son cours normalement.
Je ne sais pas comment faire. Merci pour votre aide et joyeux Noël à tous.
Boris.
Boris Sargos
Très intéressant. Je vais voir çà de près. Merci pour ton explication.
Bon réveillon.
Très intéressant. Je vais voir çà de près.
Merci pour ton explication.