Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

ParameterizedThreadStart dand une form

5 réponses
Avatar
Pierre
Bonsoir,
Je suis confronté au problème suivant. J'ai une forme qui lance des
threads (socket client bloquant). J'associe un serveur à plusieurs
bouton de ma forme.
Sur chaque click de bouton, je lance un thread en passant le bouton en
paramètre.

t = new Thread(new ParameterizedThreadStart(sendAndReceive));
t.Start(who);

Je passe le bouton en paramètre à ma forme dans une méthode genre

static void sendAndReceive(Object button)

Mon problème est que je veux récupérer ou mettre à jour des informations
sur ma forme mais comme j'appelle une méthode statique, impossbile.

J'avais dèjà fait ce genre de chose mais sans passser de paramètre.

Bref je galère. Quelqu'un peut-il m'éclairer. Merci.

5 réponses

Avatar
Delf
Pierre avait énoncé :

Je suis confronté au problème suivant. J'ai une forme qui lance des threads
(socket client bloquant). J'associe un serveur à plusieurs bouton de ma
forme.
Sur chaque click de bouton, je lance un thread en passant le bouton en
paramètre.

t = new Thread(new ParameterizedThreadStart(sendAndReceive));
t.Start(who);

Je passe le bouton en paramètre à ma forme dans une méthode genre

static void sendAndReceive(Object button)

Mon problème est que je veux récupérer ou mettre à jour des informations
sur ma forme mais comme j'appelle une méthode statique, impossbile.

J'avais dèjà fait ce genre de chose mais sans passser de paramètre.

Bref je galère. Quelqu'un peut-il m'éclairer. Merci.



Ne vaut-il mieux pas utiliser des delegates pour interagir avec les
contrôles de la Form ?

Sinon, pourquoi utilises-tu une static ?

--
Delf
Avatar
Jérémy Jeanson
Bonjour tout le monde,

Encore une petite histoire de thread ? ;)

Attention, il est vrai que le multi threading peut devenir une vrai
usine à gaz, surtout si on veut jouer avec l'interface en parallèle.
Pour lancer des opération asynchrones et faire remonter des information
sur une interface graphique, il est 10 fois plus simple d'utiliser le
BackGroundWorker... ce n'est pas parce que c'est un contrôle que l'on
glisse sur son formulaire qu'il est moins performant, au contraire, il
fait ce qu'il a à faire et il le fait bien.

Dans la même série, si effectivement Pierre veut manipuler des Threads,
il y a une notion d'invocation de thread d'instanciation des contrôles
qu'il faut maitriser à tout pris avant de partir dans l'aventure. En
gros dans une methode qui doit utiliser un contrôle dans un thread autre
que celui qui a servi à utiliser le thread, la méthode doit faire un
test afin de déterminer si le thread à l'origine du contrôle doit être
invoqué et qui relance la méthode en invoquant ce thread et en passant
la méthode par un délégé. Par exemeple (attention c'est de tête, donc
peut être un peu d'intellisence à ajouter ;))

private delegate void MonDelegate();
private void MaMethode()
{
// Tester le besoin d'invocation
if(MonControl.InvokeRequired)
{
MonControl.Invoke(new MonDelegate(MaMethode));
}
else
{
// pas besoin d'invocation dont on fait le traitement ici
}
}

avec des arguments ça donne :
private delegate void MonDelegate(string arg1,string arg2);
private void MaMethode(string arg1,string arg2)
{
// Tester le besoin d'invocation
if(MonControl.InvokeRequired)
{
MonControl.Invoke(new MonDelegate(MaMethode,new Object[]{arg1,arg2}) ));
}
else
{
// pas besoin d'invocation dont on fait le traitement ici
}
}
J'ai un petit doute sur l'écriture du passage d'arguments, mais ça doit
être ça , normalement.

--
Jérémy JEANSON
MCP
http://www.jjeanson.fr
Avatar
Pierre
Delf wrote:
Pierre avait énoncé :

Je suis confronté au problème suivant. J'ai une forme qui lance des
threads (socket client bloquant). J'associe un serveur à plusieurs
bouton de ma forme.
Sur chaque click de bouton, je lance un thread en passant le bouton en
paramètre.

t = new Thread(new ParameterizedThreadStart(sendAndReceive));
t.Start(who);

Je passe le bouton en paramètre à ma forme dans une méthode genre

static void sendAndReceive(Object button)

Mon problème est que je veux récupérer ou mettre à jour des informations
sur ma forme mais comme j'appelle une méthode statique, impossbile.

J'avais dèjà fait ce genre de chose mais sans passser de paramètre.

Bref je galère. Quelqu'un peut-il m'éclairer. Merci.



Ne vaut-il mieux pas utiliser des delegates pour interagir avec les
contrôles de la Form ?

Sinon, pourquoi utilises-tu une static ?

--
Delf




Bonjour et merci,
Pour le staitc, je n'ai pas le choix par ce que je passe un objet à mon
Thread en utilisant ParameterizedThreadStart.

Le delegate ca serait pas mal sauf que je sais pas comment on renvoie un
objet (string ou autre) quand on utilise le delegate qui me sert de
callcack sur ma form. Je sais passer des paramètres, mettre à jour la
form mais pas récupérer une information.
Avatar
Jérémy Jeanson
Bonjour Pierre,

Une solution courte et simple pour passer des parametre à un thread est
de prendre le souci à l'envers. Au lieu de lancer une méthode et d'y
passer des arguments tu peut te permettre de lancer dans un thread une
méthode d'une classe contenant des proprités faisait office d'arguement

ex:

public class MaClasse
{
public String Arg1{get;set;};
public String Arg2{get;set;};

public void MaMethode()
{
// effectuer ici le traitement en utilisant arg1 et arg2
}
}

Ensuite dans ton code appelant tu n'as qu' àç instancier ta classe puis
lancer ta méthode:

MaClasse c = new MaClasse(){ Arg1="...", Arg2="..." };
Thread s = new Thread(c.MaMethode);
s.Start();

Fonctionne parfaitement et très pratique si tu pense ajouter des
arguments par la suite.

--
Jérémy JEANSON
MCP
http://www.jjeanson.fr
Avatar
Pierre
Jérémy Jeanson wrote:
Bonjour Pierre,

Une solution courte et simple pour passer des parametre à un thread est
de prendre le souci à l'envers. Au lieu de lancer une méthode et d'y
passer des arguments tu peut te permettre de lancer dans un thread une
méthode d'une classe contenant des proprités faisait office d'arguement

ex:

public class MaClasse
{
public String Arg1{get;set;};
public String Arg2{get;set;};

public void MaMethode()
{
// effectuer ici le traitement en utilisant arg1 et arg2
}
}

Ensuite dans ton code appelant tu n'as qu' àç instancier ta classe puis
lancer ta méthode:

MaClasse c = new MaClasse(){ Arg1="...", Arg2="..." };
Thread s = new Thread(c.MaMethode);
s.Start();

Fonctionne parfaitement et très pratique si tu pense ajouter des
arguments par la suite.



Et dire que je m'embête avec un objet ... C'est tellement astucieux. Merci.