Bonsoir,
Je rencontre un problème et là franchement depuis le temps que je cherche, je suis complètement perdu :-(
Je ne maitrise pas vraiment les notions de classes dérivées mais je me suis dit, rien de tel qu'un cas concret pour apprendre.
Mon problème est le suivant. Je souhaite mettre à jour une progressbar via un backgroundworker et ca c'est pas un soucis. J'utilise la méthode ReportProgress du BGW qui appelle l'événement ProgressChanged, qui lui, met à jour la progressbar. Je voulais juste ajouter dans le form un truc du genre "traitement de l'enregistrement x sur y", mais pour ça il ne me faut pas seulement le pourcentage mais les fameux x et y.
Je me suis donc dit, tiens je vais essayer de faire un truc bien, enfin je pense que c'est un truc bien...
J'ai donc créé la classe suivante :
1 2 3 4 5 6 7 8 9 10 11 12 13
| public class BackgroundWorkerModified : System.ComponentModel.BackgroundWorker
{
public event ProgressEventHandler ProgressEvent;
public virtual void OnProgressEvent(ProgressEventArgs e)
{
ProgressEvent(this, e);
}
public void ReportAllProgress(int valueToTreat, int nbValues)
{
ProgressEventArgs args = new ProgressEventArgs(valueToTreat, nbValues);
this.OnProgressEvent(args);
}
} |
et celle-ci qui est censée me récupérer mes x et y dans l'événement :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| public class ProgressEventArgs : EventArgs
{
private int actualValue;
private int totalValues;
public ProgressEventArgs(int currentValue, int nbValues)
{
this.actualValue = currentValue;
this.totalValues = nbValues;
}
public int CurrentValue
{
get { return this.actualValue; }
}
public int NbValues
{
get { return this.totalValues; }
}
} |
Dans le code de mon formulaire j'utilise donc le délégué :
public delegate void ProgressEventHandler(object sender, ProgressEventArgs e);
et à l'initialisation du form je lance tout çà :
1 2 3
| backgroundWorker1.WorkerReportsProgress = true;
backgroundWorker1.ProgressEvent+=new ProgressEventHandler(backgroundWorker1_ProgressEvent);
backgroundWorker1.RunWorkerAsync(); |
Dans mon backgroundWorker1_DoWork, j'appelle ma méthode crée précédemment :
backgroundWorker1.ReportAllProgress(i, nbLines);
et mon événement backgroundWorker1_ProgressEvent est donc le suivant :
1 2 3 4
| private void backgroundWorker1_ProgressEvent(object sender, ProgressEventArgs e)
{
progressBar1.Value = ((int)((float)e.CurrentValue / (float)e.NbValues * 100));
} |
C'est sur cette ligne que j'ai l'erreur inter-threads.
Je sais que je pourrais parvenir à mes fins différemment, ce n'est pas l'objet de ce post.
Je cherche à comprendre pourquoi cela fonctionne avec la méthode ReportProgress du BGW et pas avec celle de la classe dérivée BackgroundWorkerModified de celui-ci.
Je vous remercie par avance de votre éclaircissement, notamment car je ne suis pas sûr de ce que je fais dans la gestion des événements ou de la classe dérivée.
Bonne soirée.
Partager