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 :

Retard d'affichage sous Vb.net


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Mars 2011
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2011
    Messages : 50
    Par défaut Retard d'affichage sous Vb.net
    Bonjour,
    Dans le code qui suit la mise à jour du champ: message.Text = "Programmateur EIB connecté" s'effectue après:
    system.Threading.Thread.Sleep(5000)
    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
     
     REM ouverure port com série
            Try
                com_prog = My.Computer.Ports.OpenSerialPort(EB400_1.port_name, 9600)
            Catch ex As Exception
                MessageBox.Show(ex.Message)
                Return
            End Try
            com_prog.ReadTimeout = 5000          'timeout 5 s
            System.Threading.Thread.Sleep(100)   'tempo 100ms
     
            REM connection programmateur
            Try
                com_prog.Write(Chr(fprog.pc_connect))
                c = com_prog.ReadByte()
            Catch ex As Exception               'programmateur non connecté
                MsgBox(EB400_1.port_name & "  " & ex.Message)
            End Try
            If c = Asc(ack) Then
                message.Text = "Programmateur EIB connecté"
            Else : MsgBox("Programmateur EIB non connecté !!! code: " & c)
                com_prog.Close()
                Return
            End If
            System.Threading.Thread.Sleep(5000)   'tempo 100ms
    Que faut-il faire pour forcer cette mise à jour ?

    Merci pour vos réponses.

  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
    Par défaut
    Il faut savoir que quand tu exécutes quelque chose sur le clic d'un bouton, par exemple, ce code s'exécute sur le même thread que celui qui met à jour l'interface graphique (UI). Donc tant que ton code n'a pas "rendu la main", aucune mise à jour de l'interface graphique ne peut se faire, ce qui inclut le changement du texte d'un label. Là, tu changes la valeur de la propriété Test, mais l'UI n'a pas l'occasion de se redessiner pour refléter ce changement, puisque le Thread.Sleep empêche la méthode de rendre la main.

    La solution simple mais pas très propre est d'appeler Application.DoEvents après le changement de la propriété Text : ça va donner l'occasion à la fenêtre de traiter les évènements "en attente". Par contre, dans les cas un peu complexes ça peut poser des problèmes difficiles à déboguer...

    La solution correcte est d'effectuer tous les traitements longs dans un thread différent de celui de l'UI. Pour faciliter un peu les choses, tu peux utiliser le composant BackgroundWorker. Fais une petite recherche sur Google, tu trouveras plein d'infos là-dessus.

  3. #3
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Mars 2011
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2011
    Messages : 50
    Par défaut
    OK merci pour l'info, je vais essayer.

  4. #4
    Membre émérite Avatar de -N4w4k-
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2011
    Messages
    545
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Savoie (Rhône Alpes)

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

    Informations forums :
    Inscription : Novembre 2011
    Messages : 545
    Par défaut
    Bonjour,

    je suis train de créer une application qui demande une tempo très précise (pour de l'automatisme).
    Je viens de tomber sur cette discussion qui m'a interpelé car j'en arrive au même problème.. J'ai bien compris pour le backgroundworker, mais:

    Est ce que ça veut dire qu'on doit l'utiliser automatiquement pour faire des mises à jour de l'UI dans une grosse application?

    Est ce que cette notion fait partie des design patterns ? facade?

    merki
    mic

  5. #5
    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
    Par défaut
    Citation Envoyé par mic.carrer Voir le message
    Est ce que ça veut dire qu'on doit l'utiliser automatiquement pour faire des mises à jour de l'UI dans une grosse application?
    Je comprends pas très bien ta question... Le BackgroundWorker ne sert pas à faire les mises à jour de l'UI. Au contraire, il sert à faire des traitements longs qui ne sont pas liés à l'UI. En pratique, comme tu as parfois besoin de mettre à jour l'UI pendant le traitement (barre de progression par exemple), le BackgroundWorker fournit un mécanisme pour le faire facilement (méthode ReportProgress et évènement ProgressChanged)

    Citation Envoyé par mic.carrer Voir le message
    Est ce que cette notion fait partie des design patterns ? facade?
    Non, enfin je crois pas...

  6. #6
    Membre averti
    Homme Profil pro
    Enseignant
    Inscrit en
    Mars 2011
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2011
    Messages : 50
    Par défaut
    Voilà: j'ai placé Application.DoEvents() après chaque appel de lecture du port série et cela fonctionne très bien, la mise à jour de l'interface s'effectue sans retard.

Discussions similaires

  1. Réponses: 16
    Dernier message: 24/05/2013, 12h38
  2. Affichage d'état Crystal report XI sous VB.net
    Par kssillati dans le forum VB.NET
    Réponses: 1
    Dernier message: 17/09/2007, 15h22
  3. Réponses: 3
    Dernier message: 17/02/2005, 08h37
  4. Réponses: 6
    Dernier message: 30/01/2005, 23h48

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