Form thread mise à jour depuis autre class
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:
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:
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.