IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Forms Discussion :

pourquoi ma boucle fait planté mon appli ?


Sujet :

Windows Forms

  1. #1
    Membre habitué
    Profil pro
    Expert technique
    Inscrit en
    Septembre 2003
    Messages
    328
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert technique

    Informations forums :
    Inscription : Septembre 2003
    Messages : 328
    Points : 159
    Points
    159
    Par défaut pourquoi ma boucle fait planté mon appli ?
    Bonjour,

    J'essaie de développer une application qui initie une connexion en telnet à un serveur asterisk, et qui récupère tout les évènement sur le telnet pour les faire défiler dans un textbox.

    La connexion s'initie correctement, mais dès que la boucle est initiée, l'application refuse de compiler (pas de fenetres, et pas d'erreurs, ni de warning).

    Voilà mon code :
    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
    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
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Net;
    using System.Net.Sockets;
    using System.Text.RegularExpressions;
     
    namespace WindowsFormsApplication1
    {
        public partial class Form1 : Form
        {
            public Form1() {
                InitializeComponent();
            }
     
            private void Form1_Load(object sender, EventArgs e) {
                String ip = "xxx.xxx.xxx.xxx";
                String user = "xxxx";
                String pass = "xxxx";
     
                Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                IPEndPoint serverEndPoint = new IPEndPoint(IPAddress.Parse(ip), 5038);
                clientSocket.Connect(serverEndPoint);
     
                clientSocket.Send(Encoding.ASCII.GetBytes("Action: Login\r\nUsername: " + user + "\r\nSecret: " + pass + "\r\n\r\n"));
     
                int bytesRead = 0;
     
                do {
                    byte[] buffer = new byte[1024];
                    bytesRead = clientSocket.Receive(buffer);
     
                    string response = Encoding.ASCII.GetString(buffer, 0, bytesRead);
     
                    if (Regex.Match(response, "Message: Authentication accepted", RegexOptions.IgnoreCase).Success)
                    {
                        msg.Text = "---------- CONNECTE AU SERVEUR " + ip + " ----------";
                        msg.Refresh();
                    }
                    else
                    {
                        msg.Text = response;
                        msg.Refresh();
                    }
     
                } while (bytesRead != 0);
     
                msg.Text = "Connexion au serveur " + ip + " perdue !";
                msg.Refresh();
            }
        }
    }
    J'ai testé ce code dans une application console, ça fonctionne bien. une petite idée svp ? Je débute en programmation et j'utilise visual studio 2008.

    merci d'avance pour votre aide.

  2. #2
    Responsable .NET

    Avatar de Hinault Romaric
    Homme Profil pro
    Consultant
    Inscrit en
    Janvier 2007
    Messages
    4 570
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2007
    Messages : 4 570
    Points : 252 372
    Points
    252 372
    Billets dans le blog
    121
    Par défaut
    si ton programme plante au niveau de la boucle sa veut dire qu'elle ne parvient pas a sortie de celle ci donc que la valeur de bytesRead n'est jamais égal a 0
    Vous souhaitez participer aux rubriques .NET ? Contactez-moi

    Si déboguer est l’art de corriger les bugs, alors programmer est l’art d’en faire
    Mon blog, Mes articles, Me suivre sur Twitter
    En posant correctement votre problème, on trouve la moitié de la solution

  3. #3
    Membre habitué
    Profil pro
    Expert technique
    Inscrit en
    Septembre 2003
    Messages
    328
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert technique

    Informations forums :
    Inscription : Septembre 2003
    Messages : 328
    Points : 159
    Points
    159
    Par défaut
    Oui, ben c'est le but.

    Elle n'est pas censé en sortir. La boucle récupère tout ce qui transite sur le telnet du serveur. la valeur vient à 0 si la connexion est perdue.

    Ce code marche niquel en appli console. Mais impossible de la faire fonctionner en WindowsForm.

  4. #4
    Expert éminent
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Points : 7 660
    Points
    7 660
    Par défaut
    Ta form ne s'affichera jamais. L'événement Load est déclenché avant l'ouverture ce la Form. Avec ta boucle tu ne sortiras pas de la méthode Form1_Load (méthode associé à l'événément Load) et donc ta Form ne s'affichera pas.

    Il faudrait que tu lances ton traitement dans un autre thread, pour ne pas bloquer la partie graphique. Avec une recherche tu devrais trouver tout ce qu'il faut la dessus.
    Pas de questions techniques par MP

  5. #5
    Membre habitué
    Profil pro
    Expert technique
    Inscrit en
    Septembre 2003
    Messages
    328
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert technique

    Informations forums :
    Inscription : Septembre 2003
    Messages : 328
    Points : 159
    Points
    159
    Par défaut
    oki d'accord. J'ai trouvé le tuto pour créer un thread, mais je rencontre un problème.

    dans ma Form1, j'ai un textbox msg. Je voudrai réécrire ce textbox toutes les x secondes. Mais je n'arrive pas à accéder à l'objet msg depuis mon ThreadLoop :

    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
    private void Form1_Load(object sender, EventArgs e)
            {
                Form1 MyForm = new Form1();
     
                Thread t = new Thread(new ThreadStart(ThreadLoop));
                t.Start();
            }
     
    public static void ThreadLoop()
    	{
            while (Thread.CurrentThread.IsAlive)
            {
                Thread.Sleep(2000);
                msg.Text = "toto";
    		}
    	}
    Quelque chose m'échappe, et je ne vois pas quoi :s

  6. #6
    Expert éminent
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Points : 7 660
    Points
    7 660
    Par défaut
    C'est à dire tu n'arrives pas à accéder ?

    Regarde du côté de la méthode Invoke (sur le forum ca a été traité plusieurs fois) afin d'accéder à un contrôle depuis un autre thread. Car en WinForm seul le thread principal peut modifier les contrôles. C'est probablement le problème que tu rencontre.
    Pas de questions techniques par MP

Discussions similaires

  1. OpenFileDialog fait crasher mon appli
    Par Benlev dans le forum C#
    Réponses: 12
    Dernier message: 05/03/2011, 19h47
  2. xmlDocPtr plante mon appli
    Par lrgtk dans le forum C
    Réponses: 5
    Dernier message: 14/01/2010, 18h43
  3. CArray RemoveAll plante mon appli
    Par damdam78 dans le forum MFC
    Réponses: 5
    Dernier message: 10/09/2008, 12h46
  4. delete[] plante mon appli !
    Par Dauphin dans le forum C++Builder
    Réponses: 8
    Dernier message: 10/12/2005, 21h52
  5. [Graphics2D] Mon panel fait ramer mon appli
    Par legzo dans le forum 2D
    Réponses: 6
    Dernier message: 22/07/2005, 16h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo