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

VB.NET Discussion :

Tchat vb.NET application WPF | un Thread qui me mène la vie dure


Sujet :

VB.NET

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    205
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2006
    Messages : 205
    Points : 125
    Points
    125
    Par défaut Tchat vb.NET application WPF | un Thread qui me mène la vie dure
    Bonjour,

    J'essaye de mettre en place un tchat en vb.net dans une application WPF.
    J'utilise Remoting et le protocole TCP.
    Mon serveur marche et les appels de fonction entre le client et le serveur marche aussi.

    Seulement quand je fais ma fonction PoollServer afin de faire un tchat, je l’exécute dans un thread et lors de l’exécution quand il sort du sleep()
    J'ai une belle pop up impossible d’exécuter le thread car il n'est pas prioritaire à un autre
    .......

    Voici l'appel :

    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
        Private Sub PollServer()
            Dim _True As Boolean = True
            Do
                Try
                    Thread.Sleep(50000)
                    Dim clients As ArrayList = Operation.getClients()
                    List.Items.Clear()
                    For Each clientName As String In clients
                        List.Items.Add(clients)
                    Next
                    Dim sessionText As String = Operation.getChatSession()
                    TchatBox.Clear()
                    TchatBox.Text = sessionText
                Catch ex As Exception
                    MessageBox.Show("Probleme de connection avec le serveur : " + ex.Message)
                End Try
     
            Loop While _True
        End Sub
     
        Private Sub ButtonSend_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles ButtonSend.Click
            thrd = New Thread(AddressOf PollServer)
            thrd.SetApartmentState(ApartmentState.STA)
            thrd.IsBackground = True
            thrd.Start()
            Operation.AddText(Name + ":\n" + TextSend.Text + "\n\n")
            TextSend.Clear()
        End Sub

    appel du server :

    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
        <STAThread()> _
        Public Shared Sub Main(ByVal args() As String)
            Try
                ' Création d'un nouveau canal d'écoute sur le port 1069
                Dim op As New Operation()
                Dim channel As TcpChannel = New TcpChannel(1069)
                ' Enregistrement du canal
                ChannelServices.RegisterChannel(channel, True)
                ' Démarrage de l'écoute en exposant l'objet en Singleton sinon il y a SingleCall 
                'mais c'est mieux Singleton d'après ce que j'ai compris (surtout pour les clients qui utilise le meme objet)
                RemotingConfiguration.RegisterWellKnownServiceType(GetType(Operation), _
                "Operation", WellKnownObjectMode.Singleton)
                Console.WriteLine("Le serveur a démarré avec succés")
                Console.ReadLine()
     
                TrackingServices.RegisterTrackingHandler(New TrackingServices())
            Catch
                Console.WriteLine("Erreur lors du démarrage du serveur")
                Console.ReadLine()
            End Try
        End Sub
    Si quelqu'un pourrait m'aider car j'ai pas trouver la réponse sur le net ... J'ai essayer de comprendre les Dispatcher.Invoke et backgroundWorker sans succès et je me dis que ça doit être simple pourtant avec le Framework 4...

    Merci d'avance !

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    jamais vu ce message d'erreur... par contre, si tu exécutes PollServer dans un nouveau thread, tu ne peux pas accéder à l'interface graphique à partir de ce thread. Seul le thread principal peut faire ça. Si tu as besoin d'accéder à l'interface à partir d'un autre thread, utilise Dispatcher.Invoke :


    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
        Private Sub PollServer()
            Dim _True As Boolean = True
            Do
                Try
                    Thread.Sleep(50000)
                    Dim clients As ArrayList = Operation.getClients()
                    Dispatcher.Invoke(new Action(Of ArrayList)(AddressOf UpdateClients), clients)
                    Dim sessionText As String = Operation.getChatSession()
                    Dispatcher.Invoke(New Action(Of String)(AddressOf UpdateText), sessionText)
                Catch ex As Exception
                    Dispatcher.Invoke(New Action(Of String)(AddressOf MessageBox.Show), "Probleme de connection avec le serveur : " + ex.Message)
                End Try
     
            Loop While _True
        End Sub
     
    Private Sub UpdateClients(ArrayList clients)
        List.Items.Clear()
        For Each clientName As String In clients
            List.Items.Add(clients)
        Next
    End Sub
     
    Private Sub UpdateText(String text)
        TchatBox.Text = text
    End Sub

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    205
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Avril 2006
    Messages : 205
    Points : 125
    Points
    125
    Par défaut
    Si je pouvais je te donnerais 100pts

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 19/12/2010, 13h42
  2. Réponses: 2
    Dernier message: 22/07/2009, 08h39
  3. [.Net]Application non fluide : threads?
    Par Finality dans le forum Windows Forms
    Réponses: 10
    Dernier message: 22/12/2007, 21h47
  4. Réponses: 6
    Dernier message: 11/05/2006, 16h00

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