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

Cross Thread avec evenement en Net Remoting

6 réponses
Avatar
Romuald SAURIN
Bonjour,

J'ai créé 2 applications qui communique en Net remoting.
Le serveur générent des événements qui remonte bien au client.
Je voudrais au travers de ces événements mettre à jour une barre de
progression.

Dans la méthode de l'événement, je fis appelle à un invoke mais j'ai un
figeage systématique de mon application au niveau de l'invoke.
J'ai fais plusieures recherches sur le net et ne j'arrive pas comprendre
pourquoi.

Si une personne pouvait m'expliquer ou j'ai fais une erreur ou la méthode à
employer.

Merci d'avance.

Voici une partie de mon code :

Dans ma classe
public delegate void pgbStepValueCallback(int pintValue);
public pgbStepValueCallback myDelegate;

Dans mon constructeur
myDelegate = new pgbStepValueCallback(pgbStepValueMethod);

Dans mon événement
private void OnServiceStatus(object sender, ServiceStatusEventArgs e)
{
frmRupture objFrmRupture = this;
objFrmRupture.Invoke(objFrmRupture.myDelegate, new object[] { e.Step });
Console.WriteLine(e.Step + " - " + e.State);
}

Ma fonction pour le Delegate
public void pgbStepValueMethod(int pintValue)
{
pgbStep.Value = pintValue;
}

6 réponses

Avatar
Lemming
Bonjour,

Le code paraît correct (bien que peu orthodoxe). Es tu certain que la
valeur de Step est valide pour pgbStep?
Quelques suggestions:
- Tente un BeginInvoke, qui rendra la main immédiatement au thread remoting,
plutôt qu'un Invoke
- Vérifie (if (pintValue > pgbStep.Maximum) return;) la valeur de step, il
arrive que les Exceptions cross-thread soient mal/pas rapportées par Visual
Studio.

Luc

"Romuald SAURIN" a écrit :

Bonjour,

J'ai créé 2 applications qui communique en Net remoting.
Le serveur générent des événements qui remonte bien au client.
Je voudrais au travers de ces événements mettre à jour une barre de
progression.

Dans la méthode de l'événement, je fis appelle à un invoke mais j'ai un
figeage systématique de mon application au niveau de l'invoke.
J'ai fais plusieures recherches sur le net et ne j'arrive pas comprendre
pourquoi.

Si une personne pouvait m'expliquer ou j'ai fais une erreur ou la méthode à
employer.

Merci d'avance.

Voici une partie de mon code :

Dans ma classe
public delegate void pgbStepValueCallback(int pintValue);
public pgbStepValueCallback myDelegate;

Dans mon constructeur
myDelegate = new pgbStepValueCallback(pgbStepValueMethod);

Dans mon événement
private void OnServiceStatus(object sender, ServiceStatusEventArgs e)
{
frmRupture objFrmRupture = this;
objFrmRupture.Invoke(objFrmRupture.myDelegate, new object[] { e.Step });
Console.WriteLine(e.Step + " - " + e.State);
}

Ma fonction pour le Delegate
public void pgbStepValueMethod(int pintValue)
{
pgbStep.Value = pintValue;
}


Avatar
Lemming
Bonjour à nouveau,

Ton code pourrait être simplifié de la manière suivante:

private void OnServiceStatus(object sender, ServiceStatusEventArgs e)
{
pgbStep.BeginInvoke(new MethodInvoker
(delegate() { progressBar1.Value = e.Step; }));
Console.WriteLine(e.Step + " - " + e.State);
}

Je n'ai pas vraiment d'idée quand à la raison du blocage de la barre de
progression. Quelques pistes de recherche:
- Les appels à ton Console.WriteLine indiquent bien que e.Step augmente à
chaque fois?
- les valeurs de e.Step sont bien raisonnables en comparaison à
pgbStep.Maximum et pgbStep.Minimum? (par exemple si ton min/max sont 0/1000
et que les step valent entre 0 et 10, tu ne verrais rien)
- Les appels à OnServiceStatus ne sont ils pas trop rapides? ou trop lents?

Luc

"Romuald SAURIN" a écrit :

Bonjour,

Merci pour ta réponse.
J'ai testé avec le BeginInvoke, je n'ai plus de figeage mais ma progressebar
ne bouge pas. J'ai voulu rajouter un EndInvoke mais la le figeage est revenu.

Les valeurs que je passent dans mon évènement sont inférieures au Maximum de
ma progressbar.

