Utilisation de delegate entre 2 namespace

Résolu
Signaler
Messages postés
7
Date d'inscription
jeudi 20 novembre 2003
Statut
Membre
Dernière intervention
16 octobre 2009
-
Messages postés
7
Date d'inscription
jeudi 20 novembre 2003
Statut
Membre
Dernière intervention
16 octobre 2009
-
Bonjour;
Voici mon probléme:
Dans un fichier ce trouve la gestion d'un GPS (  namespace classGPS , class GPS).
Dans un second fichier ce trouve l'affichage des données dans une Form.
Pour l'instant j'utilise un timer dans la Form pour lire les données.
Je préfèrerais que la class GPS fournisse un "delegate"ou un "event" lorsque les données sont prètes.
J'ai essayé plus possibilités sans succés.

Class GPS
public

delegate
void
_DonneesOK();

public
static
_DonneesOK DonneesOK ;

puis
// Données a lire

if ((DonneesOK !=
null)&(wItems[0]==
"GPGGA")){

DonneesOK();

}

dans class Form

GPS

.DonneesOK =
new
GPS.
_DonneesOK(miseAJourDonnees);

puis 

private
void miseAJourDonnees(){

if (tabControl1.SelectedIndex == 0)
// Page Gps{

switch (tabControlGPS.SelectedIndex){

case 0: AffichePageGps();
break;

case 1: AffichePageSatellite();
break;

case 2: AffichePageTrames();
break;}

}

// Page Gps

if (tabControl1.SelectedIndex == 1)
// Page Navigation{ 

}
// Page Navigation}
A l'exécution j'ai une erreur
"Control.Invoke doit être utilisé pour permettre l'interaction avec des contrôles créés dans un autre thread."

Je n'ai trouvé que des examples de "delegate" dans un même fichier ou avec "invoke" avec un objet.
Une aide me serai très utile .
Merci .

 

4 réponses

Messages postés
2676
Date d'inscription
vendredi 28 juin 2002
Statut
Membre
Dernière intervention
13 janvier 2016
25
salut,

il faut que tu mettes toute la mise à jour de l'UI dans une méthode à part void miseAJourUI();, tu crées un délégué miseAJourUIdelegate
dans ton thread qui appelle miseAJourDonnees
, il faut que dans cette méthode :
miseAJourUIdelegate deleg = new miseAJourUIdelegate(miseAJourUI);
if (this.InvokeRequired)
deleg.Invoke();
else
miseAJourUI();

ShareVB
Messages postés
7
Date d'inscription
jeudi 20 novembre 2003
Statut
Membre
Dernière intervention
16 octobre 2009

Bonjour, désolé mais je n'ai pas tout saisi dans tes explications (sans doute l'age).
 1:la signification de UI.
2:Comment appeler miseAJourUI qui je suppose ce trouve dans Form a partir de la classGps.

Merci.
Messages postés
2676
Date d'inscription
vendredi 28 juin 2002
Statut
Membre
Dernière intervention
13 janvier 2016
25
salut,

euh, en faite UI c'est User Interface :
dans la classe GPS tu as un délégué de type _DonneesOK statique auquel tu affectes la méthode miseAJourDonnees tu n'as donc rien à changer dans la classe GPS

par contre, dans la méthode
miseAJourDonnees il faut que tu mettes le code suivant à la place du code existant :

miseAJourUIdelegate deleg = new miseAJourUIdelegate(miseAJourUI);
if (this.InvokeRequired)
deleg.Invoke();
else
miseAJourUI();

le code existant tu le mets dans une méthode miseAJourUI qui sera appelée dans le contexte du bon thread de ta form

et dans ta form, tu mets un delegate void miseAJourUIdelegate(); juste pour pouvoir faire le Invoke de ta méthode miseAJourUI

comme ca, ta classe GPS appelle ta méthode miseAJourDonnees  qui appelle à son tour la méthode MiseAJourUI mais dans le bon thread pour ne pas avoir l'exception InvalidOperation

ceci est nécessaire car tu ne peux accéder aux éléments de ta form que dans le contexte du thread qui les a créés, InvokeRequired appelé sur ta form t'indique si un changement de contexte est nécessaire pour accéder à ta form, autrement dit si tu es dans le bon thread ou pas...

il existe aussi le backgroundworker qui te permet de faire des traitements asynchrones : il y a un thread DoWork qui appelle le thread de ta form pour se mettre à jour...

ShareVB
Messages postés
7
Date d'inscription
jeudi 20 novembre 2003
Statut
Membre
Dernière intervention
16 octobre 2009

Salut ,merci à toi ShareVB pour ces explications .
Je vais pouvoir mettre à jour mon code.
Philippe.