Bonjour,
J'ai une première interface qui me permet de choir les images à traiter. Quand je click sur mon bouton "commencer le traitement", j'ai une ChildWindow (DialogResult) qui s'ouvre et qui lance les traitements et affiche les résultats dans un graph.
Cependant, je me suis heurté au problème suivant : à partir de 5 images la durée des traitements commence à être importante et Silverlight m'indique que mon programme à planté au bout de 30s d'exécution.
Je me suis donc tourné vers les threads :
Dans un premier temps j'ai essayé avec un BackgroundWorker mais j'ai l'erreur suivante :
Accès inter-thread non valide.
Avec l'objet Thread, je n'ai pas réussi à faire tourner mon programme en arrière plan sans monopoliser toutes les ressouces.
Voici la structure de mes objets :
DialogResult :
Contient mes listes d'images, l'objet graphique accueillant les résultats.
Traitement :
- PSNR : sous fonction effectuant des traitements à partir de 2 images.
- SSIM : objet créant de nombreux sous objet à cause de la complexité du traitement.
Voici le code avec le BackgroundWorker (erreur ci-dessus) :
Code c# : 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 void DoWork(object sender, DoWorkEventArgs e) { System.Threading.Thread.Sleep(500); double r; Mark m; //processing count int n = 0; foreach (PictureGroup pg in data.groups) n += pg.picturesWithDistorsion.Count; //image count n *= 2;//2 processings: PSNR & SSIM //process images int i = 0; foreach (PictureGroup pg in data.groups) { BitmapImage io = pg.original.Image; foreach (Picture p in pg.picturesWithDistorsion) { r = modules.metrics.RunnableMetric.PSNR(io, p.Image); m = new Mark { filename = p.file.Name, mosp = r, metric = "PSNR" }; p.marks.Add(m); System.Threading.Thread.Sleep(100); bw.ReportProgress(100 * (++i / n)); r = modules.metrics.RunnableMetric.SSIM(io, p.Image); m = new Mark { filename = p.file.Name, mosp = r, metric = "SSIM" }; p.marks.Add(m); System.Threading.Thread.Sleep(100); bw.ReportProgress(100 * (++i / n)); } } }
Je suis ouvert à vos propositions pour effectuer mes traitements en arrière plan et si possible actualiser mon graph au fur et à mesure.
Partager