Quand tu me dis que le code est peu orthodoxe, peux-tu me dire ce qu'il
aurait été mieux de faire car j'ai utilisé plusieurs tutos pour le créer et
tous les conseils sont les bienvenue.

Romuald

"Lemming" a écrit :

> Bonjour,
>
> Le code paraît correct (bien que peu orthodoxe). Es tu certain que la
> valeur de Step est valide pour pgbStep?
> Quelques suggestions:
> - Tente un BeginInvoke, qui rendra la main immédiatement au thread remoting,
> plutôt qu'un Invoke
> - Vérifie (if (pintValue > pgbStep.Maximum) return;) la valeur de step, il
> arrive que les Exceptions cross-thread soient mal/pas rapportées par Visual
> Studio.
>
> Luc
>
> "Romuald SAURIN" a écrit :
>
> > Bonjour,
> >
> > J'ai créé 2 applications qui communique en Net remoting.
> > Le serveur générent des événements qui remonte bien au client.
> > Je voudrais au travers de ces événements mettre à jour une barre de
> > progression.
> >
> > Dans la méthode de l'événement, je fis appelle à un invoke mais j'ai un
> > figeage systématique de mon application au niveau de l'invoke.
> > J'ai fais plusieures recherches sur le net et ne j'arrive pas comprendre
> > pourquoi.
> >
> > Si une personne pouvait m'expliquer ou j'ai fais une erreur ou la méthode à
> > employer.
> >
> > Merci d'avance.
> >
> > Voici une partie de mon code :
> >
> > Dans ma classe
> > public delegate void pgbStepValueCallback(int pintValue);
> > public pgbStepValueCallback myDelegate;
> >
> > Dans mon constructeur
> > myDelegate = new pgbStepValueCallback(pgbStepValueMethod);
> >
> > Dans mon événement
> > private void OnServiceStatus(object sender, ServiceStatusEventArgs e)
> > {
> > frmRupture objFrmRupture = this;
> > objFrmRupture.Invoke(objFrmRupture.myDelegate, new object[] { e.Step });
> > Console.WriteLine(e.Step + " - " + e.State);
> > }
> >
> > Ma fonction pour le Delegate
> > public void pgbStepValueMethod(int pintValue)
> > {
> > pgbStep.Value = pintValue;
> > }


Avatar
Romuald SAURIN
Bonjour,

Merci pour ta réponse.
J'ai testé avec le BeginInvoke, je n'ai plus de figeage mais ma progressebar
ne bouge pas. J'ai voulu rajouter un EndInvoke mais la le figeage est revenu.

Les valeurs que je passent dans mon évènement sont inférieures au Maximum de
ma progressbar.

Quand tu me dis que le code est peu orthodoxe, peux-tu me dire ce qu'il
aurait été mieux de faire car j'ai utilisé plusieurs tutos pour le créer et
tous les conseils sont les bienvenue.

Romuald

"Lemming" a écrit :

Bonjour,

Le code paraît correct (bien que peu orthodoxe). Es tu certain que la
valeur de Step est valide pour pgbStep?
Quelques suggestions:
- Tente un BeginInvoke, qui rendra la main immédiatement au thread remoting,
plutôt qu'un Invoke
- Vérifie (if (pintValue > pgbStep.Maximum) return;) la valeur de step, il
arrive que les Exceptions cross-thread soient mal/pas rapportées par Visual
Studio.

Luc

"Romuald SAURIN" a écrit :

> Bonjour,
>
> J'ai créé 2 applications qui communique en Net remoting.
> Le serveur générent des événements qui remonte bien au client.
> Je voudrais au travers de ces événements mettre à jour une barre de
> progression.
>
> Dans la méthode de l'événement, je fis appelle à un invoke mais j'ai un
> figeage systématique de mon application au niveau de l'invoke.
> J'ai fais plusieures recherches sur le net et ne j'arrive pas comprendre
> pourquoi.
>
> Si une personne pouvait m'expliquer ou j'ai fais une erreur ou la méthode à
> employer.
>
> Merci d'avance.
>
> Voici une partie de mon code :
>
> Dans ma classe
> public delegate void pgbStepValueCallback(int pintValue);
> public pgbStepValueCallback myDelegate;
>
> Dans mon constructeur
> myDelegate = new pgbStepValueCallback(pgbStepValueMethod);
>
> Dans mon événement
> private void OnServiceStatus(object sender, ServiceStatusEventArgs e)
> {
> frmRupture objFrmRupture = this;
> objFrmRupture.Invoke(objFrmRupture.myDelegate, new object[] { e.Step });
> Console.WriteLine(e.Step + " - " + e.State);
> }
>
> Ma fonction pour le Delegate
> public void pgbStepValueMethod(int pintValue)
> {
> pgbStep.Value = pintValue;
> }


