philippe54250
Messages postés7Date d'inscriptionjeudi 20 novembre 2003StatutMembreDernière intervention16 octobre 2009
-
16 sept. 2007 à 16:26
philippe54250
Messages postés7Date d'inscriptionjeudi 20 novembre 2003StatutMembreDernière intervention16 octobre 2009
-
20 sept. 2007 à 18:13
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 .
ShareVB
Messages postés2676Date d'inscriptionvendredi 28 juin 2002StatutMembreDernière intervention13 janvier 201626 16 sept. 2007 à 22:15
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();
philippe54250
Messages postés7Date d'inscriptionjeudi 20 novembre 2003StatutMembreDernière intervention16 octobre 2009 19 sept. 2007 à 19:35
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.
ShareVB
Messages postés2676Date d'inscriptionvendredi 28 juin 2002StatutMembreDernière intervention13 janvier 201626 19 sept. 2007 à 22:56
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...