C# WPF, Threads et controls

Zyko

Membre
Inscrit
12 Octobre 2012
Messages
21
Reactions
0
#1
Bonjour, je suis débutant en C# j'ai jusque là fais que de l'Autoit.
J'avais bien avancé dans un projet de bot, mais trop bloqué par l'impossibilité de faire du multhithreading, je m'essaye au C# ! :)
J'ai aussi fais un créateur de comptes D2 entièrement fonctionnel en Autoit.

Mais maintenant que je me suis mis au WPF en C# je me retrouve bloqué à une étape ! J'ai du mal avec les threads, delegates & co..
Mon problème, c'est que lors du téléchargement + affichage de la captcha, mon UI se fige alors que je passe bien par un thread ( enfin je crois ).
Je m'en remet donc à vous en vous joignant le code ci-dessous :
( S'il manque des infos ou du code j'ajouterais à la demande :) )

Obtention de la captcha ( certes pas propre, c'est le début juste dans le but de tester déjà )
Code:
public void GetCaptcha()
{
	WebClient oMyWebClient= new WebClient();

	oMyWebClient.Proxy = null;

	Byte[] ImageInBytes= oMyWebClient.DownloadData("http://api.ankama.com/captcha.png");

	MemoryStream ImageStream = new MemoryStream(ImageInBytes)
		
        BitmapImage bmpCaptcha = new BitmapImage();

	bmpCaptcha.BeginInit();

	bmpCaptcha.StreamSource = ImageStream;

	bmpCaptcha.EndInit();
			
	this.ImageCaptcha.Source = bmpCaptcha; // Affichage de la captcha dans le control ImageCaptcha
			
}
Mon évènement lors du clic sur le bouton de génération de celle-ci :
Code:
private void button_RechargerCaptcha_Click(object sender, RoutedEventArgs e)
{
			
	ThreadStart Thread_GetCaptcha = delegate()
	{
		Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(GetCaptcha));
	};

	new Thread(Thread_GetCaptcha).Start();

	MessageBox.Show("Fini.."); // Accessoire évidemment 

}
Voilà, ma captcha s'affiche très bien, mais lors de son affichage ma fenêtre ne "répond pas". Ca doit sauter aux yeux mais tout ceci n'est pas encore très clair pour moi :(
 

Zyko

Membre
Inscrit
12 Octobre 2012
Messages
21
Reactions
0
#2
J'ai laissé tombé, je vais plutôt commencer mon apprentissage par les winforms ! :)
A lock !
 

bouh2

Membre Actif
Inscrit
12 Septembre 2008
Messages
184
Reactions
21
#3
BiM utilise WPF entierement, si ça peut t'aider ;)
 

Lakh92

Membre Actif
Inscrit
24 Decembre 2009
Messages
118
Reactions
0
#4
Pour ton souci, tu crées bien un nouveau thread. Mais ce qui est drôle, tu dis au thread de ton application (le thread principal, qui gère les fenêtres) de lancer ta fonction GetCaptcha.
En enlevant le Dispatcher.Invoke, tout devrait aller mieux. (ça pourrait coincer au niveau de l'accès au Control de l'image, auquel cas tu peux utiliser du DataBinding)
 

Zyko

Membre
Inscrit
12 Octobre 2012
Messages
21
Reactions
0
#5
Je vous remercie pour vos réponses, mais j'ai rage del :(
Cependant ça va quand même m'être utile, même sous WinForms je peine à modifier les controls à partir d'un autre thread..
 

Lakh92

Membre Actif
Inscrit
24 Decembre 2009
Messages
118
Reactions
0
#6
Quand tu souhaites faire ça, il faut que tu fasses un Invoke sur l'assignation des valeurs de tes différentes propriétés "bloquées" et non sur tout ton code.
 

Zyko

Membre
Inscrit
12 Octobre 2012
Messages
21
Reactions
0
#7
Oui, j'ai trouvé un code sur la toile, je ne pensais pas que c'était si simple..
Toutefois je ne comprend toujours pas par quelle magie ça fonctionne :
( à partir d'un thread différent )

Code:
this.Invoke((MethodInvoker)delegate 
{ 
	button_ReloadCaptcha.Enabled = false; 
});
 
Inscrit
27 Aout 2012
Messages
264
Reactions
0
#8
La méthode Invoke sert justement à "switcher" d'un thread à l'autre le temps de faire le travail voulu dans le thread en question.
Ça ne dure qu'une fraction de secondes et c'est pour ça que tu ne vois pas la GUI se figer :).
 
Haut Bas