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 :

Utiliser des multiples backgroundworker


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2015
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Côte d'Ivoire

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

    Informations forums :
    Inscription : Janvier 2015
    Messages : 52
    Par défaut Utiliser des multiples backgroundworker
    Bonjour ,
    J'ai un winform appelé login qui demande un nom d'utilisateur et un mot de passe, vérifie les informations avec une base de données (en ligne) et affiche ensuite le winform principal, mais pour éviter que l'application ne se fige, j'ai utilisé deux backgroundworkers.
    Sur mon winform principal, j'ai plusieurs onglets pour changer de tableau.
    quand je clique sur mon bouton de connexion:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    private  void btncon_Click(object sender, EventArgs e)
     {
        strLogin = tblogin.Text.Trim();
        pass = tbpwd.Text;
        if (!backgroundWorker1.IsBusy)
            backgroundWorker1.RunWorkerAsync();
     }
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
            {
                string[] user = cm.login(strLogin, pass);
                int dataload = 0;
                if(user[0] != null)
                {
                   success = true;
                }
                else
                {
                    success = false;
                }
            }
    alors quand backgroundworker1 est fini, j'appelle backgroundWorker2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
            {
                if (success)
                {
                    backgroundWorker2.RunWorkerAsync();
                }
                else
                {
                    this.Show();
                }
            }
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    main Principale; //main form
    private void backgroundWorker2_DoWork(object sender, DoWorkEventArgs e)
    {
      Principale = new main();
    }
     
        private void backgroundWorker2_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
          this.Hide(); //hide login winform
          Principale.Show(); //show mainform
        }
    le soucis il y a certains bugs que je ne comprend pas du tout et c'est peut être de la manière dont j'utilise les backgroundworker avec mon gui

  2. #2
    Membre Expert
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 941
    Par défaut
    Il n'y a aucune raison d'utiliser le second BackgroundWorker. Tu peux créer ta fenêtre principale simplement sur la fin de traitement du premier BackgroundWorker, si l'authentification a réussi. En plus de cela les composants graphiques ne peuvent être créés que sur le Thread de l'UI (celui qui gère à la base ta fenêtre de login).
    En outre, dans l'objet DoWorkEventArgs possède un propriété Result, de type object, à laquelle tu peux passer une valeur, par exemple le succès ou l'échec de la tentative de connexion, qui sera ensuite transmise à la procédure de fin de traitement par l'intermédiaire du paramètre RunWorkerCompletedEventArgs.
    Le BackgroundWorker sur la msdn : https://docs.microsoft.com/fr-fr/dot...ramework-4.7.2

  3. #3
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2015
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Côte d'Ivoire

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

    Informations forums :
    Inscription : Janvier 2015
    Messages : 52
    Par défaut
    la fenêtre principale charge aussi des données c'est pourquoi j'utilisais un deuxième backgroundworker.
    mais j'ai supprimé le deuxième backgroundworker comme tu l'as conseillé et pour créer la deuxieme fenêtre :

    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
    21
    22
    23
    24
    25
    26
    27
    private main m;
            private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
            {
                model.Connexion cm = new model.Connexion();
                pass = Snippets.SHA1Util.SHA1HashStringForUTF8String(pass).ToString();
                string[] user = cm.login(strLogin, pass);
                if(user[0] != null)
                {
                        Int32.TryParse(user[0], out iduser);
                        Int32.TryParse(user[1], out idGrp);
                        Int32.TryParse(user[2], out idbtq);
                        nom = user[3];
                    if (idGrp != 3)
                    {
                        success = true;
                        m = new main();
                    }
                    else
                    {
                        success = false;
                    }
                }
                else
                {
                    success = false;
                }
            }
    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
    private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
            {
                pcLoader.Visible = false;
                if (success)
                {
                    pcLoader.Visible = false;
                    m.ShowDialog();
                }
                else
                {
                    tblogin.ReadOnly = false;
                    tbpwd.ReadOnly = false;
                    btncancel.Visible = false;
                    btncon.Visible = true;
                    MessageBox.Show("Veuillez contacter l'administrateur  \n Email ou mot de passe incorrect \n Ou votre accès n'est pas autorisé.");
                    this.Show();
                }
            }

  4. #4
    Membre Expert
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 941
    Par défaut
    Dans cette situation tu peux avoir deux approches :
    - chargement des données dans la fenêtre de login, avant l'affichage de la fenêtre principale : dans le RunWorkerCompleted tu fais afficher dans ta fenêtre de login un message indiquant le chargement avant affichage de le fenêtre, puis tu appelles un second BackgroundWorker, avec affichage de la fenêtre principale à complétion du processus ;
    - chargement des données dans la fenêtre principale, que tu afficheras d'abord en mode (au moins partiellement) "verrouillé", c.à.d sans interaction avec la partie gérant les données, avec un BackgroundWorker appelé dans le chargement de la fenêtre ; à la fin de processus tu insères tes données dans la fenêtre et tu la déverrouilles.

    En gérant dans la fenêtre principale tu pourras envisager une gestion des erreurs, avec par exemple un bouton de retry et un éventuel message d'erreur si la récupération échoue (timeout, erreur serveur, perte du réseau, etc...). Si c'est une erreur d'authentification qui apparaît il faudra simplement fermer la fenêtre et ré-afficher la fenêtre de login.

  5. #5
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2015
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Côte d'Ivoire

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

    Informations forums :
    Inscription : Janvier 2015
    Messages : 52
    Par défaut
    mon backgroundworker ne fonctionne pas comme je veux , l'application continue de planter comme si il était inactif ,j'ai lue sur quelque part que c'est pas recommandé de manipuler le GUI dans le DoWork

  6. #6
    Membre Expert
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 941
    Par défaut
    Il ne faut surtout pas manipuler la GUI dans le DoWork, c'est justement la méthode qui est exécutée sur le Thread en tâche de fond. Les manipulations de la GUI se font dans le ProgressChanged et le RunWorkerCompleted, qui s'exécutent sur le Thread d'origine (en principe celui de la GUI). Quelle manipulation de souhaites-tu faire dans le DoWork ?

Discussions similaires

  1. regexp utilisant des multiples
    Par jige23 dans le forum Access
    Réponses: 2
    Dernier message: 03/03/2015, 10h08
  2. Utiliser des connexions multiples sur des listes
    Par MasterJul dans le forum SharePoint
    Réponses: 0
    Dernier message: 08/02/2008, 12h41
  3. [MySQL] Utilisation des valeur choix multiple pour executer une requete une valeur a la fois
    Par guigui69 dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 26/12/2007, 16h43
  4. Utilisation des choix d'une zdl à choix multiples pour une requête
    Par Nanouche dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 10/10/2007, 02h57
  5. Utilisation des liste à choix multiples
    Par mic79 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 04/07/2005, 11h40

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