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

  1. #1
    Membre du Club
    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
    Points : 43
    Points
    43
    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 : 42
    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 749
    Points
    39 749
    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 du Club
    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
    Points : 43
    Points
    43
    Par défaut
    OK merci pour l'info, je vais essayer.

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

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

    Informations forums :
    Inscription : Novembre 2011
    Messages : 545
    Points : 801
    Points
    801
    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
    J’ai des questions à toutes vos réponses!

  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 : 42
    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 749
    Points
    39 749
    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 du Club
    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
    Points : 43
    Points
    43
    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.

  7. #7
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    le DoEvents() est une solution simple, mais présente un inconvénient majeur : si on agit sur l'IHM pendant l'exécution d'un traitement qui fait des DoEvents(), on pourra exécuter le code associé à des event des controls de la Form au milieu d'un traitement.
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

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

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

    Informations forums :
    Inscription : Novembre 2011
    Messages : 545
    Points : 801
    Points
    801
    Par défaut
    @tomlev: Ok je vois un peu mieux. Dans mon application, j'ai un module qui se met à jour toutes les millisecondes (qui écoute/écrit des entrées/sorties) et qui met ensuite à jour un certain nombre d'autre module. Jusque là ça marchait très bien mais maintenant j'ai trop de modules qui tourne en même temps, ça commence à ramer.. J'ai jamais eut ce problème avant alors je ne sais pas trop comment m'y prendre, mais je vais chercher du coté du BackgroundWorker qui m’a l'air, d'après cette brève description, tout à fait adapté. Merci pour ces infos.

    mic

    PS: J'ai fait un petit programme test pour essayer le BackGroundWorker pour ceux que ça intéresse (cf pièce jointe)
    Fichiers attachés Fichiers attachés
    J’ai des questions à toutes vos réponses!

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