IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Probleme l'hors du lancement d'un winform depuis un thread avec composant WebBrowser


Sujet :

C#

  1. #1
    Membre à l'essai
    Inscrit en
    Décembre 2007
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 19
    Points : 16
    Points
    16
    Par défaut Probleme l'hors du lancement d'un winform depuis un thread avec composant WebBrowser
    Bonjour,
    j'ai un projet qui contient deux winform :
    form1 : lance 3 thread qui a leurs tour lance une nouvelle instance du form2
    form2 : contient un bouton + un composant WebBrowser (ie pour .net)

    quand je supprime le composant webbrowser tous marche nickel, par contre si je le laisse j'obtiens un message de ce type :


    "Impossible d'instance le contrôle ActiveX '8856f961-340a-11d0-a96b-00c04fd705a2', car le thread actuel n'est pas un thread cloisonné (STA, Single-Threaded Apartment)."


    Code Form1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
       public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
     
             private void button1_Click(object sender, EventArgs e)
            {
                for (int i = 0; i < 2; i++)
                {
                    Thread th = new Thread(execute_th);
                   th.Start();
                }
            }
             private void execute_th()
             {
                 Application.EnableVisualStyles();
                 Application.SetCompatibleTextRenderingDefault(false);
                 Application.Run(new Form2());
             }
        }
    Code Form2:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
            public Form2()
            {
                InitializeComponent();
            }
     
            private void Form2_Load(object sender, EventArgs e)
            {
            }
     
            private void button1_Click(object sender, EventArgs e)
            {
            }
     
            private void ie_Navigating(object sender, WebBrowserNavigatingEventArgs e)
            {
     
            }
    est ce que quelqu'un à un tuyaux ?

    merci

  2. #2
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Il y a un truc qui me parait affreux : le code de execute_th devrais être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    private void execute_th()
    {
      Form2 f2 = new Form2();
      f2.ShowDialog();
    }

  3. #3
    Membre à l'essai
    Inscrit en
    Décembre 2007
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 19
    Points : 16
    Points
    16
    Par défaut
    sa régle pas le problème et sa ne répond pas à la question !

  4. #4
    Membre à l'essai
    Inscrit en
    Décembre 2007
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 19
    Points : 16
    Points
    16
    Par défaut du nouveau...
    voila j'ai modifier mon code du form2 de la sorte :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
             private void execute_th()
             {
                 if(this.InvokeRequired)
                 {
                   this.Invoke(new MethodInvoker(delegate{
                       execute_th();
                   }));
                 }
                 else
                 {
                     Form2 myfrm = new Form2();
                     myfrm.Show();
                     myfrm.textBox1.Text = Thread.CurrentThread.ManagedThreadId.ToString();
              }
             }
    Je me rend compte que c'est toujours le meme thread qui crée les trois instances du winfrom... par contre ce qu'il me faut c'est que chaque thread que je crée gére une instance du form2 ??!!!

  5. #5
    Rédacteur
    Avatar de dev01
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 451
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 451
    Points : 6 017
    Points
    6 017
    Par défaut
    Citation Envoyé par aeroox Voir le message
    Je me rend compte que c'est toujours le meme thread qui crée les trois instances du winfrom... par contre ce qu'il me faut c'est que chaque thread que je crée gére une instance du form2 ??!!!
    C'est pas possible. Les composants graphiques (Button, Form, etc, etc) ne peuvent être manipuler que dans le thread de lancement de l'application. Si tu veux mettre à jour des informations dans les instances de Form2 à partir de tes threads, il faut que tu blindes tout le code avec des Invoke.

  6. #6
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Citation Envoyé par dev01 Voir le message
    Les composants graphiques (Button, Form, etc, etc) ne peuvent être manipuler que dans le thread de lancement de l'application
    C'est pas vrai ... par contre ça le deviens dès que l'on utilise des composants COM ou venant du Shell. Par exemple tout ce qui est OpenFileDialog ou WebBrowser (je suppose) tombe dans cette exception, mais les composants standards des WinForms peuvent très bien être utilisés sans problème entre plusieurs threads.

  7. #7
    Rédacteur
    Avatar de dev01
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 451
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 451
    Points : 6 017
    Points
    6 017
    Par défaut
    Citation Envoyé par smyley Voir le message
    C'est pas vrai ... par contre ça le deviens dès que l'on utilise des composants COM ou venant du Shell. Par exemple tout ce qui est OpenFileDialog ou WebBrowser (je suppose) tombe dans cette exception, mais les composants standards des WinForms peuvent très bien être utilisés sans problème entre plusieurs threads.
    non non non et non ! Ils ne peuvent être manipulé qu'à partir du thread de création. L'utilisation de la méthode Invoke permet de ramener l'exécution du code voulu dans le thread du GUI.
    Toutes les méthodes qui permettent de supprimer l'exception généré ne sont que bêtise.

  8. #8
    Membre éclairé
    Inscrit en
    Octobre 2006
    Messages
    587
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations forums :
    Inscription : Octobre 2006
    Messages : 587
    Points : 706
    Points
    706
    Par défaut
    Je suis d'accord avec dev01, j'ai toujours eu des exceptions déclenchées lorsque je veux accéder à une textbox d'une form à partir d'un autre thread sans Invoke.

  9. #9
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Il faudrait que vous sachiez de quoi vous parlez ...

    Citation Envoyé par dev01 Voir le message
    non non non et non ! Ils ne peuvent être manipulé qu'à partir du thread de création.
    C'est vrai.

    Les composants graphiques (Button, Form, etc, etc) ne peuvent être manipuler que dans le thread de lancement de l'application.
    C'est faux.

    Rien ne m'empêche de créer un autre thread, et d'y créer une form, et d'y accéder à partir de ce thread : là ça marche sans râler pour peut de ne pas utiliser les contrôles du shell. Par contre créer une form, créer un autre thread, et accéder à la form à partir de l'autre thread, là ça râle.
    Je précise que dans une application il n'y a pas que le thread qui a appelé Application.Run ...

  10. #10
    Rédacteur
    Avatar de dev01
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 451
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 451
    Points : 6 017
    Points
    6 017
    Par défaut
    Citation Envoyé par smyley Voir le message
    Il faudrait que vous sachiez de quoi vous parlez ...
    je le sais si ça peux te rassurer.

    Citation Envoyé par smyley Voir le message
    C'est faux.
    Exact, erreur d'écriture de ma part, je parlais bien sur du thread de création (qui est bien souvent celui de lancement de l'application ) Merci à toi pour avoir relever ce raccourci inexact

  11. #11
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Citation Envoyé par dev01 Voir le message
    Exact, erreur d'écriture de ma part, je parlais bien sur du thread de création (qui est bien souvent celui de lancement de l'application ) Merci à toi pour avoir relever ce raccourci inexact
    Voilà, dans ce cas nous somme tous d'accord

Discussions similaires

  1. probleme ansiindexstr (hors limite (-1))
    Par quarkz dans le forum Langage
    Réponses: 4
    Dernier message: 03/09/2005, 23h18
  2. [Plugin]Lancement d'un projet JSP sous Eclipse avec Tomcat
    Par samios dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 25/08/2004, 18h03
  3. Problème de permission au lancement d'ut2004demo !
    Par Ancien_Legolas dans le forum Applications et environnements graphiques
    Réponses: 21
    Dernier message: 04/06/2004, 20h58
  4. probleme avec composant indy IDhttp
    Par ulysse66x dans le forum Composants VCL
    Réponses: 3
    Dernier message: 16/06/2003, 09h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo