Partage
  • Partager sur Facebook
  • Partager sur Twitter

[c#] Form, réseau et evenement

Sujet résolu
    14 juillet 2011 à 20:24:37

    Bonjour,

    j'ai l'habitude de faire des applications en console (serveur etc...), mais je débute dans les applications graphiques, et j'ai quelques petits soucis.

    Mon but est simple, j'ai une classe network qui doit recevoir tous les paquets sur le réseau (comme un sniffer), et chaque fois qu'un paquet est reçu, un message doit s'afficher dans une listbox.

    Pour se faire, j'ai donc créer un évènement dans ma classe Network, qui est appelé lors de la réception d'un paquet (fonction RcvCallback(IAsyncResult asyncResult)), et j'ai connecté ma form à cette Evénement, chaque fois qu'il est appelé la classe de ma form appelle une fonction qui doit écrire dans la listbox.

    ça donne ceci :

    public Form_main()
            {
                InitializeComponent();
                Network.RcvPacket += new Network.RcvPacketEventHandler(this.SetText);
            }
    
            public void SetText()
            {
                listBox1.Items.Add("test");
            }
    


    Problème : dès que "listBox1.Items.Add("test");" est appelé, l'application se ferme, et c'est la que je compte sur votre aide... =/

    Je précise que j'ai essayé plusieurs choses, par exemple mettre le add de la listbox dans le constructeur de la form fonctionne, ou encore que j'ai le même problème si je remplace la listbox par un textbox.
    • Partager sur Facebook
    • Partager sur Twitter
      15 juillet 2011 à 1:01:10

      Il est levé comment ton évènement dans ta classe Network?
      • Partager sur Facebook
      • Partager sur Twitter
        15 juillet 2011 à 7:57:31

        Il manque certainement un appel à Invoke quelque part, tu trouveras plein d'autres topics avec la même question sur ce même forum. :-°
        • Partager sur Facebook
        • Partager sur Twitter
          15 juillet 2011 à 19:29:56

          C'est vrai que j'ai du mal avec les évènements, faisant que du CPP jusqu'à peu ^^
          En revanche je n'ai pas trouvé de sujet similaire =/

          Pour mon event, j'utilise un delegate, dans ma classe network j'ai donc ceci :

          public delegate void RcvPacketEventHandler ();
                  public static event RcvPacketEventHandler RcvPacket;
          


          Puis dans une fonction j'appelle mon évènement :

          RcvPacket();
          
          • Partager sur Facebook
          • Partager sur Twitter
            15 juillet 2011 à 19:44:08

            Citation : hyriuu

            Puis dans une fonction j'appelle mon évènement :


            Citation : Orwell

            Il manque certainement un appel à Invoke quelque part, tu trouveras plein d'autres topics avec la même question sur ce même forum.


            Il s'agit peut-être du problème qui te fait planter l'application.

            Pour activer l'arrêt de l'application par le débuggueur Visual Studio 2010 (même les exception catchées) => Menu "Déboguer" > "Exceptions..." > Cocher la cases de la colonne "Levé" en face de la ligne "Common Language Runtime Exceptions", pour intercepter les exceptions catchées ou non et/ou cocher la case de la colonne "Non géré par l'utilisateur" en face de la même ligne, pour intercepter uniquement les exceptions qui font planter le programme (exceptions non catchées). Tout ceci ne fonctionne que si tu exécute l'application en mode Debug (Touche F5 sous Visual Studio)

            Peut-être ces cases sont-elles décochées chez toi et ton programme plante à cause d'une "InvalidOperationException" contenant un message du style "Accès inter-thread invalide". Comme l'a dit Orwell, c'est une erreur classique, tu trouveras beaucoup de réponses sur Google.

            Si l'erreur ne vient pas de là, il nous faudrait l'erreur indiquée par le débugueur Visual Studio...En général les erreurs avec leur message sont plutôt explicites.
            • Partager sur Facebook
            • Partager sur Twitter
              15 juillet 2011 à 19:59:01

              Dans le mille, c'est bien une erreur inter-thread. Si c'est une erreur classique je vais chercher.

              Merci en tout cas !

              Edit : un delegate et un invoke et ça marche !
              Il me reste juste un petit problème, lors de la réception de nombreux paquet très rapidement (un téléchargement par exemple), j'ai une exception lors de la fermeture du programme sur l'invoke car la form a été fermé (même si je rajoute un if disposed avant etc...). C'est secondaire je met tout de même le sujet en résolu.
              • Partager sur Facebook
              • Partager sur Twitter
                15 juillet 2011 à 23:52:39

                Citation : hyriuu

                Il me reste juste un petit problème, lors de la réception de nombreux paquet très rapidement (un téléchargement par exemple), j'ai une exception lors de la fermeture du programme sur l'invoke car la form a été fermé (même si je rajoute un if disposed avant etc...).


                Assure-toi de bien cloturer (Shutdown) ton socket au moment de quitter l'application (grâce à l'événement Closing de ta Form par exemple) :)
                Pense aussi à respecter les conventions en rapport avec la création d'événements ;)
                • Partager sur Facebook
                • Partager sur Twitter
                  16 juillet 2011 à 9:57:28

                  En fait j'ai résolu aussi ce problème, j'ai utilisé un BeginInvoke plutôt qu'un Invoke =)
                  • Partager sur Facebook
                  • Partager sur Twitter

                  [c#] Form, réseau et evenement

                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                  • Editeur
                  • Markdown