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
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
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)); }
Je bloque sur la mise à jour de la zone via delegate :
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; } } }
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.
Partager