Salut , je réalise en ce moment un petit software de messagerie instantanée et j'ai un petit soucis que je vais essayer de vous exposer.
j'ai donc une classe server.cs qui écoute les connections entrantes
Ensuite j'ai une classe threadContact qui récupere les messages entrant, toujours dans un thread pour ne pas bloquer les autres connections entrantes.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 public void run() { while (true) { try { Socket clientSocket = sockeServ.Accept(); ThreadContact tc = new ThreadContact(clientSocket); tc.messageEvent += new ThreadContact.MessageEventHandler(tc_messageEvent); Thread caller = new Thread(new ThreadStart(tc.run)); caller.Start(); } catch(SocketException s) { } } } public void tc_messageEvent(object sender, MessageArrivedEvent e) { if (e != null) messageEvent(this, e); }
Donc en gros, sur les deux bouts de code précédents, lorsqu'une personne se connecte à moi, je lance un autre Thread (ThreadContact) pour récuperer les messages, et ensuite, forcément, j'utilise le système d'évènements-delegate pour renvoyer ce message à ma classe carnet, ceci explique cela:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 public void run() { // NetworkStream ns = new NetworkStream(socket); byte[] bytes = new byte[256]; // Get reply from the server. socket.Receive(bytes); MessageArrivedEvent e = new MessageArrivedEvent(Encoding.UTF8.GetString(bytes),socket); if (e != null) { messageEvent(this, e); } }
bref je pense que vous avez capté, y a rien d'extraordinaire.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 if (e != null) { messageEvent(this, e); }
Donc maintenant d'un point de vue fonctionnel, une fois que j'ai récupéré ce foutu message dans ThreadContact, je dois le renvoyer à ma classe carnet grâce aux évènements ( ce que je réussis à faire), et il me reste à vérifier, une chose:
LA fenêtre de conversation est-elle déjà ouverte???????
et bien vous l'aurez deviner, dans le cas que je chercher à gerer elle n'est pas ouverte.
Donc voici un extrait de mon code Carnet.cs pas très complexe:
voilà dans dans le bout de code ci-dessus je récupère donc mon évènement, et j'appelle openOrFocusWindow(msg)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 public void tc_messageEvent(object sender, MessageArrivedEvent e) { if (e != null) { MessageBox.Show("coucou" + e.EventText); openOrFocusWindow(e); } } public void openOrFocusWindow(string msg) { //si fenetre pas encore ouverte if (instanceFenetreDejaOuverte==null) { //si fenetre non encore ouverte ctArrivant = new Contact(); ctArrivant.Pseudo = pseudoEm; ctArrivant.Id = idContactEm; //Ouverture d'une nouvelle fenêtre de conversation Fenetre fn = new Fenetre(ContactConnect, ctArrivant, so); fn.Carnet = this; fn.showMsg.AppendText(ctArrivant.Pseudo + " a dit: " + messageFromXml); fn.showMsg.AppendText("\n"); fn.Text = "Vous conversez avec : " + ctArrivant.Pseudo; LesConversationsEnCours.Add(fn); fn.Show(); fn.Focus(); } }
et donc là je vois que ma fenêtre n'est pas encore ouverte, donc bon, j'en crée une nouvelle et je fais un fen.Show().
Et bien, en mode debug je constate donc que la fenêtre s'ouvre bien pendant un instant, mais pas complètement, c'est-à dire que c'est tout blanc à l'intérieur , puis, ensuite lorsque je reviens dans la méthode run de ThreadContact, précisément ici:
et bien apres l'avoir appellé elle disparait, snif!!!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 if (e != null) { messageEvent(this, e); }
Cependant si je fais un ShowDialog() au lieu d'un Show(), ça marche mais ce n'est pas ce que je souhaite.
Voilà si quelqu'un à une idée, n'hésitez pas car c'est un vrai casse tête
Partager