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 :

Arrêter un chargement d'information


Sujet :

C#

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    58
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 58
    Points : 61
    Points
    61
    Par défaut Arrêter un chargement d'information
    Bonjour,

    Je suis débutant en C# .
    J'ai plus l'habitude de développer en VB6.

    J'ai réécrit un formulaire de recherche de VB6 en C#.

    Ce formulaire contient un bouton de recherche et qui fait appel à une procédure qui charge les informations dans un contrôle.

    Sur VB6, il y avait le "DoEvents", ce qui me permettait de tester l'événements "Click" du bouton et de stopper la recherche quand l'utilisateur le souhaitait.

    Je ne sais pas comment faire en C#, je pense qu'il faut utiliser les Threads mais aucun exemple que j'ai trouvé me permet d'arrêter ma recherche.

    Mon interface reste figée tout le temps du chargement.

    Si quelqu'un pouvait m'apporter la solution, merci d'avance

  2. #2
    Membre éclairé Avatar de ZaaN
    Inscrit en
    Novembre 2005
    Messages
    819
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 819
    Points : 661
    Points
    661
    Par défaut
    Tu peux par exemple, délégué la recherche à un thread de travail (pour, par exemple permettre d autres actions simultanées dans ton application) et le synchroniser avec le thread principal pour interagir avec lui.(comme le tuer dans ton cas)

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    58
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 58
    Points : 61
    Points
    61
    Par défaut
    Citation Envoyé par ZaaN Voir le message
    Tu peux par exemple, délégué la recherche à un thread de travail (pour, par exemple permettre d autres actions simultanées dans ton application) et le synchroniser avec le thread principal pour interagir avec lui.(comme le tuer dans ton cas)
    Merci pour ta réponse.

    Voici ce que j'ai fait :
    - J'ai créer un Thread qui j'instancie un procédure qui fait appel à ma procédure de recherche dans le contructeur avant l'initialisation des composants.
    - Dans cette procédure je fais : this.BeginInvoke(new rech(recherche));
    - Je fais le start dans mon bouton.

    La recherche se lance, mais j'ai toujours mon interface figée.

    (Je débute dans les Threads, je ne sais si je fais tout dans le bon ordre)

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 547
    Points : 627
    Points
    627
    Par défaut
    Salut,

    tu te trompes de BeginInvoke. =)

    Ici, tu utilises le begininvoke d'un control (qui en fait permet de marshaller une methode sur le thread de ce control) et vu que tu dois l'appeller depuis ta form, ca bloque, normal (c'est comme si tu appellais la methode directement).

    Le begininvoke qui t'interresse, c'est celui la :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Rech r = new Rech(Recherche);
    r.BeginInvoke([...], AsyncCallback, Object);
    //Avec AsyncCallback, la methode de finalisation (appelé à la fin de la procedure)
    //et Object un etat

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    58
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 58
    Points : 61
    Points
    61
    Par défaut
    Citation Envoyé par SirJulio Voir le message
    Salut,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Rech r = new Rech(Recherche);
    r.BeginInvoke([...], AsyncCallback, Object);
    //Avec AsyncCallback, la methode de finalisation (appelé à la fin de la procedure)
    //et Object un etat
    Je dois metter quoi à la place de [...] et Object ?

    Merci.

  6. #6
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    As tu pensé au BackgroundWorker ? ( qui je pense, serai suffisant dans ton cas ... )

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 547
    Points : 627
    Points
    627
    Par défaut
    Utilise de preference la methode de smyley, si tu veux threader facilement.

    Mais sinon, [...] represente les arguements "normaux" de ta methode, Object represente un etat (ca peut etre une variable, le delegué lui-meme etc ...)

    Plus d'infos ici (dernier paragraphe).

  8. #8
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Bonjour,

    J'utilise une autre méthode assez simple:
    Je teste si la position de la souris est sur mon panneau STOP et je demande à l'utilisateur si il veut s'arréter.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    58
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 58
    Points : 61
    Points
    61
    Par défaut
    Citation Envoyé par smyley Voir le message
    As tu pensé au BackgroundWorker ? ( qui je pense, serai suffisant dans ton cas ... )
    Oui, j'ai lu le lien et cela correspond tout à fait à ce que j'ai besoin.

    J'ai donc appliqué cette méthode mais j'ai un souci dans le chargement de mon DataGridView de la recherche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    private long recherche(int nb, int max, BackgroundWorker worker, EventArgs e)
    {
        Initialisation des variables de la requête
        ...
        Chargement de la requête dans un DataSet
        ...
        Mise à jour du DataGridView
    }
    Lors de la mise à jour du DataGridView j'ai l'exception suivante :
    • Opération inter-threads non valide : le contrôle 'dgvDossier' a fait l'objet d'un accès à partir d'un thread autre que celui sur lequel il a été créé.

    Je vois bien que mon contrôle fait parti d'un autre Thread mais comment doit je faire pour charger les données dans mon contrôle ?

    Ou comment l'affecter à mon Thread actuel ?

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    58
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 58
    Points : 61
    Points
    61
    Par défaut
    J'ai trouvé mon erreur, il faut que la fonction renvoi un DataGridView !!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    private DataGridView recherche(int nb, int max, BackgroundWorker worker, EventArgs e)
    {
        // Initialisation des variables de la requête
        // création d'un DataGridView
     
        // Chargement de la requête dans un DataSet
     
        // Mise à jour du DataGridView
     
        // Retourne le DataGridView
    }
    Mais il me reste deux problèmes :
    • A la fin du traitement après le renvoi du résultat de la fonction le "RowCount" de ma "DataGridView" qui se trouve sur Mon "Form" me retourne le nombre de ligne, le contrôle est visible à l'écran mais je ne vois aucune ligne.
    • D'autre part, si l'utilisateur annule la recherche je n'ai aucun résultat alors que je veux quand même afficher les résultats trouvées jusqu'à l'arrêt.

    1. Pourriez-vous me dire pourquoi je ne vois aucune ligne à l'écran alors que le DataGridView contient des lignes ?
    2. Comment faire pour afficher le résultat suite à l'arrêt de la recherche par l'utilisateur ?


    Merci d'avance pour vos réponse.

  11. #11
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Normallement tu dois utiliser BackgroundWorker.ReportProgress pour mettre à jour l'interface ... mais bon t'en qu'a faire, tu peut faire ça :
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    this.Invoke(new MethodInvoker(delegate
    {
      /* Mettre à jour l'interface ici */
    }));
    this.Invoke permet d'exécuter un code sur le Thread de la fenêtre pour palier à l'erreur que tu as.

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    58
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 58
    Points : 61
    Points
    61
    Par défaut
    Merci smyley d'avoir répondu si vite.

    Citation Envoyé par smyley Voir le message
    Normallement tu dois utiliser BackgroundWorker.ReportProgress pour mettre à jour l'interface.
    à l'erreur que tu as.
    je fais comme dans l'exemple de Framework 2.0 : Présentation du composant BackgroundWorker

    Ma ProgressBar ce met bien à jour.
    J'ai trouvé la solution pour le point 2).

    Parcontre je n'arrive toujours pas à visualiser le résultat dans ma DataGridView alors qu'elle contient des lignes.

    Voici le code que j'utilise pour mettre à jour le DataGridView de mon interface :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    dgvDossier = (DataGridView)e.Result;
    Je dois faire quelque chose de travers

  13. #13
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Ne serai-ce pas mieux d'utiliser une ListView ? ou alors une DataTable que l'on modifie et ensuite que l'on charge dans le DataGridView ? car l'histoire de retourner un DataGridView ... je suis pas convaincu

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    58
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 58
    Points : 61
    Points
    61
    Par défaut
    Citation Envoyé par smyley Voir le message
    ou alors une DataTable que l'on modifie et ensuite que l'on charge dans le DataGridView ? car l'histoire de retourner un DataGridView ... je suis pas convaincu
    Oui cela fonctionne avec le DataTable.

    Merci à tous.


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

Discussions similaires

  1. Réponses: 2
    Dernier message: 13/01/2016, 13h08
  2. [WB16] comment arrêter le chargement d'une table
    Par dfio13 dans le forum WebDev
    Réponses: 0
    Dernier message: 28/11/2013, 11h07
  3. Chargement progressif information ListView
    Par italia57 dans le forum Composants graphiques
    Réponses: 4
    Dernier message: 22/08/2012, 16h21
  4. pas de chargement d'information de base de donné
    Par moustaf_26 dans le forum Bases de données
    Réponses: 5
    Dernier message: 05/11/2011, 10h27
  5. ADO.NET Optimisation chargement informations
    Par Pfeffer dans le forum ASP.NET
    Réponses: 8
    Dernier message: 28/03/2008, 11h43

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