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 :

CLient IRC : La form se fige


Sujet :

Windows Forms

  1. #1
    Membre actif Avatar de Altor
    Homme Profil pro
    Développeur C#.NeT / Administrateur S.I. en alternance / Étudiant CS2I à Nevers
    Inscrit en
    Septembre 2012
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur C#.NeT / Administrateur S.I. en alternance / Étudiant CS2I à Nevers
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2012
    Messages : 103
    Points : 235
    Points
    235
    Par défaut CLient IRC : La form se fige
    Bonjour,

    j'ai programmé un petit client IRC avec un TcpClient, mais quand je me connecte, la form se met en "Ne répond pas" et je ne comprend pas pourquoi.

    Peut-être parce que le Input read trop rapidement ? Le timer1 est set à 100 en interval. - même mis à 1000 ça fige -

    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
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    TcpClient client;
            StreamReader input;
            StreamWriter output;
            int Port;
            string Nick, Server, Buffer;
     
            public Form1()
            {
                InitializeComponent();
            }
     
            private void Form1_Load(object sender, EventArgs e)
            {
     
            }
     
            private void button1_Click(object sender, EventArgs e)
            {
                richTextBox1.Text += "Connect in progress... \n";
     
                if (textBox2.Text == "") { richTextBox1.Text += "Nick is empty. \n";  }
                else if (textBox3.Text == "") { richTextBox1.Text += "Server is empty.\n"; }
                else if (textBox4.Text == "") { richTextBox1.Text += "Port is empty.\n";   }
                else
                {
                    client = new TcpClient();
                    timer1.Start();
                    Nick = textBox2.Text;
                    Server = textBox3.Text;
                    Port = int.Parse(textBox4.Text);
                    Name = "Irc client";
                    client.Connect(Server, Port);
                    input = new StreamReader(client.GetStream());
                    output = new StreamWriter(client.GetStream());
     
                    richTextBox1.Text += "Connected. Identifying... \n";
     
                    output.Write(
                        "USER " + Nick + " 0 * :" + Name + "\r\n" +
                        "NICK " + Nick + "\r\n"
                        );
                    richTextBox1.Text += 
                        "USER " + Nick + " 0 * :" + Name + "\r\n" +
                        "NICK " + Nick + "\r\n"
                       ;
                    output.Flush();
                }
     
            }
     
            private void timer1_Tick(object sender, EventArgs e)
            {
                Buffer = input.ReadLine();
                if (Buffer != null)
                {
                    richTextBox1.Text += Buffer + "\n";
     
                    if (Buffer.StartsWith("PING ")) { 
                        output.Write(Buffer.Replace("PING", "PONG") + "\r\n");
                        richTextBox1.Text += Buffer.Replace("PING", "PONG") + "\r\n";
                        output.Flush(); 
                    }
                    Buffer = null;
                }
     
     
            }
     
            private void richTextBox1_TextChanged(object sender, EventArgs e)
            {
                richTextBox1.ScrollToCaret();
            }
    Où serait mon erreur ? *-*

    Merci d'avance pour votre aide

  2. #2
    Membre actif Avatar de Altor
    Homme Profil pro
    Développeur C#.NeT / Administrateur S.I. en alternance / Étudiant CS2I à Nevers
    Inscrit en
    Septembre 2012
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur C#.NeT / Administrateur S.I. en alternance / Étudiant CS2I à Nevers
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2012
    Messages : 103
    Points : 235
    Points
    235
    Par défaut
    J'ai remarqué que même si la form se place en mode "Ne répond pas", l'utilisateur reste tout de même connecté au serveur :

    -
    Odd is Odd@localhost-C490E8E0 * Irc client
    Odd is using modes +iwx
    Odd is connecting from *@localhost 127.0.0.1
    Odd using irc.local.host LocalHost
    Odd has been idle 16secs, signed on Mon Feb 15 15:34:12
    Odd End of /WHOIS list.
    -

  3. #3
    Membre expérimenté
    Avatar de charouel
    Homme Profil pro
    Freelance
    Inscrit en
    Mars 2009
    Messages
    618
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Mars 2009
    Messages : 618
    Points : 1 454
    Points
    1 454
    Billets dans le blog
    9
    Par défaut
    Si ta Form ça fige utilise un backgroundWorker

  4. #4
    Membre actif Avatar de Altor
    Homme Profil pro
    Développeur C#.NeT / Administrateur S.I. en alternance / Étudiant CS2I à Nevers
    Inscrit en
    Septembre 2012
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur C#.NeT / Administrateur S.I. en alternance / Étudiant CS2I à Nevers
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2012
    Messages : 103
    Points : 235
    Points
    235
    Par défaut
    Qu'est-ce que c'est ?

  5. #5
    Membre expérimenté
    Avatar de charouel
    Homme Profil pro
    Freelance
    Inscrit en
    Mars 2009
    Messages
    618
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Mars 2009
    Messages : 618
    Points : 1 454
    Points
    1 454
    Billets dans le blog
    9
    Par défaut
    Tu peux voir ici c'est quoi un backgroundWorker

    https://msdn.microsoft.com/fr-fr/lib...(v=vs.95).aspx

  6. #6
    Membre actif Avatar de Altor
    Homme Profil pro
    Développeur C#.NeT / Administrateur S.I. en alternance / Étudiant CS2I à Nevers
    Inscrit en
    Septembre 2012
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur C#.NeT / Administrateur S.I. en alternance / Étudiant CS2I à Nevers
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2012
    Messages : 103
    Points : 235
    Points
    235
    Par défaut
    J'ai regardé l'article, j'ai même trouvé un tutoriel ici.

    Mais je n'arrive toujours pas à comprendre comment implémenter le BW dans mon code et comment l'utiliser.
    Mon formateur de C# n'utilisant pas ce système, il n'a pas pu m'aider,

    quelqu'un pourrait il pardonner mon manque de connaissance et aider un petit débutant comme moi à corriger tous ces bugs s'il vous plaît ?

    Merci d'avance pour votre aide

  7. #7
    Membre expérimenté
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2005
    Messages
    562
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2005
    Messages : 562
    Points : 1 511
    Points
    1 511
    Par défaut
    Bonjour,

    Je ne pense pas que l'on puisse qualifier cela de bug ou alors il est au niveau de l'interface clavier-chaise !

    Ton problème est en faite un problème d'asynchronisme, car tout les x milliseconde tu occupes le thread de ton IU à faire quelque chose qui te prend y millisecondes, et donc pendant ce temps ton interface ne peut plus réagir (d’où le ne répond pas) et donc si y devient plus grand que x alors tu ne pourra plus du tout utiliser l'UI car elle sera bloquée en permanence.

    L'idée de charouel est donc de déporter le traitement que tu veux faire dans un backgroundworker qui va te permettre de faire du multi thread assez simplement.

    sinon tu pourrais aussi aller voir du coté de l'asynchronisme et utiliser async/await si tu es en framework >= 4.5.

    J@ck
    Pas de réponse par MP, merci.

    Penser au ça fait plaisir

  8. #8
    Membre régulier Avatar de raOOn
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    100
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Indre et Loire (Centre)

    Informations forums :
    Inscription : Décembre 2006
    Messages : 100
    Points : 112
    Points
    112
    Par défaut
    Ça devrait ressembler à quelque chose près à ça


    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
     
    private void button1_Click(object sender, EventArgs e)
    {
            BackgroundWorker bw = new BackgroundWorker(); //initialisation
            bw.DoWork += new DoWorkEventHandler(bw_DoWork); //la méthode que tu veux exécuter en parallèle
            bw.RunWorkerAsync();
    }
     
    //ici tout le traitement que tu veux paralléliser.. (ceux sont des exemples)
    void bw_DoWork(object sender, DoWorkEventArgs e) {
     
        ...
        client.Connect(Server, Port););
        ...
        input = new StreamReader(client.GetStream());
        output = new StreamWriter(client.GetStream());
        ...
        etc...
    }
    -Écoute, on t'connaît pas, mais laisse nous t'dire que tu t'prépares des nuits blanches... des migraines... des "nervous breakdown", comme on dit de nos jours.
    Paul Volfoni

  9. #9
    Membre actif Avatar de Altor
    Homme Profil pro
    Développeur C#.NeT / Administrateur S.I. en alternance / Étudiant CS2I à Nevers
    Inscrit en
    Septembre 2012
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur C#.NeT / Administrateur S.I. en alternance / Étudiant CS2I à Nevers
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2012
    Messages : 103
    Points : 235
    Points
    235
    Par défaut
    Merci pour votre aide précieuse; ça marche !

    En fouillant le net (oui j'ai que ça à foutre de ma vie ) je suis tombé sur un topic similaire au mien sur un autre forum. J'ai éclairci mon code et j'ai trouvé une solution qui s'apparente à ce morceau de 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
    public async Task Reading()
            {
                try
                {
                    string data;
     
                    while ((data = await input.ReadLineAsync()) != null)
                    {
                        ShowData(data);
                    }
                }
                catch (ObjectDisposedException)
                {
                   // void
                }
            }
    ShowData(); est une fonction personnelle qui affiche les données dans la richtextbox, c'est dans cette fonction que je traiterais les résultats pour les formater à l'écran ([xxxx] <nick> message) et ça marche plutôt pas mal

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Quel client IRC utilisez vous ?
    Par mavina dans le forum IRC / mIRC
    Réponses: 61
    Dernier message: 12/08/2010, 10h25
  2. Projet de client IRC
    Par Leobaillard dans le forum Web & réseau
    Réponses: 13
    Dernier message: 06/03/2006, 18h13
  3. Client Irc avec IdIRC1 (indy 9)
    Par Coussati dans le forum Web & réseau
    Réponses: 1
    Dernier message: 21/11/2005, 23h29
  4. Aide pour un client irc
    Par Coussati dans le forum Web & réseau
    Réponses: 1
    Dernier message: 01/11/2005, 02h35
  5. Réponses: 2
    Dernier message: 31/08/2002, 21h37

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