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 :

[Newbie] Threading et controle


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 81
    Par défaut [Newbie] Threading et controle
    Bonjour,

    j'ai une forme avec une listview, des combos et des boutons.
    L'utilisateur peut choisir des éléments dans les combos et clique sur un bouton "Rafraichir" pour afficher le resultat de la requete dans la listview.

    Tout fonctionne parfaitement. Seulement, parfois la requete est plutot lourde (selon la fourchette de date choisie) et le traitement long (4 à 5 secondes pas plus), j'aimerais donc afficher une barre de progression dans la statusbar ou dans une fenetre qui viendrait au premier plan.

    Mais dans un cas j'ai cree un bouton pour les utilisateurs qui permet de mettre automatiquement des valeurs dans les combos et qui lance automatiquement l'évènement clique du bouton rafraichir:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    btnRafraichir_Click(null,null);
    Ca marche aussi.

    Seulement mon probleme est que la requete, mais aussi l'affichage du resultat de la requete, se fait dans l'evenement clique de mon bouton rafraichir.
    Or d'apres le tuto suivant:
    http://glarde.developpez.com/dotnet/bgworker/cs/
    il est dit:
    Que ce soit dans l'envent handler du DoWork ou dans la méthode Treatment, il est totalement interdit de manipuler les contrôles de l'interface utilisateur.
    Comment puis je alors faire pour avoir facilement une barre de progression.

    Ca fait 10 fois que je lis ce tuto et ceux de msdn, je ne parviens pas à comprendre le principe....

    Merci de m'aider.

  2. #2
    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
    Par défaut
    Il te suffit de faire un invoke de la méthode que tu souhaites appeler dans le formulaire.

    Voici un exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    void SomeMethod(SomeType parameter)
    {
        if (this.InvokeRequired)
        {
            this.BeginInvoke(new MethodInvoker(delegate()
                { this.SomeMethod(parameter); }));
        }
        else
        {
             // Do what SomeMethod is supposed to do.
        }
    }
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 81
    Par défaut
    Aie, ca se complique! Je ne sais pas à quoi sert cet Invoke.

    Désolé je ne comprends pas en quoi cela va m'aider.

  4. #4
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    une appli c'est plusieurs thread
    au départ un seul, qui est le thread principal, seul lui peut manipuler les controles

    this.invoke (ou begininvoke) permet de dire au thread principal d'executer un délégué (= lien vers une void) sur son thread

    this.InvokeRequired est un booléen qui dit si dans l'execution actuelle le thread est le thread principal ou non
    si ca retourne true, la manipulation des controles est autorisées, sinon ca veut dire qu'il faut "rebasculer" sur le thread principal
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 81
    Par défaut
    rholalalalala, c'est de pire en pire, je ne comprends decidement rien.

    C'est incroyable, je ne parviens pas à integrer ce fonctionnement.

    Je cherche simplement a afficher une barre de progression durant la connexion et le listage des enregistrement d'une table.
    Comment faire pour faire avancer cette barre alors que je n'ai aucun point de repère dans l'état d'avancement de la connexion et du listage.
    De plus, il me faut le threading car l'utilisateur doit pouvoir annuler la tache.

    Y a t-il 1000 facons de concevoir ce type de fonctionnement?

    Je suis desole de ne pas comprendre.

  6. #6
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    y en a plus ou moins qu'une seule

    mais si tu utilises un backgroundworker y a rien à faire
    je crois qu'il y a un evenement qui sert à dire l'avancement, par contre c'est à toi de dire à combien il est, donc il faut savoir ou trouver l'avancement

    et le multithreading c'est assez simple à comprendre, en mode pas à pas, tu vois la ligne jaune avancer d'une ligne à l'autre pour l'executer, avec plusieurs threads, il y a plusieurs lignes jaunes qui sont à des endroits différents du programme et qui avancent toutes ...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

Discussions similaires

  1. [Thread] Thread dans controller
    Par Kihmé Xs dans le forum Général Java
    Réponses: 2
    Dernier message: 08/08/2011, 09h42
  2. Thread de controle
    Par mashadar17 dans le forum Général Java
    Réponses: 5
    Dernier message: 03/11/2008, 10h21
  3. Multi threading et Control Winforms
    Par sylk974 dans le forum Windows Forms
    Réponses: 4
    Dernier message: 30/08/2007, 17h03
  4. Un timer ? Plein de Timer ? un thread de control ?
    Par vincedom dans le forum Threads & Processus
    Réponses: 2
    Dernier message: 12/06/2006, 13h18
  5. thread qui prend le controle ...
    Par gdpasmini dans le forum POSIX
    Réponses: 14
    Dernier message: 26/04/2006, 12h15

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