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

C# Discussion :

déplacement fleche bas haut listView crash


Sujet :

C#

  1. #1
    Membre averti
    Inscrit en
    Avril 2010
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 45
    Par défaut déplacement fleche bas haut listView crash
    Bonjour
    J'ai une listeView, je peux me déplacer rapidement entre les items avec les flèches bas et haut (a chaque listView1_SelectedIndexChanged une action se produit avec un calcul)

    Donc lorsque j'ai beaucoup d'items dans ma listeView il arrive que le programme crash (ne répond pas) lorsque je me déplace rapidement dans la listeView

    Comment faire pour régler ce problème ?

  2. #2
    Membre Expert
    Avatar de Samuel Blanchard
    Homme Profil pro
    Expert .NET
    Inscrit en
    Février 2010
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Expert .NET

    Informations forums :
    Inscription : Février 2010
    Messages : 1 504
    Par défaut
    Bonjour,

    Si tu utilises un ListView sans virtualiser ses items tu risques d'étrangler passablement Windows, car le ListView va tenter de dessiner tout ses items même ceux qui ne sont pas visibles.

    Pour virtualiser un ListView en WinForm c'est un peu compliqué mais ça vaut le coup de s'y attarder :

    http://blogs.msdn.com/b/hippietim/ar...20/555893.aspx

  3. #3
    Membre averti
    Inscrit en
    Avril 2010
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 45
    Par défaut
    Merci je vais essayer de regarder de ce coté la

    Mais comme tu le dis c'est un peu compliqué, si quelqu'un connait une astuce pour régler mon problème facilement je suis preneur

    merci

    edit: je reconstruit régulierement ma listeview, elle na pas de taille fixe, du coup je sais meme pas si je peux le faire envirtuel

  4. #4
    Membre averti
    Inscrit en
    Avril 2010
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 45
    Par défaut
    J'ai regardé un peu le mode virtuel
    il faut effectivement un nombre fixe d'items
    deplus apparament le mode virtuel permet d'afficher un tres grand nombre d'items

    hors je n'ai toujours que moins de 100 items, le probleme vient lorsque je change tres vite d'items avec les fleches cela crash mon programme (a chaque changement d'index de la listeview je fais calculs)

  5. #5
    Membre Expert
    Avatar de Samuel Blanchard
    Homme Profil pro
    Expert .NET
    Inscrit en
    Février 2010
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Expert .NET

    Informations forums :
    Inscription : Février 2010
    Messages : 1 504
    Par défaut
    il faut effectivement un nombre fixe d'items
    Dans l'exemple que je t'ai donné oui mais tu peux le changer normalement sans problème le tableau utilisé en List.

    hors je n'ai toujours que moins de 100 items, le probleme vient lorsque je change tres vite d'items avec les fleches cela crash mon programme (a chaque changement d'index de la listeview je fais calculs)
    Si tu n'as que 100 items et que c'est le calcul qui prend du temps, peut être peux-tu envisager un pré-calcul avant l'affichage ?

  6. #6
    Membre averti
    Inscrit en
    Avril 2010
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 45
    Par défaut
    je crois que c'est ce que je fais, le calcul permet d'afficher justement différents choses en fonction du calcul,

    et a chaque changement d'index de la listView, le calcul est refais ...

    lorsque j'arrive a 50 ou plus items et j'utilise les fleches haut et bas pour me déplacer rapidement dans la listView, le programme se fige "ne répond plus"

    je n'ai peut être pas compris ou tu voulais en venir avec le pré calcul

  7. #7
    Membre Expert
    Avatar de Samuel Blanchard
    Homme Profil pro
    Expert .NET
    Inscrit en
    Février 2010
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Expert .NET

    Informations forums :
    Inscription : Février 2010
    Messages : 1 504
    Par défaut
    et a chaque changement d'index de la listView, le calcul est refait ...
    Oky je vois.

    Peut-être pourrais-tu mettre en place un Timer qui se lance et interrompt le précédent après chaque changement d'index du ListView.

    Le but étant de ne lancer le calcul qu'une fois que l'utilisateur est bien sûr de sa selection (et ainsi eviter les problème de changement d'index rapide via les touches)

  8. #8
    Membre averti
    Inscrit en
    Avril 2010
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 45
    Par défaut
    Je vois, je vais voir si jy arrive.
    Je recherche quand même une solution simple, même un truc pas super optimiser, tant que c'"est simple a faire.
    merci pour tes reponses

  9. #9
    Membre averti
    Inscrit en
    Avril 2010
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 45
    Par défaut
    Bon j'ai regler mon problème en faisant un truc vraiment pas du tout beau
    Dis moi ce que tu en penses

    Dans mon SelectedIndexChanged

    Je créer un nouveau Thread et je le start ....

    Vu je mes calculs utilise des informations du thread de la form ... je dois utiliser un invoke

    du coup cela fait

    SelectedIndexChanged
    -> new Thread
    -> start (testfonction)

    testfonction
    -> invoke(testfonction2)

    testfonction2
    -> calcul

    c'est moche mais cela fait exactement ce que je désire, je peux me déplacer entre les items de ma listeView super rapidement sans que le programme ne plante


    Si tu vois comment améliorer mon astuce ou si tu peux m'expliquer un autre moyen plus "propre" je suis preneur

    merci

  10. #10
    Membre Expert
    Avatar de Samuel Blanchard
    Homme Profil pro
    Expert .NET
    Inscrit en
    Février 2010
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Expert .NET

    Informations forums :
    Inscription : Février 2010
    Messages : 1 504
    Par défaut
    mmmm oui en fait c'est un peu crade car tu lances un paquet de Thread pour pas grand chose...

    Regarde ma méthode avec un Timer tout bête (non testé) :

    Dans ton Constructeur par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Timer timer = new Timer();
    timer.Interval = 500;
    timer.Tick += new EventHandler(timer_Tick);
    Dans le SelectedIndexChanged

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    // on arrête le précédent
    timer.Stop();
    // on commence un nouveau compte à rebours
    timer.Start();
    Le Timer est appelé après 500 ms sans interruption !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void timer_Tick(object sender, EventArgs e)
    {
      // execution de ton calcul
    }

  11. #11
    Membre averti
    Inscrit en
    Avril 2010
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 45
    Par défaut
    ok je vais essayer ca, (merci pour le bout de code car je n'avais jamais utilsé de timer)

    Sinon dans mon cas je Abort le thread aussi avant d'en recréer un ...
    ca reste aussi crade je l'admet ^^


    encore merci

    question: un timer ce n'est pas pour lancer une action en boucle ?
    car moi les calculs que je vais lors d'un indexChanged je ne l'ai fait qu'une seule fois

  12. #12
    Membre averti
    Inscrit en
    Avril 2010
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 45
    Par défaut
    Alors effectivement cela tourne en boucle lorsque je reste sur un index
    j'ai donc rajouté une ligne stop a la fin du tick (à la fin de mon calcul)
    Aussi comme a la fin de mon calcul j'affiche quelque chose j'ai baissé l'interval à 100, sinon cela faisait une petite attente a chaque fois
    cela donne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Timer timer = new Timer();
    timer.Interval = 100;
    timer.Tick += new EventHandler(timer_Tick);
    Dans le SelectedIndexChanged

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    // on arrête le précédent
    timer.Stop();
    // on commence un nouveau compte à rebours
    timer.Start();
    Le Timer est appelé après 100ms sans interruption !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void timer_Tick(object sender, EventArgs e)
    {
      // execution de ton calcul
     
    timer.Stop();
    }
    Dis moi ce que tu en penses

  13. #13
    Membre Expert
    Avatar de Samuel Blanchard
    Homme Profil pro
    Expert .NET
    Inscrit en
    Février 2010
    Messages
    1 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Expert .NET

    Informations forums :
    Inscription : Février 2010
    Messages : 1 504
    Par défaut
    Alors effectivement cela tourne en boucle lorsque je reste sur un index
    j'ai donc rajouté une ligne stop a la fin du tick (à la fin de mon calcul)
    Oui effectivement j'avais oublié le Timer Stop
    Comme je te le disais dans mon dernier post je n'avais pas testé la chose

    Aussi comme a la fin de mon calcul j'affiche quelque chose j'ai baissé l'interval à 100, sinon cela faisait une petite attente a chaque fois
    cela donne
    A toi de voir pour l'intervalle. Il faut juste que le calcul ne se déclenche pas trop tot pour ne pas bloquer ton appli par des calculs que l'utilisateur ne veut pas forcément voir (puisqu'il se ballade avec les fleches), pas trop tard pour que l'utilisateur n'attende pas trop longtemps le resultat d'un calcul qu'il souhaite voir.

  14. #14
    Membre averti
    Inscrit en
    Avril 2010
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 45
    Par défaut
    Ok bha merci tu ma confirmé le timer.stop a lafin de mon calcul (dans Tick)

    Sinon c'est clairement mieux que ma première méthode ou je voyais le processeur passé directement dans le rouge lol

    maintenant c'est parfait

    merci pour ton aide

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 07/10/2011, 15h41
  2. [WD11] Molette souris Bas/Haut
    Par Redg9 dans le forum WinDev
    Réponses: 3
    Dernier message: 06/04/2010, 21h16
  3. Filtres sonores (passe-bas/haut, coupe-bande, passe-bande) sur valeurs échantillonnée
    Par jeroman dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 01/09/2008, 17h47
  4. Pb touche fleche haut et Bas
    Par Andry dans le forum Delphi
    Réponses: 5
    Dernier message: 23/10/2006, 11h53
  5. Lire un son WAVE + filtre passe BAS/HAUT
    Par selmak7 dans le forum C++Builder
    Réponses: 2
    Dernier message: 15/08/2006, 13h45

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