1 votes

ListView - comment éviter le scintillement (.NET/C#) ?

Mon application est multithreadée, elle a par exemple 25 threads actifs, et chaque thread pousse son statut à l'élément de vue de la liste par délégué.

exemple :

    private delegate void SetBackColorDelegate(int index, Color color);
    private void SetBackColor(int index, Color color)
    {
        if (listView1.InvokeRequired)
        {
              listView1.Invoke(new SetBackColorDelegate(SetBackColor), new object[] { index, color });

        }
        else
        {
              listView1.Items[index].BackColor = color;
        }
    }

En fonction de l'état, il change la couleur de l'objet, etc. Et il scintille beaucoup, ça fait très vilain :)

Peut-être pouvez-vous suggérer comment éviter cela ? Comment accélérer le dessin ? Ou peut-être devrais-je envisager de commencer à utiliser un autre composant ?

2voto

Martin Harris Points 18057

En attendant votre réponse à mon commentaire. Si le scintillement est un problème de double mise en mémoire tampon, alors la réponse acceptée de la part de cette question vous permettra de vous mettre en route. Configurez votre vue de liste pour utiliser le style de la réponse et vous êtes prêt à partir. Les performances sont pénalisées car les mises à jour des couleurs sont synchronisées avec le taux de rafraîchissement de l'écran (normalement environ 60 fois par seconde), mais cela permet d'éviter les clignotements et les clignements qui se produisent lorsque les mises à jour sont effectuées entre deux rafraîchissements de l'écran.

1voto

Jon Skeet Points 692016

Envisagez de faire en sorte que chaque thread pousse son état dans une structure de données partagée, puis interrogez-la une fois par seconde depuis le thread de l'interface utilisateur à l'aide d'une minuterie. De cette façon :

  • Vous n'avez pas à vous soucier de l'invocation depuis les threads non-UI.
  • Vous n'obtiendrez pas un IU "occupé".
  • Vous serez toujours raisonnablement à jour (contrairement à une approche consistant à dire "ne mettez pas à jour si j'ai déjà mis à jour récemment").

Je ne sais pas grand-chose des minuteries d'interface utilisateur en termes d'efficacité - il est possible qu'une telle minuterie soit relativement coûteuse, de sorte que vous mai Vous devez de toute façon avoir une certaine communication entre les threads : faites en sorte que chaque thread non-UI active le timer s'il ne l'est pas déjà, et désactivez-le lorsque vous effectuez la mise à jour. De cette façon, vous aurez toujours une seconde de retard sur la réalité, mais vous n'aurez toujours qu'une seule mise à jour d'état par seconde.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X