c# évènement: aucun rafraichissement
Bonsoir,
je souhaite rafraichir mes équipements quand il y a un changement d'état, et le problème c'est qu'à aucun moment je ne le fais.
onChange est toujours à null. Dois je l'instancier? Comment? où?
j'ai une classe équipement avec:
Citation:
delegate void changementEtat(Equipement sender);
public event changementEtat onChange;
private void change()
{
if (onChange != null) onChange(this);
}
j'apelle change dans cette même classe:
Citation:
private void TraitementMessage(string message)
{
lastMessage = message;
Date_Dernier_Message = DateTime.Now;
if (message.EndsWith("!"))
{
//message Ok
TraitementMessageOk(message);
bEtat = true;
}
if (message.EndsWith("?"))
{
//message non Ok
bEtat = false;
}
//
//client.Close();
//client = new TcpClient();
change();
}
private void Fluxentrant(IAsyncResult result)
{
int nbOctetsLus;
try
{
nbOctetsLus = client.GetStream().EndRead(result);
}
catch
{
nbOctetsLus = 0;
}
if (nbOctetsLus != 0)
{
// converti les octets lus en chaine de caractère
string returndata = System.Text.Encoding.ASCII.GetString(inStream, 0, nbOctetsLus);
// on ajout les caractères reçus aux éventuelles trames déjà reçu précédemment
TramesRecues += returndata;
DecompositionMessagesReçus();
}
else
{
bEtat = false;
//Console.WriteLine("Etat=false");
change();
}
Quand je change d'état je veux rafraichir mes icônes sur ma form, code de ma form Ecran_2O, dans le load:
Citation:
Eq.onChange += Icone_onChange;
Code:
1 2 3 4 5
|
private void Icone_onChange(Equipement sender)
{
Invoke(new MethodInvoker(Refresh));
} |
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|
private void Icone_Paint(object sender, PaintEventArgs e)
{
//lequel icone est relacher
PictureBox Icone = sender as PictureBox;
//liée equipement à l'icone
Equipement Eq = Icone.Tag as Equipement;
if (Eq.bEtat==true)
e.Graphics.DrawRectangle(new Pen(Color.Green, 5), pictureBox1.ClientRectangle);
else
e.Graphics.DrawRectangle(new Pen(Color.Red, 5), pictureBox1.ClientRectangle);
} |
Merci d'avançe.
Cordialement,
Re: Evènement & Problème asynchrone BeginConnect
Bonsoir,
Concernant mon problème d’événement je lance ma scrutation (envoi de commande à l'équipement) avant de lier quelque chose au delegate. Onchange est par conséquent toujours à null.
Mon problème est le suivant:
Citation:
Une exception de première chance de type 'System.InvalidOperationException' s'est produite dans System.dlll
je n'ai aucune infos supplémentaire, bien que je sois en debugage
Qui semble venir du BeginConnect
Code:
1 2 3 4 5 6 7 8 9
|
Pas à pas détaillé : pas à pas principal dans le code non-utilisateur 'System.Net.Sockets.TcpClient.BeginConnect'
Pas à pas détaillé : pas à pas principal dans le code non-utilisateur 'string.operator =='
Une exception de première chance de type 'System.Net.Sockets.SocketException' s'est produite dans System.dll
Pas à pas détaillé : pas à pas principal dans le code non-utilisateur 'string.operator =='
Pas à pas détaillé : pas à pas principal dans le code non-utilisateur 'string.Split'
Pas à pas détaillé : pas à pas principal dans le code non-utilisateur 'string.operator =='
Pas à pas détaillé : pas à pas principal dans le code non-utilisateur 'System.Collections.Generic.List<WindowsFormsApplication1.Equipement>.Enumerator.MoveNext'
Pas à pas détaillé : pas à pas principal dans le code non-utilisateur 'string.operator ==' |
Code:
1 2 3 4 5 6 7 8 9 10 11
|
Pas à pas détaillé : pas à pas principal dans le code non-utilisateur 'System.Net.Sockets.Socket.SetSocketOption'
Pas à pas détaillé : pas à pas principal dans le code non-utilisateur 'string.Substring'
Pas à pas détaillé : pas à pas principal dans le code non-utilisateur 'string.operator =='
Pas à pas détaillé : pas à pas principal dans le code non-utilisateur 'System.Net.Sockets.TcpClient.BeginConnect'
Une exception de première chance de type 'System.Net.Sockets.SocketException' s'est produite dans System.dll
Pas à pas détaillé : pas à pas principal dans le code non-utilisateur 'string.Split'
Pas à pas détaillé : pas à pas principal dans le code non-utilisateur 'System.DateTime.UtcNow.get'
Pas à pas détaillé : pas à pas principal dans le code non-utilisateur 'System.DateTime.Now.get'
Pas à pas détaillé : pas à pas principal dans le code non-utilisateur 'string.EndsWith'
Pas à pas détaillé : pas à pas principal dans le code non-utilisateur 'string.operator ==' |
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223
|
delegate void changementEtat(Equipement sender);
class Equipement
{
public Point Position;
public int iId_Equipement;
public int iAdresse_RGS;
public string sCE;
public string sAutoroute;
public string sSens_de_circulation;
public string sAdresse_IP;
public int iPort;
public string sBoucle_Terrain;
//public int iCoordonnees_X;
//public int iCoordonnees_Y;
public string sNom;
public string sConstructeur;
public IPAddress ipaddr = IPAddress.Loopback;
private int port;
private bool AddrIsValid = true;
TcpClient client = new TcpClient();
byte[] inStream = new byte[15000];
public string lastMessage = "";
private string TramesRecues = "";
public Boolean bEtat = false;
public int LocalAddr = -1;
public int DefEDF = 0;
public DateTime Date_Dernier_Message;
public event changementEtat onChange;
public bool bConnect = false;
/// <summary>
/// envoi d'un message vers le client
/// </summary>
public void Messageecrit(string message)
{
try
{
// pas d'écriture si pas connecté au client
if (!client.Connected)
{
if (!Connect()) return;
}
try
{
byte[] outstream = System.Text.Encoding.ASCII.GetBytes(message);
client.GetStream().Write(outstream, 0, outstream.Length);
}
catch
{
}
}
catch
{
}
}
/// <summary>
/// Ouvre la connection IP vers le client et lance la scrutation des flux entrants
/// </summary>
public bool Connect()
{
if (!IPAddress.TryParse(sAdresse_IP, out ipaddr)) AddrIsValid = false;
//this.port = iPort;
client.SendTimeout = 1000;
client.ReceiveTimeout = 1000;
IAsyncResult ar;
if (AddrIsValid == false) return false;
// connection
try
{
// tente une connection
ar = client.BeginConnect(sAdresse_IP, iPort, null, null);
}
catch
{
return false;
}
//attent 1 seconde
bool Success = ar.AsyncWaitHandle.WaitOne(1000, false);
// pas de lecture si pas connecté au client
if (!client.Connected) return false;
// lancement de la méthode asynchrone de lecture des flux entrants
client.GetStream().BeginRead(inStream, 0, inStream.Length, Fluxentrant, null);
return true;
}
/// <summary>
/// procédure appelé lors d'un flux entrant
/// </summary>
/// <param name="result"></param>
private void Fluxentrant(IAsyncResult result)
{
int nbOctetsLus;
try
{
nbOctetsLus = client.GetStream().EndRead(result);
}
catch
{
nbOctetsLus = 0;
}
if (nbOctetsLus != 0)
{
// converti les octets lus en chaine de caractère
string returndata = System.Text.Encoding.ASCII.GetString(inStream, 0, nbOctetsLus);
// on ajout les caractères reçus aux éventuelles trames déjà reçu précédemment
TramesRecues += returndata;
DecompositionMessagesReçus();
}
else
{
bEtat = false;
//Console.WriteLine("Etat=false");
change();
}
// relance l'écoute des flux entrants suivants
try
{
if (client.Connected)
{
IAsyncResult ar = client.GetStream().BeginRead(inStream, 0, inStream.Length, Fluxentrant, null);
}
}
catch
{
}
}
private void DecompositionMessagesReçus()
{
// s'il y a des ! ou des ?, on coupe pour avoir un message "complet"
while (TramesRecues.Contains("!") || TramesRecues.Contains("?"))
{
int positionOK = TramesRecues.IndexOf('!');
int positionNonOK = TramesRecues.IndexOf('?');
int pos = 0;
if (positionOK == -1) pos = positionNonOK;
else
if (positionNonOK == -1) pos = positionOK;
else pos = Math.Min(positionOK, positionNonOK);
// coupe suivant la plus petite des positions
string message = TramesRecues.Substring(0, pos + 1);
TraitementMessage(message);
TramesRecues = TramesRecues.Remove(0, message.Length-1);
}
}
private void TraitementMessage(string message)
{
try
{
lastMessage = message;
Date_Dernier_Message = DateTime.Now;
if (message.EndsWith("!"))
{
//message Ok
TraitementMessageOk(message);
bEtat = true;
}
if (message.EndsWith("?"))
{
//message non Ok
bEtat = false;
}
change();
}
catch
{
}
}
private void TraitementMessageOk(string message)
{
try
{
if (message.StartsWith("STATUS")) traitementStatus(message);
if (message.StartsWith("\r\nSTATUS")) traitementStatus(message);
}
catch
{
}
}
private void change()
{
if (onChange != null) onChange(this);
}
public Equipement()
{
}
public void scrutation()
{
Messageecrit("ST\r");
}
public void Deconnexion()
{
client.Close();
}
} |
Il manque la fonction traitement status mais elle ne devrais pas poser de problème.
Merci de m'aider, s'il vous plaît.
Cordialement,
Mickaël.