Partage
  • Partager sur Facebook
  • Partager sur Twitter

Réceptionner des données sans tout bloquer

Avec le réseaux.

Anonyme
    23 juin 2011 à 23:13:51

    Bonjour à tous,

    J'ai décidément pleins de problèmes avec sa. Voila, J'ai une application réseaux client/serveur. Pour le serveur j'utilise le mode console avec des sockets asynchrones. Pour le client, je voudrais utiliser des sockets synchrones et faire marcher mon application en même tant le tout sur le même thread si possible pour pouvoir modifier les objets winforms du thread principal (la méthode "invoke" me fait une erreur du type : << Invoke or BeginInvoke cannot be called on a control until the window handle has been created >> sinon.) Le problème c'est que pour réceptionner des données en continue en mode synchrone il faut je crois, faire une boucle infinie.

    ' Exemple
    
     While true
    
       If Socket.Available > 0 then
    
         Dim ReceiveSize as integer = Socket.Receive(Buffer)
         Dim DataString as string = Encoding.UTF8.GetString(Buffer, 0, ReceiveSize)
    
         ' Traitement etc...
    
       End if
    
       Thread.Sleep(2) ' Pour limiter la consommation de processeur
       Application.DoEvents ' Pour permettre à la forms de ne pas se figer.
     
    
     End while
    



    Mais le problème c'est que les méthodes que j'appellent après avoir lancer cette boucle infinie ne pourront pas s’exécuter. Alors comment faire ?

    Merci d'avance.
    • Partager sur Facebook
    • Partager sur Twitter
      24 juin 2011 à 8:04:32

      je sais pas si sa peut t'aidez, mais pour un problème un peu similaire(récupéré les données d'un bus) j'avais utiliser un timer. Je mettais le code que je voulais effectuer toute les 500ms(par exemple) dans mon timer avec justement un timer de 500ms. je mettais 10 ms à récupérer mes données et y me restais 490 ms pour agir sur mon interface. Sinon ben après sa reste les threads t'as pas le choix
      • Partager sur Facebook
      • Partager sur Twitter
      Anonyme
        24 juin 2011 à 12:25:33

        Merci de ta réponse, c'est ce que j'avais fait aussi mais sa me semblai être une méthode assez "à l'arrache". M'enfin si je trouve pas d'autre solution j'utiliserai celle-çi. Maintenant ma question est : Pourquoi quand je fais un invoke sur un autre thread j'obtiens cette erreur :

        << Invoke or BeginInvoke cannot be called on a control until the window handle has been created >>

        FrmMain.Label1.Invoke(new Action(sub() FrmMain.Label1.Text = "montexte"))
        
        • Partager sur Facebook
        • Partager sur Twitter
          24 juin 2011 à 13:03:31

          sa peut paraitre un peu à l'arrache effectivement ^^ mais je pense que ça reste la meilleur solution si on recherche du facil et si le soft n'as pas trop de tache. Si tu peux evitez le multithread, évite. Après sa dépend combien met de temps ton soft a récupéré les données. Moi perso je le vois même pas mon timer, pourtant dedans je récupère mes données et j'actualise tout mon interface wpf.
          • Partager sur Facebook
          • Partager sur Twitter
          Anonyme
            24 juin 2011 à 14:18:43

            Okay, merci je crois que je vais rester sur cette solution alors.
            • Partager sur Facebook
            • Partager sur Twitter

            Réceptionner des données sans tout bloquer

            × 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