Bonjour à tous
Petite question mais délicate....
J'ai une IHM composée de trois panels.
1er panel: un TreeView,
2ème panel: un graphique
3ème panel: une ListView.
(Le tout dans une winforms)
Tout ce petit monde s'est enregistré auprès du sujet (pattern observer).
Quand le sujet change je parcours donc ma lise "d'observers" et lance un "DoRefresh" sur chacun d'eux! jusqu'à là tout va bien !!
Dés qu'un des panel effectue sont "DoRefresh" il va donc recharger ses données, éventuellement faire des traitements au cas où, puis afficher le resultat!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 foreach (IOBserver obs in obsList) { obs.DoRefresh(); }
Ca pourrait être bien, mais le refresh général est long et du coup faut patienter (1 à 2sec - oui je suis pressé). Le traitement pour chaque panel est en soin rapide, mais bon tant que chaque composant fasse son petit traitement, redéssine (par ex: le graphique) bah c'est long!
Cependant, l'idée m'est venue de créer un Thread dans ma boucle de refresh!
boom ! eh oui le fameux cross-thread machin. Pareit que seul le thread qui a créé l'IHM peut le modifier!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 foreach (IOBserver obs in obsList) { Thread th = new Thread(new ThreadStart(obs.DoRefresh)); th.Start(); }
Bon d'accord mais alors pour faire en sorte d'avoir quand même l'impression que chaque "Observer" se met à jour tout seul sans attendre que son camarade ait terminé on fait comment !!??
La solution de mettre des Invoke ou Begin/EndInvoke (asynchrone) ne marche pas plus.. en fait je n'ai alors plus d'exception mais le temps est multiplié par 10!
alors comment faire ?
merci !!
Partager