Bonjour,
je fais une application de mise à jour qui est lancée avant l'application elle-même.
Cette application est de type "Console" et je recherche si pour une taille d'écran donnée, il existe un Form contenant un Splash Screen, si oui, le charger à la place de l'affichage de la console.
J'aimerai donc avoir mon processus de mise à jour dans un thread et l'interface dans un autre (cette dernière n'étant pas obligatoire et utilisée qu'a des fins d'affichage).
Un premier code non threadé (qui fonctionne serait) :
Le problème est que le code est bloquant sur Application.Run();
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 Assembly assembly = Assembly.LoadFrom("240x320Screens.dll"); Form ff = assembly.CreateInstance("Screens.Loader") as Form; Application.Run(ff); // Le Form en question implémente cette interface (le contrôle est fait mais non mis ici). ((ISplashView)ff).SetStep("Step 1 on 3");
J'ai donc souhaité modifier ce même code en le rendant threadé, mais là c'est le drame...
Le code :
Mais ce code lève l'exception suivante :
Code : 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 Thread presenterThread = null; Assembly assembly = Assembly.LoadFrom("240x320Screens.dll"); Form ff = assembly.CreateInstance("Screens.Loader") as Form; presenterThread = new Thread((ThreadStart)(() => { Application.Run(ff); })); presenterThread.Start(); ((ISplashView)ff).SetStep("Step 1 on 3"); Thread.Sleep(5000); ((ISplashView)ff).SetStep("Step 2 on 3"); Thread.Sleep(5000); ((ISplashView)ff).SetStep("Step 3 on 3"); // Attend que l'utilisateur ferme l'écran (comportement voulu) if (presenterThread != null) presenterThread.Join();
Control.Invoke must be used to interact with controls created on a separate thread.
A noter que j'utilise le Compact Framework 3.5 et que les écrans sont donc en WinForms.
Partager