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 :

Comment rafraichir (refesh) tous les objets d'une class Form ?


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé Avatar de excalybur
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2014
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2014
    Messages : 317
    Par défaut Comment rafraichir (refesh) tous les objets d'une class Form ?
    Ma form contient 60 picturebox et une dizaine de label.

    Ex :
    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
     
    RichTextBoxSolution.Refresh()
                LabelAuthor.Refresh()
                LabelPrice.Refresh()
                LabelYear.Refresh()
                LabelSource.Refresh()
                LabelNumber.Refresh()
                LabelNbPieces.Refresh()
                LabelEnonce.Refresh()
                Label8.Refresh()
     
                PictureBox1.Refresh()
                PictureBox2.Refresh()
                PictureBox3.Refresh()
                PictureBox4.Refresh()
                PictureBox5.Refresh()
                PictureBox6.Refresh()
     
    '.... etc
    Ca devient vide fastidieux !

    Existe-t'il un moyen avec une seule commande pour rafraichir le contenu de la class Form?

    A+

  2. #2
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    c'est surtout que normalement ca ne sert à rien
    les controles winforms sont codés pour se rafraichir automatiquement quand une propriété affectant le rendu (.text, .size, .image ...) change

    sinon il y a for each control in me.controls qui permet de faire le tour de tous les controles sur le form, avec de la récursivité tu peux donc faire le tour de tous les controles des panels ...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre éprouvé Avatar de excalybur
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2014
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2014
    Messages : 317
    Par défaut
    Merci. C'est exact, j'ai oublié de préciser que j'utilise des appels à des thread en boucle. Du coup l'affichage n'a pas le temps de ce rafraichir. et je ne visualise pas l'avancement du travail.

    Je vais étudier ce que tu propose.

    A+

  4. #4
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    les threads autre que le thread principal ne peuvent pas interragir avec les controles
    et je ne vois pas en quoi des threads bloqueraient l'affichage ...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    3 010
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 010

  6. #6
    Membre éclairé Avatar de Sam Placi
    Homme Profil pro
    Développeur occasionnel
    Inscrit en
    Octobre 2019
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur occasionnel

    Informations forums :
    Inscription : Octobre 2019
    Messages : 68
    Par défaut
    Salut à tous ...

    Excalybur devrait envoyer ses codes "à problèmes", je veux dire les zones d'affichage impactées et les boucles d'appel de thread. Nous comprendrions mieux son besoin.

    Excellente journée,

    Sam

  7. #7
    Membre éprouvé Avatar de excalybur
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2014
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2014
    Messages : 317
    Par défaut
    Bonsoir,

    Merci pour votre aide. Voici le code simplifié avec la boucle refresh en fin de code.

    StartResolution est un appel à un thread .exe avec retour de valeurs par les handles. L'opération se fait en boucle et à chaque exécution (sans temporisation) s'affiche un écran avec des Picturebox, des Labels et Texbox. Et c'est cette affichage d'écran qui ne change pas 'faute de temps ' je présume. Action corrective : Avec la boucle refresh que j'ai rajouté cela fonctionne presque nickel. En effet parfois si les textes sont long (>1000 caractères environ) ne s'affiche pas la partie du milieu du texte (il y a un blanc). Certains long Label (>30 caractères sont tronqués). Ceci ce produit pendant le déroulement du processus.

    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
     
     
     'FONCTION LECTURE 1er au dernier problème et affichage écran avec nouvelle résolution 
     
            Call Sablier()
     
            For NumeroProbleme = NumeroDepart To NumeroFin
     
                Call RechercheParIteration()
                Call ModuleResolution()
                Call StartResolution()
                Call FinModuleResolution()
     
                'rafraichir les controles
                Dim Form1Control As Control
                On Error Resume Next
                For Each Form1Control In Me.Controls
                    Form1Control.Refresh()
                Next
     
            Next NumeroProbleme
     
            Call NoSablier()

  8. #8
    Membre éclairé Avatar de Sam Placi
    Homme Profil pro
    Développeur occasionnel
    Inscrit en
    Octobre 2019
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur occasionnel

    Informations forums :
    Inscription : Octobre 2019
    Messages : 68
    Par défaut
    Bonsoir,
    On ne peut lire dans tes codes, que les noms que tu as bien voulu donner au procédure.
    Personne ne pourra t'aider plus sans voir le contenu de ces procédures, notamment Sablier et Nosabler.
    On ne voit pas non plus comment tu lances les threads.
    A part la boucle des Refresh (qui ne sert à rien), il n'y a rien à comprendre dans ce que tu postes.
    Si tu veux de l'aide, il faut nous donner l'occasion de mettre le doigt sur le problème.
    ...

  9. #9
    Membre éprouvé Avatar de excalybur
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2014
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2014
    Messages : 317
    Par défaut
    Bonjour,

    Bien vu, je comprends ta question. Tu as raison il manque des infos.

    Le thread fonctionne en cmd.

    Voici les codes de la seule routine qui peut poser problème => c'est celle qui appelle le thread. Le reste n'est que comestique; Sablier pour afficher le pointeur de la souris en mode recherche et 'no sablier' l'inverse. Les autres ne sont que des convertisseurs alphanumériques de datas pour alimenter le thread via un fichier qu'il appel sur le disque dur : DataInp.txt (ne me demande pas le code des convertisseurs il y en a 25 écrans... sans intérêt pour la question).

    La routine est en mode ProcessWindowStyle.Hidden avec ValidAutoSolution = True

    Voici:

    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    Public Sub StartResolution()
            If tTask1 IsNot Nothing Then tTask1 = Nothing
            tTask1 = New System.Threading.Thread(AddressOf Task1)
            tTask1.IsBackground = True
            tTask1.Start()
        End Sub
     
        Public Sub Task1()
            Try
     
                Using myProcess2 As New Process
                  'charge le programme exe et ses paramètres
                    myProcess2.StartInfo.FileName = Disk + "\abc\xyz.exe"
                    myProcess2.StartInfo.Arguments = " -maxmem 4096000"
                    myProcess2.StartInfo.Arguments = Disk + "\abc\DataInp.txt"
     
                    'Dans notre cas => hidden pour application interface en mode automatique
                    If ValidAutoSolution = True Then
                        myProcess2.StartInfo.WindowStyle = ProcessWindowStyle.Hidden
                    Else
                        myProcess2.StartInfo.WindowStyle = ProcessWindowStyle.Normal
                    End If
     
                    'démarre process exe
                    myProcess2.Start() 
     
                    'temporisation pour éviter message d'erreur 'fichier déjà ouvert' 
                    Thread.Sleep(50)
     
                    'Dimension cmd windows 
                    SetWindowPos(myProcess2.MainWindowHandle, IntPtr.Zero, 1201, 0, 720, 1000, 0)
                    SetWindowText(myProcess2.MainWindowHandle, "Résolution n° " + LabelNumber
     
                End Using
            Catch ex As Exception
     
            End Try
     
        End Sub
    Dans le sub appelant (précédent message) la boucle refresh proposée par pol63 est bien utile pour visualiser chaque résultat du thread qui peut parfois être appelé des centaines de fois. Sans cela le process s'exécute bien mais avec un écran figé ce qui frustrant car on imagine qu'il y a un plantage du process.

    Faut-il mettre une autre tempo pour parfaire l'affichage des longs textes de la boucle refresh? Le but est de perdre le moins de temps possible dans le process.

    Faut-il imaginer une écriture sur un disque virtuelle en mémoire pour accélérer le processus ? => Je ne sais pas faire. Et ça m'intéresse fortement.

    Les tempos c'est bien mais vont-ils bien correspondre à des PC plus lents avec le risque d'avoir le même problème d'affichage ? J'ai un intel i9900K. Il faut que je fasse le test sur un pc plus lent.

    Espérant que cela peut vous aider à trouver la faille. Encore merci pour vos idées.

    A+

  10. #10
    Membre éclairé Avatar de Sam Placi
    Homme Profil pro
    Développeur occasionnel
    Inscrit en
    Octobre 2019
    Messages
    68
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur occasionnel

    Informations forums :
    Inscription : Octobre 2019
    Messages : 68
    Par défaut
    Bonjour,

    Là, il y a matière à réfléchir ...

    Perso, je ne pourrai pas t'aider sur ce problème mais je t'aurai permis de fournir la matière pour les connaisseurs du System.Threading.

    J'espère que quelqu'un t'aidera.

    Cdt,

    Sam

  11. #11
    Membre éprouvé Avatar de excalybur
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Novembre 2014
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2014
    Messages : 317
    Par défaut
    Mon analyse et la solution :

    Le thread fonctionne dans un 'Using statement' ce qui veut dire que le thread est bien fermé a 'End Using'. Donc le thread n'est pas fautif d'un quelconque retard. Mais peut induire des retards graphique selon le lien pas facile à lire proposé par popo (merci pour ta recherche !).

    Du coup on peut simplifier également les tempos thread.sleep() du task qui compensent un éventuel retard du thread.

    En remplacant la boucle refresh proposé par pol63 par une seule ligne : me.refresh après le call StartResolution, tout fonctionne !

    Cerise sur le gateau 230ms de gagner par boucle. CQFD

    Comme toujours en simplifiant l'écriture c'est plus lumineux. Merci pour vos idées.

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

Discussions similaires

  1. Verifier tous les objets d'une class
    Par DezMax dans le forum Langage
    Réponses: 7
    Dernier message: 03/05/2013, 17h22
  2. Réponses: 4
    Dernier message: 04/07/2009, 15h05
  3. Comment tester si tous les éléments d'une page ont été chargés ?
    Par Gat- dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 15/02/2007, 13h19
  4. Réponses: 2
    Dernier message: 06/06/2006, 08h32
  5. [Débutant] Initialiser les propriétés de tous les objets d'une ArrayList
    Par Tententai dans le forum API standards et tierces
    Réponses: 5
    Dernier message: 23/05/2006, 20h24

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