Cross Thread avec evenement en Net Remoting

Le
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;
}
Questions / Réponses high-tech
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Lemming
Le #12127591
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;
}


Lemming
Le #12127541
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;
> > }


Romuald SAURIN
Le #12127521
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;
> }


Romuald
Le #12127491
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;
> > > }


Gilles TOURREAU
Le #12127481
Le Fri, 17 Aug 2007 03:19:28 +0200, 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;
> }





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
Jean BONBEUR
Le #12127431
demmarre la demande par un ThreadPool.QueueWorkItem machin chose...
comme ça tu affranchi le thread gui de l'attente synchrone.



"Romuald SAURIN" 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;
}


Publicité
Poster une réponse
Anonyme