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

Windows Forms Discussion :

[C#] Remplissage continu d'une DataListView bindée sur une DataTable : freeze UI


Sujet :

Windows Forms

  1. #1
    Membre régulier

    Profil pro
    Inscrit en
    Mars 2007
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 35
    Points : 76
    Points
    76
    Par défaut [C#] Remplissage continu d'une DataListView bindée sur une DataTable : freeze UI
    Bonsoir à tous,

    J'ai un soucis concernant une DataListView bindée sur une DataTable. Je reçois en flux continu par TCP des data, qui sont des messages formatés en XML, que je traite puis ajoute dans ma DataTable. La listView étant bindée sur ma DataTable, celle-ci raffraîchit dès que je reçois un message. En flux continu, je dois recevoir un peu près 3000 messages à la seconde

    Le problème est qu'à un moment donné ça freeze complètement l'UI...logique. J'ai essayé de capter l'Event de refresh du control mais apparemment cela est impossible.

    Du coup, la solution (crade) que j'ai réalisé pour le moment c'est de créer un thread auxiliaire qui tourne en boucle et bind, toutes les 200 ms, une copie temporaire de ma DataTable. Cela marche très bien jusqu'à environ 5 mn de fonctionnement. Après ça, l'application rame comme y'a pas mais ne crash pas. Je regarde le gestionnaire des tâches de Windows et attention, tenez vous bien !! Quasiement 1,5 Go de RAM utilisée

    A mon avis le problème est que l'application met dans le stack tous ces bind avec une copie de la DataTable à un instant T afin de le réaliser de manière asynchrone. Du coup arrivé à un moment donné, Windows n'arrive plus à suivre ...

    Une idée pour régler ce fichu problème ?

  2. #2
    Membre expert
    Avatar de GuruuMeditation
    Homme Profil pro
    .Net Architect
    Inscrit en
    Octobre 2010
    Messages
    1 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : .Net Architect
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 705
    Points : 3 568
    Points
    3 568
    Par défaut
    Normalement, si tout est bien bindé, dès qu'il y a une nouvelle ligne dans da datatable, la liste est rafrâichie. Binder en arriere-plan continuellement une copie de la datatable, c'est cata question performances. C'est du WPF, Winform,...?
    Microsoft MVP : Windows Platform

    MCPD - Windows Phone Developer
    MCPD - Windows Developer 4

    http://www.guruumeditation.net

    “If debugging is the process of removing bugs, then programming must be the process of putting them in.”
    (Edsger W. Dijkstra)

  3. #3
    Membre régulier

    Profil pro
    Inscrit en
    Mars 2007
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 35
    Points : 76
    Points
    76
    Par défaut
    C'est du Winform. Je sais que le fonctionnement de base est ainsi et c'est bien ça le problème. Parce que recevoir 300 messages par seconde, c'est autant d'ajout dans la DataTable et donc autant de rafraîchissement. Ces rafraîchissements étant réalisés sur le thread principal, c'est normal qu'à un moment donné l'UI freeze.

    Je sais que ce que j'ai fait pour contourner le problème, c'est cata niveau perf mais pour le moment j'ai vraiment pas d'autre idées :s Il faudrait que je puisse empêcher l'auto-refresh de la liste. J'ai essayé avec un suspendLayout() mais ça ne fonctionne pas.

  4. #4
    Membre régulier

    Profil pro
    Inscrit en
    Mars 2007
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 35
    Points : 76
    Points
    76
    Par défaut
    Bonjour le monde ! Il fait une température extérieur de 5 degrés, le temps est clair, très peu de nuages, bientôt le WE ; une bonne journée de travail s'annonce.

    Bon trêve de plaisanteries ... là je viens de modifier l'appli afin que la DataGridView ne soit plus bindé sur ma DataTable et j'ai placé un compteur de messages sur l'UI afin de voir en temps réel le nombre de messages. L'application ne freeze pas d'un iota et la logbox affiche bien tous les messages que l'application reçoit par flux TCP. Donc conclusion, le problème provient bien lors du redraw du DataGridView à chaque ajout d'une row

  5. #5
    Membre régulier

    Profil pro
    Inscrit en
    Mars 2007
    Messages
    35
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 35
    Points : 76
    Points
    76
    Par défaut
    Bonsoir,

    Problème résolu ! J'ai simplement changé de control graphique. Typiquement j'utilisais un DataGridView custom mais basé sur le même fonctionnement (DataListView), disponible sur ce site : http://www.codeproject.com/KB/list/ObjectListView.aspx.

    Le problème est que le rafraîchissement est assez long. Il est dit sur le site, environ 10 sec pour 10,000 lignes ... c'est énorme ! Du coup le programmeur a implémenté un dérivé qui s'appelle FastDataListView. Pour le même nombre de lignes, le control le fait en 100 ms

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

Discussions similaires

  1. [AC-2010] Simuler un clic sur une page web sur une image javascript
    Par alex en droit dans le forum VBA Access
    Réponses: 2
    Dernier message: 02/04/2012, 13h22
  2. Imprimer sur une page web sur une imprimante spécifique
    Par bleuerouge dans le forum Windows Forms
    Réponses: 0
    Dernier message: 07/12/2009, 09h51
  3. Pb sur une requête DELETE sur une chaine
    Par astrolane dans le forum Sybase
    Réponses: 4
    Dernier message: 16/02/2009, 09h11
  4. Réponses: 5
    Dernier message: 30/01/2008, 09h18
  5. Réponses: 3
    Dernier message: 25/10/2007, 11h47

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