Intéraction avec un form d'un autre thread
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) :
Code:
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"); |
Le problème est que le code est bloquant sur Application.Run();
J'ai donc souhaité modifier ce même code en le rendant threadé, mais là c'est le drame...
Le code :
Code:
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(); |
Mais ce code lève l'exception suivante :
Citation:
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.
:merci: