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 :

[C# 2.0] Problème de refresh


Sujet :

C#

  1. #1
    Membre actif Avatar de Mast3rMind
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2006
    Messages : 226
    Points : 219
    Points
    219
    Par défaut [C# 2.0] Problème de refresh
    Bonjour,

    J'ai une form contenant un ProgressBar et un BackgroundWorker. J'ai une grande quantité de données à traiter. J'ai un label au-dessus du progress bar qui indique quelle étape du traitement on est rendu...

    Je fais un "lbl.Update" sur le label pour mettre à jour les infos.

    Seul problème, quand je clique dans la Form ou quand une autre fenêtre tente de prendre le focus, la form gèle complètement...

    Quelqu'un aurait une idée du pourquoi?

  2. #2
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2007
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Plusieurs pistes :


  3. #3
    Membre éclairé
    Avatar de Emerica
    Profil pro
    Consultant
    Inscrit en
    Juillet 2003
    Messages
    190
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2003
    Messages : 190
    Points : 724
    Points
    724
    Par défaut
    Ton application est par défaut monothread. De ce fait, c'est le même thread qui s'occupe de rafrachir tes contrôles graphiques et c'est également lui qui effectue ton traitement. Il est impossible qu'il fasse les deux en mêmes temps ou qu'il sache distribuer son temps entre l'UI et le traitement.

    Le meilleur moyen pour régler ton problème est d'effectuer ton traitement dans un autre thread dédié.

  4. #4
    Membre actif Avatar de Mast3rMind
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2006
    Messages : 226
    Points : 219
    Points
    219
    Par défaut
    De ce fait, c'est le même thread qui s'occupe de rafrachir tes contrôles graphiques et c'est également lui qui effectue ton traitement.
    Ben j'ai un BackgroundWorker qui fait le traitement plus long... je croyais que ça créait un thread non?

  5. #5
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Points : 6 334
    Points
    6 334
    Par défaut
    Citation Envoyé par Mast3rMind
    Ben j'ai un BackgroundWorker qui fait le traitement plus long... je croyais que ça créait un thread non?
    Exact, mais si le traitement est trop lourd, ça peut tout de même perturber la fenêtre, surtout dans le cas d'une machine monoprocesseur.

  6. #6
    Membre actif Avatar de Mast3rMind
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2006
    Messages : 226
    Points : 219
    Points
    219
    Par défaut
    Donc je devrais vraiment me créer un Thread à part pour le traitement et utiliser des Invoke pour changer le Text du label de ma form?

  7. #7
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Points : 6 334
    Points
    6 334
    Par défaut
    Je pense que si le backgroundWorker provoque un freeze, l'utilisation d'un thread simple aura plus ou moins les mêmes effets.
    Que fais tu comme traitement dans le BW ?

  8. #8
    Membre actif Avatar de Mast3rMind
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2006
    Messages : 226
    Points : 219
    Points
    219
    Par défaut
    Le BW lit une ligne à la fois d'un fichier texte, et fait du traitement sur cette ligne (lstStringData dans mon exemple).

    Avec le BW je traite environ 100 lignes par secondes...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    while (lit une ligne d'un fichier de 20 000 lignes, éventuellement peut-être 50 000 lignes et plus)
                {
                    nLineNumber++;
     
                    // Là je met à jour le label de ma form
                    worker.ReportProgress(nLineNumber);
     
                    // Ici je fais du traitement sur la ligne que je viens de lire
                    TraiterLigne(lstStringData);
                }

  9. #9
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Points : 6 334
    Points
    6 334
    Par défaut
    Ha ben ne cherches pas, c'est ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    worker.ReportProgress(nLineNumber);
    C'est cette multitude d'événements qui fait ramer.

  10. #10
    Membre actif Avatar de Mast3rMind
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2006
    Messages : 226
    Points : 219
    Points
    219
    Par défaut
    ok lol t'as raison en fait.

    Je veux bien enlever cette ligne, mais alors comment je vais incrémenter mon progress bar ?

  11. #11
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Points : 6 334
    Points
    6 334
    Par défaut
    Tu l'incrémentes tous les 100 élements si tu en as 10000, ça fait tout de même un défilement un par un.
    A mon avis l'utilisateur s'en moque que ça défile tous les 1 ou tous les 0.01
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (nLineNumber % 100 == 0)

  12. #12
    Membre actif Avatar de Mast3rMind
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2006
    Messages : 226
    Points : 219
    Points
    219
    Par défaut
    Arfff bonne idée ! J'y ai même pas pensé lol

    J'essaie ça et je t'en redonne des nouvelles.

    Merci mon fwèwe

  13. #13
    Membre actif Avatar de Mast3rMind
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2006
    Messages : 226
    Points : 219
    Points
    219
    Par défaut
    Merci à tous pour vos idées et suggestions, ça marche très bien maintenant!

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 16/11/2006, 10h34
  2. Problème de refresh dans une JTable
    Par vano dans le forum Composants
    Réponses: 3
    Dernier message: 04/05/2006, 14h57
  3. Problème de refresh
    Par squallJ dans le forum Oracle
    Réponses: 2
    Dernier message: 17/01/2006, 16h28
  4. problème de refresh sur une DBGrid
    Par lidouka dans le forum Bases de données
    Réponses: 4
    Dernier message: 20/12/2005, 17h12
  5. [TColorBox] : problème de refresh
    Par PpPool dans le forum Composants VCL
    Réponses: 4
    Dernier message: 12/08/2005, 11h09

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