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 :

Thread / GUI / Refresh


Sujet :

Windows Forms

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 51
    Points : 38
    Points
    38
    Par défaut Thread / GUI / Refresh
    Bonjour à tous

    Petite question mais délicate....
    J'ai une IHM composée de trois panels.
    1er panel: un TreeView,
    2ème panel: un graphique
    3ème panel: une ListView.
    (Le tout dans une winforms)

    Tout ce petit monde s'est enregistré auprès du sujet (pattern observer).
    Quand le sujet change je parcours donc ma lise "d'observers" et lance un "DoRefresh" sur chacun d'eux! jusqu'à là tout va bien !!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     foreach (IOBserver obs in obsList)
     {
          obs.DoRefresh();
     }
    Dés qu'un des panel effectue sont "DoRefresh" il va donc recharger ses données, éventuellement faire des traitements au cas où, puis afficher le resultat!

    Ca pourrait être bien, mais le refresh général est long et du coup faut patienter (1 à 2sec - oui je suis pressé). Le traitement pour chaque panel est en soin rapide, mais bon tant que chaque composant fasse son petit traitement, redéssine (par ex: le graphique) bah c'est long!

    Cependant, l'idée m'est venue de créer un Thread dans ma boucle de refresh!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     foreach (IOBserver obs in obsList)
     {
          Thread th = new Thread(new ThreadStart(obs.DoRefresh));
          th.Start();
     }
    boom ! eh oui le fameux cross-thread machin. Pareit que seul le thread qui a créé l'IHM peut le modifier!

    Bon d'accord mais alors pour faire en sorte d'avoir quand même l'impression que chaque "Observer" se met à jour tout seul sans attendre que son camarade ait terminé on fait comment !!??

    La solution de mettre des Invoke ou Begin/EndInvoke (asynchrone) ne marche pas plus.. en fait je n'ai alors plus d'exception mais le temps est multiplié par 10!

    alors comment faire ?
    merci !!

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Je pense qu'il manque des éléments pour qu'on puisse t'aider... En quoi consistent tes objets qui implémentent IObserver ? Quel est le "sujet" dont tu parles ?

  3. #3
    Expert confirmé Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Points : 5 485
    Points
    5 485
    Par défaut
    Bonjour. Ton panneau ne devrait contenir que du code UI, aucun traitement de récupération/transformation de données. Si seules les opérations UI sont réalisées sur le thread UI et que le reste est fait dans un autre thread, tu devrais avoir aucun problème, à moins d'une UI assez monstrueuse.

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 51
    Points : 38
    Points
    38
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Je pense qu'il manque des éléments pour qu'on puisse t'aider... En quoi consistent tes objets qui implémentent IObserver ? Quel est le "sujet" dont tu parles ?
    Bonjour,
    Merci de vos réponses,
    Le sujet représente un modèle de stockage de DVD.
    Treeview: vue hiérarchique,
    Graphique: fréquence,
    Listview: auteur, info...

    Il est vrai que chaque composant panel ("user control") font des requêtes dans un fichier XML pour trouver les infos .

    Quand par exemple un DVD est sélectionné dans le Treeview, alors le graph va chercher les infos sur la fréquence , la listview va chercher les infos etc..

    Donc d'après DonQuiche je devrais faire mes recherches traitement dans un thread à part et lancer après le refresh UI après ?

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par Mattgic Voir le message
    Bonjour,
    Merci de vos réponses,
    Le sujet représente un modèle de stockage de DVD.
    Treeview: vue hiérarchique,
    Graphique: fréquence,
    Listview: auteur, info...
    OK, donc les observers, c'est les contrôles ?

    En gros, toutes les tâches de récupération de données peuvent être faites dans un worker thread, et toutes celles qui accèdent à l'UI doivent être faites dans le thread de l'UI. Ce qui implique qu'il faut bien séparer les 2...

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 51
    Points : 38
    Points
    38
    Par défaut
    Oui les observers sont des controls !
    Donc je dois utiliser un thread pour chaque traitement , puis quand les thread ont fini je "demande" à l'ui de faire un refresh avec les nouvelles données ?

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par Mattgic Voir le message
    Donc je dois utiliser un thread pour chaque traitement , puis quand les thread ont fini je "demande" à l'ui de faire un refresh avec les nouvelles données ?
    Oui, ou alors un thread pour tous les traitements, à toi de voir... mais n'oublie pas que lancer de nombreux threads est couteux en ressources

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 51
    Points : 38
    Points
    38
    Par défaut
    Ok merci, je vais tenter !

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 51
    Points : 38
    Points
    38
    Par défaut
    Ok ! problème à priori résolu!
    Voici ce que je fais suivant vos conseils:

    Dans le sujet j'ai toujours
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    foreach (IOBserver obs in obsList)
     {
          obs.DoRefresh();
     }
    et là maintenant ça change !

    dans chaque observer (implémentant donc DoRefresh) j'utilise un BackgroundWorker

    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
     
    public void DoRefresh()
    {
    	BackgroundWorker worker = new BackgroundWorker();
    	worker.DoWork += new DoWorkEventHandler(DoCalculation);
    	worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(DoRepaint);
    	worker.RunWorkerAsync();
    }
     
    //Méthode lancée de manière asynchrone !
    public void DoCalculation(object sender, DoWorkEventArgs args)
    {
    	//Calculs divers
    }
     
    //Méthode quand tout est terminé !
    public void DoRepaint(object sender, RunWorkerCompletedEventArgs args)
    {
    	//Une fois mes calculs réalisés, je peux faire des refresh sur mes composants graphiques
    }
    Voilà !
    Merci de votre aide

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

Discussions similaires

  1. Mettre le thread GUI en pause
    Par luffydu22 dans le forum Multithreading
    Réponses: 0
    Dernier message: 26/12/2010, 13h41
  2. [Protection de données] Problème de thread GUI
    Par uriotcea dans le forum Multithreading
    Réponses: 16
    Dernier message: 30/07/2010, 14h35
  3. Thread + component + Refresh qui ne se fait pas
    Par superdaok84 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 23/01/2008, 16h57
  4. Problème de GUI et plus exactement de threads, je crois
    Par TabrisLeFol dans le forum AWT/Swing
    Réponses: 2
    Dernier message: 30/05/2006, 17h13
  5. sudoku console + gui + thread
    Par marc_dd dans le forum Interfaces Graphiques en Java
    Réponses: 2
    Dernier message: 28/04/2006, 09h25

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