Forms en série...

Résolu
immerczeck Messages postés 27 Date d'inscription jeudi 2 septembre 2004 Statut Membre Dernière intervention 28 juin 2008 - 7 juil. 2006 à 16:43
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 - 8 juil. 2006 à 12:27
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

cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
8 juil. 2006 à 11:44
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
3
woot6768 Messages postés 393 Date d'inscription mercredi 8 mars 2006 Statut Membre Dernière intervention 23 mars 2007
7 juil. 2006 à 17:03
Salut,
Peu être est-ce parce-que tu déclare une class dans une autre class. (Je ne suis pas sûr)

_________________________________________________________________________
Woot
0
immerczeck Messages postés 27 Date d'inscription jeudi 2 septembre 2004 Statut Membre Dernière intervention 28 juin 2008
7 juil. 2006 à 17:31
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)
0
apacheswiss Messages postés 154 Date d'inscription mercredi 13 octobre 2004 Statut Membre Dernière intervention 22 août 2007
7 juil. 2006 à 18:58
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...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
immerczeck Messages postés 27 Date d'inscription jeudi 2 septembre 2004 Statut Membre Dernière intervention 28 juin 2008
7 juil. 2006 à 19:09
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
0
immerczeck Messages postés 27 Date d'inscription jeudi 2 septembre 2004 Statut Membre Dernière intervention 28 juin 2008
7 juil. 2006 à 19:12
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
0
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
8 juil. 2006 à 11:27
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
0
immerczeck Messages postés 27 Date d'inscription jeudi 2 septembre 2004 Statut Membre Dernière intervention 28 juin 2008
8 juil. 2006 à 12:16
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!
0
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
8 juil. 2006 à 12:27
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
0
Rejoignez-nous