Bien le bonjour à tous,
Je modifie actuellement une application graphique et je suis confronté à un problème concernant le multi-threading.
Jusqu'à présent, l'ouverture d'un fichier dans le programme se faisait dans le thread principal, ce qui freezait l'interface mais ne gênait pas.
Je souhaiterais maintenant ajouter une barre de chargement qui indique les actions en cours lors de l'ouverture d'un fichier. J'ai donc dû créer un nouveau thread :
Dans cette fonction je crée un objet qui devra par la suite mettre à jour la fenêtre. J'ai donc choisi d'en faire un attribut de cet objet. Seulement, lorsque je crée la fenêtre pop-up qui affiche les informations j'ai une erreur comme quoi le thread n'est pas en mode STA :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 loadingThread = new System.Threading.Thread(new System.Threading.ParameterizedThreadStart(LoadFile)); loadingThread.Start(filePath);
Je me dis donc qu'il faut que la fenêtre soit créée dans le thread principal, le thread graphique, et pas dans le thread secondaire. J'utilise alors le dispatcher de l'application pour ré-utiliser le thread graphique :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 LoadFile(string filepath) { MonitoredSystem = new MonitoredSystem(); MonitoredSystem.progressBarWindow = new ProgressBarWindow(); MonitoredSystem.progressBarWindow.SetStatus("Début"); }
Quand je fais cela, je peux voir que dans le débugger que rien ne se passe, ma fenêtre n'est pas créée.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 LoadFile(string filepath) { MonitoredSystem = new MonitoredSystem(); Dispatcher.Invoke(DispatcherPriority.Send, new Action(delegate { MonitoredSystem.progressBarWindow = new ProgressBarWindow(); })); Dispatcher.Inovke((DispatcherPriority.Send, new Action(delegate {MonitoredSystem.progressBarWindow.SetStatus("Début")})); }
J'ai donc essayé le VerifyAccess() mais ca me retourne une exception.. D'après la doc msdn c'est normal car "Seul le thread sur lequel le Dispatcher a été créé peut accéder au Dispatcher."
Mais partant de là, aucun thread ne crée le thread pricipal, donc on ne peut jamais y accéder !
Pourriez-vous me dire d'abord si ma façon d'aborder le problème semble correcte, ensuite comment je peux accéder au thread principal pour lui faire exécuter des actions?
Merci à tous !
Partager