Avatar
Romuald
Bonjour,

J'ai faits pleins de vérifications par rapport à tes conseils et tout semble
correcte mais pas de progression de ma progressbar, j'ai l'impression que les
valeurs sont mises à jour lorsque que le traitement de ma classe remote se
termine.
Je vais continuer à chercher.

Pour le code simplifié, c'est vrai que c'est plus court et plus simple à
utiliser.

Merci
Romuald



"Lemming" a écrit :

Bonjour à nouveau,

Ton code pourrait être simplifié de la manière suivante:

private void OnServiceStatus(object sender, ServiceStatusEventArgs e)
{
pgbStep.BeginInvoke(new MethodInvoker
(delegate() { progressBar1.Value = e.Step; }));
Console.WriteLine(e.Step + " - " + e.State);
}

Je n'ai pas vraiment d'idée quand à la raison du blocage de la barre de
progression. Quelques pistes de recherche:
- Les appels à ton Console.WriteLine indiquent bien que e.Step augmente à
chaque fois?
- les valeurs de e.Step sont bien raisonnables en comparaison à
pgbStep.Maximum et pgbStep.Minimum? (par exemple si ton min/max sont 0/1000
et que les step valent entre 0 et 10, tu ne verrais rien)
- Les appels à OnServiceStatus ne sont ils pas trop rapides? ou trop lents?

Luc

"Romuald SAURIN" a écrit :

> Bonjour,
>
> Merci pour ta réponse.
> J'ai testé avec le BeginInvoke, je n'ai plus de figeage mais ma progressebar
> ne bouge pas. J'ai voulu rajouter un EndInvoke mais la le figeage est revenu.
>
> Les valeurs que je passent dans mon évènement sont inférieures au Maximum de
> ma progressbar.
>
> Quand tu me dis que le code est peu orthodoxe, peux-tu me dire ce qu'il
> aurait été mieux de faire car j'ai utilisé plusieurs tutos pour le créer et
> tous les conseils sont les bienvenue.
>
> Romuald
>
> "Lemming" a écrit :
>
> > Bonjour,
> >
> > Le code paraît correct (bien que peu orthodoxe). Es tu certain que la
> > valeur de Step est valide pour pgbStep?
> > Quelques suggestions:
> > - Tente un BeginInvoke, qui rendra la main immédiatement au thread remoting,
> > plutôt qu'un Invoke
> > - Vérifie (if (pintValue > pgbStep.Maximum) return;) la valeur de step, il
> > arrive que les Exceptions cross-thread soient mal/pas rapportées par Visual
> > Studio.
> >
> > Luc
> >
> > "Romuald SAURIN" a écrit :
> >
> > > Bonjour,
> > >
> > > J'ai créé 2 applications qui communique en Net remoting.
> > > Le serveur générent des événements qui remonte bien au client.
> > > Je voudrais au travers de ces événements mettre à jour une barre de
> > > progression.
> > >
> > > Dans la méthode de l'événement, je fis appelle à un invoke mais j'ai un
> > > figeage systématique de mon application au niveau de l'invoke.
> > > J'ai fais plusieures recherches sur le net et ne j'arrive pas comprendre
> > > pourquoi.
> > >
> > > Si une personne pouvait m'expliquer ou j'ai fais une erreur ou la méthode à
> > > employer.
> > >
> > > Merci d'avance.
> > >
> > > Voici une partie de mon code :
> > >
> > > Dans ma classe
> > > public delegate void pgbStepValueCallback(int pintValue);
> > > public pgbStepValueCallback myDelegate;
> > >
> > > Dans mon constructeur
> > > myDelegate = new pgbStepValueCallback(pgbStepValueMethod);
> > >
> > > Dans mon événement
> > > private void OnServiceStatus(object sender, ServiceStatusEventArgs e)
> > > {
> > > frmRupture objFrmRupture = this;
> > > objFrmRupture.Invoke(objFrmRupture.myDelegate, new object[] { e.Step });
> > > Console.WriteLine(e.Step + " - " + e.State);
> > > }
> > >
> > > Ma fonction pour le Delegate
> > > public void pgbStepValueMethod(int pintValue)
> > > {
> > > pgbStep.Value = pintValue;
> > > }


