Bonjour,

Je souhaite avoir une Form qui lance un une procédure (longue) dans une autre class et que celle ci mette à jour des éléments de la Form au fur et a mesure de l'avancement de la procédure.

Pour essayer de comprendre, j'ai suivi un tutoriel - la partie avec les Windows Forms

Quand tous est dans la même class, pas de problème cela fonctionne (but du tutoriel). mais quand j'essaye d'éclater en 2 class je bloque

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
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
   public partial class Form1 : Form
    {
        private Random rand = new Random((int)DateTime.Now.Ticks);
 
        private int[] tableau = new int[500000];
 
        //On crée notre delagate.
        public delegate void MontrerProgres(int valeur);
 
        bool termine = true;
 
        public Form1()
        {
            InitializeComponent();
 
            //On génère un tableau d'entiers aléatoires.
            for (int i = 0; i < tableau.Length; i++)
            {
                tableau[i] = rand.Next(50000);   //...Boucle très simple, avec méthode Random très simple.
            }
        }
 
        public void Selection()
        {
            //On va simplement compter les nombres du tableau inférieurs à 500.
            int total = 0;
 
            for (int i = 0; i < tableau.Length; i++)
            {
                if (tableau[i] < 500)
                {
                    total++;
                }
 
                //Puis, on incrémente le ProgressBar.
                int valeur = (int)(i / (double)tableau.Length * 100);
 
                //On achète la paix, on entoure notre Invoke d'un try...catch !
                try
                {
                    //On invoque le delegate pour qu'il effectue la tâche sur le temps
                    //de l'autre thread.
                    Invoke((MontrerProgres)Progres, valeur);
                }
                catch (Exception ex) { return; }
            }
 
            termine = true;
        }
 
        public void Progres(int valeur)
        {
            //On met la valeur dans le contrôle Windows Forms.
            // pgbThread.Value = valeur;
            progressBar1.Value = valeur;
        }
 
        private void button2_Click(object sender, EventArgs e)
        {
            traite tr1 = new traite();
            tr1.tableau = tableau;
            tr1.Selection();
            Thread t2 = new Thread(new ThreadStart(tr1.Selection)); 
        }
et ma class traite
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
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
    class traite
    {
        public int[] tableau;
        Boolean termine = false;
        public static void start()
        {
            traite tr1 = new traite();
            tr1.Selection();
        }
        public void Selection()
        {
            //On va simplement compter les nombres du tableau inférieurs à 500.
            int total = 0;
 
            for (int i = 0; i < tableau.Length; i++)
            {
                if (tableau[i] < 500)
                {
                    total++;
                }
 
                //Puis, on incrémente le ProgressBar.
                int valeur = (int)(i / (double)tableau.Length * 100);
 
                //On achète la paix, on entoure notre Invoke d'un try...catch !
                try
                {
                    //On invoque le delegate pour qu'il effectue la tâche sur le temps
                    //de l'autre thread.
                    Invoke((Form1.MontrerProgres)Progres, valeur);
                    //Form1.upro(valeur);
                    //Form1.MontrerProgres;
 
                    // MethodInvoker action = () => Form1.upro(valeur);
 
                }
                catch (Exception ex) { return; }
            }
 
 
 
            termine = true;
        }
    }
 
}
Je bloque sur la mise à jour de la zone via delegate :
Invoke((Form1.MontrerProgres)Progres, valeur);

J'ai fait différent essai, mais j'ai toujours des erreurs de compilation.

J'ai essayer cette méthode : https://www.daniweb.com/programming/...-another-class
mais elle ne fonctionne pas non plus .. erreur dans le code.
Merci pour vos conseils éclairer.
PS: je suis en .NET 3.5 pour des raisons techniques.