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#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Décembre 2007
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 19
    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 confirmé
    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
    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 averti
    Inscrit en
    Décembre 2007
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 19
    Par défaut
    sa régle pas le problème et sa ne répond pas à la question !

  4. #4
    Membre averti
    Inscrit en
    Décembre 2007
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 19
    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
    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 confirmé
    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
    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.

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