Avatar
Gilles TOURREAU
Le Fri, 17 Aug 2007 03:19:28 +0200, Romuald SAURIN
a écrit:

Bonjour,

Merci pour ta réponse.
J'ai testé avec le BeginInvoke, je n'ai plus de figeage mais ma
progressebar
ne bouge pas. J'ai voulu rajouter un EndInvoke mais la le figeage est
revenu.

Les valeurs que je passent dans mon évènement sont inférieures au
Maximum de
ma progressbar.

Quand tu me dis que le code est peu orthodoxe, peux-tu me dire ce qu'il
aurait été mieux de faire car j'ai utilisé plusieurs tutos pour le créer
et
tous les conseils sont les bienvenue.

Romuald

"Lemming" a écrit :

Bonjour,

Le code paraît correct (bien que peu orthodoxe). Es tu certain que la
valeur de Step est valide pour pgbStep?
Quelques suggestions:
- Tente un BeginInvoke, qui rendra la main immédiatement au thread
remoting,
plutôt qu'un Invoke
- Vérifie (if (pintValue > pgbStep.Maximum) return;) la valeur de step,
il
arrive que les Exceptions cross-thread soient mal/pas rapportées par
Visual
Studio.

Luc

"Romuald SAURIN" a écrit :

> Bonjour,
>
> J'ai créé 2 applications qui communique en Net remoting.
> Le serveur générent des événements qui remonte bien au client.
> Je voudrais au travers de ces événements mettre à jour une barre de
> progression.
>
> Dans la méthode de l'événement, je fis appelle à un invoke mais j'ai
un
> figeage systématique de mon application au niveau de l'invoke.
> J'ai fais plusieures recherches sur le net et ne j'arrive pas
comprendre
> pourquoi.
>
> Si une personne pouvait m'expliquer ou j'ai fais une erreur ou la
méthode à
> employer.
>
> Merci d'avance.
>
> Voici une partie de mon code :
>
> Dans ma classe
> public delegate void pgbStepValueCallback(int pintValue);
> public pgbStepValueCallback myDelegate;
>
> Dans mon constructeur
> myDelegate = new pgbStepValueCallback(pgbStepValueMethod);
>
> Dans mon événement
> private void OnServiceStatus(object sender,
ServiceStatusEventArgs e)
> {
> frmRupture objFrmRupture = this;
> objFrmRupture.Invoke(objFrmRupture.myDelegate, new object[]
{ e.Step });
> Console.WriteLine(e.Step + " - " + e.State);
> }
>
> Ma fonction pour le Delegate
> public void pgbStepValueMethod(int pintValue)
> {
> pgbStep.Value = pintValue;
> }





Il faudrait peut-être laisser souffler le thread qui s'occuppe de
l'affichage afin qu'il puisse traiter tous les messages Windows en attente
:

cf. System.Windows.Forms.Application.DoEvents()

Cordialement

--
Gilles TOURREAU


S.A.R.L. P.O.S
Le spécialiste en motoculture depuis + de 30 ans !
http://www.pos.fr
Avatar
Jean BONBEUR
demmarre la demande par un ThreadPool.QueueWorkItem machin chose...
comme ça tu affranchi le thread gui de l'attente synchrone.



"Romuald SAURIN" a écrit dans le
message de news:
Bonjour,

J'ai créé 2 applications qui communique en Net remoting.
Le serveur générent des événements qui remonte bien au client.
Je voudrais au travers de ces événements mettre à jour une barre de
progression.

Dans la méthode de l'événement, je fis appelle à un invoke mais j'ai un
figeage systématique de mon application au niveau de l'invoke.
J'ai fais plusieures recherches sur le net et ne j'arrive pas comprendre
pourquoi.

Si une personne pouvait m'expliquer ou j'ai fais une erreur ou la méthode
à
employer.

Merci d'avance.

Voici une partie de mon code :

Dans ma classe
public delegate void pgbStepValueCallback(int pintValue);
public pgbStepValueCallback myDelegate;

Dans mon constructeur
myDelegate = new pgbStepValueCallback(pgbStepValueMethod);

Dans mon événement
private void OnServiceStatus(object sender, ServiceStatusEventArgs e)
{
frmRupture objFrmRupture = this;
objFrmRupture.Invoke(objFrmRupture.myDelegate, new object[] {
e.Step });
Console.WriteLine(e.Step + " - " + e.State);
}

Ma fonction pour le Delegate
public void pgbStepValueMethod(int pintValue)
{
pgbStep.Value = pintValue;
}