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 :

Effet de scintillement


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    505
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2006
    Messages : 505
    Par défaut Effet de scintillement
    Bonjour à vous Oh! grand développeur

    je sollicite votre aide pour m'aider, dans la mesure du possible, à enlever l'effet de scintillement lors d'écriture dans un listview par une opération multi-thread.

    J'ajoute une nouvelle ligne à la fin de chaque thread par délégué et j'ai un effet de sautillement ...genre, lorsque on regarde un écran d'ordinateur dans un film à la télévision, et ce, même si la ligne qui est ajouté est beaucoup plus bas que le bas de l'écran.

    je vous présente mon délégué dans l'espoir d'une solution,j'ai essayé refresh et c'est pire car je ne peut plus me déplacer sur la page.

    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
    Sub DelListVScan(ByVal msg As String)
            'Control.InvokeRequired = False <=>Appel normal du Form
            If Not ListVScan.InvokeRequired Then
                Dim MaStr() As String
                MaStr = msg.Split(";")
                Dim LVI As New ListViewItem
                LVI.UseItemStyleForSubItems = False
                LVI.Text = MaStr(0)
                LVI.SubItems.Add(MaStr(1))
                LVI.SubItems.Add(MaStr(2))
                LVI.SubItems.Add(MaStr(3))
                LVI.SubItems.Add(CDbl(MaStr(4)).ToString("F"))
                LVI.SubItems.Add(CDbl(MaStr(5)).ToString("F"))
                LVI.SubItems.Add(CDbl(MaStr(6)).ToString("F"))
                LVI.SubItems.Add(CDbl(MaStr(7)).ToString("F"))
                LVI.SubItems.Add(CDbl(MaStr(8)).ToString("F"))
                LVI.SubItems.Add(CDbl(MaStr(9)).ToString("F"))
                LVI.SubItems.Add(CDbl(MaStr(10)).ToString("F"))
                LVI.SubItems.Add(MaStr(11))
                If CDbl(MaStr(9)) < 0 Then
                    LVI.SubItems(9).BackColor = Color.Red
                    LVI.SubItems(10).BackColor = Color.Red
                End If
                If CDbl(MaStr(9)) > 0 Then
                    LVI.SubItems(9).BackColor = Color.AliceBlue
                    LVI.SubItems(10).BackColor = Color.AliceBlue
                End If
                ListVScan.Items.Add(LVI)
                'ListVScan.Refresh()
             Else
                'non Appel à delegue de Maniere Asynchrone (BeginInvoke) 
                DelRecLIstVScan = New UIOneArgSub(AddressOf DelListVScan)
                Me.BeginInvoke(DelRecLIstVScan, New Object() {msg})
            End If
    merci à l'avance

  2. #2
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    As-tu essayé de passer la form en DoubleBuffered ?

    Ca permet souvent de corriger ce problème sans avoir rien d'autre à coder.

  3. #3
    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
    à chaque ajout d'item le control recalcul tout et se redessine
    il doit y avoir beginupdate / endupdate ou un truc dans le genre sur le listview
    ca permet pendant l'ajout d'items que le control ne recalcule rien et attende le endupdate pour ne faire tout qu'une fois

    beaucoup de classes traitant beaucoup de données ont des méthodes similaires en général
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  4. #4
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    En même temps, si le listview est alimenté par un autre thread, j'imagine qu'il veut voir le listview se remplir petit à petit, et éventuellement pouvoir l'utiliser pendant qu'il se rempli, je me trompe ?

    Si c'est le cas, l'idée du beginupdate n'est pas bonne je pense, puisque le listview va se comporter de manière synchrone avec le thread de remplissage.

    Idem, j'avais dans l'idée de faire un SuspendLayout(), mais ça va faire perdre l'intérêt d'avoir un thread séparé.

  5. #5
    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
    le problème vient surtout du fait qu'ajouter les lignes une par une est une mauvaise idée

    si le thread ramène 100 lignes, autant toutes les mettre en une seule fois à la fin
    s'il en ramène 1000 alors on peut appeler le délégué toutes les 100 lignes
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  6. #6
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Pol63 Voir le message
    le problème vient surtout du fait qu'ajouter les lignes une par une est une mauvaise idée

    si le thread ramène 100 lignes, autant toutes les mettre en une seule fois à la fin
    s'il en ramène 1000 alors on peut appeler le délégué toutes les 100 lignes
    Si c'est par exemple une liste d'email dans une boîte aux lettres, et qu'il faut 10 minutes pour charger tous les mails de la nuit car la ligne est lente, je doute fortement que l'utilisateur accepte d'attendre 10 minutes avant de pouvoir commencer à utiliser son logiciel. Y'a déjà assez de malheureux dans le monde qui utilisent Lotus Notes sans en rajouter une couche

    En revanche, on peut éventuellement les regrouper à l'aide d'un timer : genre toutes les 5 secondes, on ajoute les lignes retrouvées.

    Tout dépend en fait de la vitesse à laquelle les lignes arrivent.

    Mais je maintiens que la meilleure solution, c'est d'utiliser une listview doublebuffered.

  7. #7
    Membre chevronné
    Homme Profil pro
    Caféinomane
    Inscrit en
    Septembre 2011
    Messages
    202
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Caféinomane

    Informations forums :
    Inscription : Septembre 2011
    Messages : 202
    Par défaut
    Bonjour,

    Pour se débarrasser de ce scintillement :

    Placer ce code juste avant la définition de votre "Public Class Form1" (en supposant que votre formulaire s'appelle form1):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Imports System.Reflection
     
    Public Module ExtensionMethods
     
        Public Sub DoubleBufferedLV(ByVal lv As ListView, ByVal setting As Boolean)
            Dim tlpType As Type = lv.[GetType]()
            Dim pi As PropertyInfo = tlpType.GetProperty("DoubleBuffered", BindingFlags.Instance Or BindingFlags.NonPublic)
            pi.SetValue(lv, setting, Nothing)
        End Sub
     
    End Module
    Ensuite, dans l'évènement Form1.Load(), ajouter ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            ExtensionMethods.DoubleBufferedLV(Listview1, True)
    Remplacez évidemment Listview1 par le nom de votre Listview.

  8. #8
    Invité de passage
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Décembre 2012
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Décembre 2012
    Messages : 1
    Par défaut Fonctionne mais ... petit problème ^^
    Citation Envoyé par franticfranz Voir le message
    Bonjour,

    Pour se débarrasser de ce scintillement :

    Placer ce code juste avant la définition de votre "Public Class Form1" (en supposant que votre formulaire s'appelle form1):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Imports System.Reflection
     
    Public Module ExtensionMethods
     
        Public Sub DoubleBufferedLV(ByVal lv As ListView, ByVal setting As Boolean)
            Dim tlpType As Type = lv.[GetType]()
            Dim pi As PropertyInfo = tlpType.GetProperty("DoubleBuffered", BindingFlags.Instance Or BindingFlags.NonPublic)
            pi.SetValue(lv, setting, Nothing)
        End Sub
     
    End Module
    Ensuite, dans l'évènement Form1.Load(), ajouter ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            ExtensionMethods.DoubleBufferedLV(Listview1, True)
    Remplacez évidemment Listview1 par le nom de votre Listview.
    j'ai effectivement utilisé ta solution ça fonctionne , mais cette méthode empêche l'utilisation graphique du listview :'( mais ça ne clignote plus, je pense qu'on approche de quelque chose ^^.

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    505
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2006
    Messages : 505
    Par défaut
    100/100 résolu merci beaucoup

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

Discussions similaires

  1. Effet de scintillement et amélioration des déplacements
    Par Gobelins dans le forum Débuter
    Réponses: 10
    Dernier message: 24/01/2011, 19h21
  2. [2k3]Effet de scintillement dans un formulaire
    Par nuriel2 dans le forum IHM
    Réponses: 4
    Dernier message: 17/05/2006, 12h20
  3. Pb affichage avec un PaintBox (pour eviter scintillement)
    Par juan64 dans le forum C++Builder
    Réponses: 7
    Dernier message: 08/04/2004, 09h21
  4. [VB6][impression]Comment faire des effets sur les polices ?
    Par le.dod dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 08/11/2002, 10h31
  5. Effet Fade In / Fade Out sur une surface DirectDraw
    Par Magus (Dave) dans le forum DirectX
    Réponses: 3
    Dernier message: 08/09/2002, 17h37

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