Forms en série... [Résolu]

Signaler
Messages postés
27
Date d'inscription
jeudi 2 septembre 2004
Statut
Membre
Dernière intervention
28 juin 2008
-
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
-
Bonjour!
Pourriez-vous m'aider à trouver l'erreur dans ce code, à chaque fois que je clique sur le button1, une fenêtre apparaît, mais elle reste bloquée...

using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;

namespace test
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        ArrayList c1 = new ArrayList();
        bool a = false;
   

        private void Form1_Load(object sender, EventArgs e)
        {
            Thread t1 = new Thread(new ThreadStart(funct));
            t1.Start();
        }

      private void button1_Click(object sender, EventArgs e)
        {
            a = true;
        }

        private void funct()
        {
            for (; ; )
            {
                {
                    if (a == true)
                    {

                        c1.Add(new Conversation("corr", "orig"));
                        a = false;
                    }
                }
            }
        }

        public class Conversation
        {
            public Form2 fenetre;
            public string corres;
            public string origin;            public Conversation(string corr, string orig) { corres corr; origin orig; fenetre = new Form2(); fenetre.Show(); fenetre.Activate(); }
            public void Activate() { fenetre.Show(); fenetre.Activate(); }
        }
    }
}

9 réponses

Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
52
Je ne sais pas exactement ce que tu veux faire, mais essayes ceci, peut-être que ça te conviendras :

public
partial
class
Form1 :
Form
{
  
private
ArrayList _al =
new
ArrayList();
  
private
bool _construct =
true;

  
public Form1()
   {
     
this.InitializeComponent();
   }

   private
void Form1_Load(
object sender,
EventArgs e)
   {
     
Thread thread =
new
Thread(
new
ThreadStart(funct));
      thread.IsBackground =
true;
      thread.Start();
   }

   private
void funct()
   {
     
while (
this._construct)
      {
        
this._al.Add(
new
Conversation(
"corr",
"orig"));
        
Thread.Sleep(100);
      }
     
this.Invoke(
new
EventHandler(
this.CreateWindows),
this._al.Count,
EventArgs.Empty);
   }

  
private
void CreateWindows(
object o,
EventArgs e)
   {
     
for (
int i = 0; i <
this._al.Count; i++)
      {
        
// Tu peux utiliser l'arrayList qui contient tes Conversations ici
         Form form =
new
Form();
         form.Show();
      }
   }

   private
void button1_Click(
object sender,
EventArgs e)
   {
     
this._construct =
false;
   }

   public
class
Conversation
   {
     
public
string corres;
     
public
string origin;

      public Conversation(
string corr,
string orig)
     {
         corres = corr;
         origin = orig;
      }
   }
}

<hr size="2" /> VC# forever
=13319
Messages postés
393
Date d'inscription
mercredi 8 mars 2006
Statut
Membre
Dernière intervention
23 mars 2007

Salut,
Peu être est-ce parce-que tu déclare une class dans une autre class. (Je ne suis pas sûr)

_________________________________________________________________________
Woot
Messages postés
27
Date d'inscription
jeudi 2 septembre 2004
Statut
Membre
Dernière intervention
28 juin 2008

Merci de ta réponse!
Je viens d'essayer en mattant la classe à l'extérieur, ça veut toujours pas!
Pas d'autres idées? (je précise que la Form 2 ne contient aucun contrôle, aucun code n'est exécuté au chargement)
Messages postés
154
Date d'inscription
mercredi 13 octobre 2004
Statut
Membre
Dernière intervention
22 août 2007

peut-être que ça viens du fait que c'est ton 2ème thread qui gère cette fenêtre, et qui est dans une boucle qui lui prend tout son temps??? je ne suis pas sûre...

essaye de faire en sorte de faire un thread par fenêtre ouverte...
Messages postés
27
Date d'inscription
jeudi 2 septembre 2004
Statut
Membre
Dernière intervention
28 juin 2008

lut!
j'ai changé le code de funct() comme cela:

        private void funct()
        {
            for (; ; )
            {
               
                    if (a == true)
                    {

                        Thread t2=new Thread(new ThreadStart(opennewwin));
                        t2.Start();
                         a = false;
                    }
               
            }
        }

        private void opennewwin(){
            c1.Add(new Conversation("corr", "orig"));
            Thread.CurrentThread.Suspend();

            }
 mais cela ne change pas grand chose...la fenêtre plante toujours
Messages postés
27
Date d'inscription
jeudi 2 septembre 2004
Statut
Membre
Dernière intervention
28 juin 2008

ah au fait!
ça ne risquerait pas de mieux marcher avec un évènement? comme Onachanged par exemple?
Seulement j'y connais rien aux évènements alors je sais pas du tout si ça changerait quelque chose.

Immerczeck
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
52
Salut,
Le problème vient sûrement du fait que tu instancies une nouvelles form dans ton thread !
Franchement, s'est très très déconseillé de faire ce genre de chose, ça n'apporte que des ennuis...

<hr size= "2" /> VC# forever
=13319
Messages postés
27
Date d'inscription
jeudi 2 septembre 2004
Statut
Membre
Dernière intervention
28 juin 2008

lut!
merci beaucoup!!
j'ai adapté un peu le code et ça marche parfaitement!
est-ce que tu pourrais expliquer la ligne
 this.Invoke(
new
EventHandler(
this.CreateWindows),
this._al.Count,
EventArgs.Empty);
si j'ai bien compris, un nouvel évènement est créé? mais à quoi sert le Invoke? à l'appeler?

Sinon, voici le code, pour ceux que ça intéresserait:

    public partial class Form1 : Form
    {
   private ArrayList _al = new ArrayList();
   private bool _construct = true;

   public Form1()
   {
      this.InitializeComponent();
   }

   private void Form1_Load(object sender, EventArgs e)
   {
      Thread thread = new Thread(new ThreadStart(funct));
      thread.IsBackground = true;
      thread.Start();
   }

   private void funct()
   {
      while (true)
      {
          if (!_construct)
          {
              this._al.Add(new Conversation("corr", "orig"));
              this.Invoke(new EventHandler(this.CreateWindows), this._al.Count, EventArgs.Empty);
              _construct = true;
             
             

          }
      }
     
   }

   private void CreateWindows(object o, EventArgs e)
   {
       Conversation c = _al[_al.Count-1] as Conversation;
//       c.fc = new Form2();
       c.fc.Show();
   }
  

   private void button1_Click(object sender, EventArgs e)
   {
      this._construct = false;
   }

   public class Conversation
   {
      public string corres;
      public string origin;
      public Form2 fc=new Form2();

      public Conversation(string corr, string orig)
     {
         corres = corr;
         origin = orig;
         fc.Text = "De " + orig + " à " + corr;
        
      }
   }
}

Merci beaucoup!
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
52
Petite correction : Quand tu appelles le Invoke, pas besoin de passer this._al.Count, tu peux mettre null sans problème :-)
Pour savoir ce que fais Invoke, je te renvoie sur ce très bon tuto de Mx

<hr size= "2" /> VC# forever
=13319