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 :

Variable détruite au passage d'un BackgroundWorker


Sujet :

Windows Forms

  1. #1
    Membre expérimenté
    Avatar de Anduriel
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Février 2004
    Messages
    2 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Février 2004
    Messages : 2 290
    Points : 1 500
    Points
    1 500
    Par défaut Variable détruite au passage d'un BackgroundWorker
    Bonjour à tous.

    J'ai une Collection FormatedFiles.
    Lors d'un chargement d'un Form, je vérifie que son contenu est toujours présent:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Private Sub Form5_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Avancement.Text = "0%"
    For I = 1 To Form1.FormatedFiles.Count
    Console.WriteLine(Form1.FormatedFiles(I))
    Next
    TacheFond.RunWorkerAsync(Form1.TableItems.Count)
    For I = 1 To Form1.FormatedFiles.Count
    Console.WriteLine(Form1.FormatedFiles(I))
    Next
    End Sub
    Je vérifie avant lancer une tache de fond dans un BackgroundWorker, et après. Les deux s'affichent très bien.

    Pourtant, je me rends dans le sub Do_Work du BgWorker et refais la même bouche d'affichage. Et la, plus rien, comme si mon tableau avec été écrasé.

    Comment ça se fait?
    Merci

  2. #2
    Membre chevronné
    Avatar de Sehnsucht
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2008
    Messages
    847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Points : 2 209
    Points
    2 209
    Par défaut
    Bonjour, pourrais-tu aussi poster le code de ton évènement Do_Work stp ?
    Nous sommes tous plus ou moins geek : ce qui est inutile nous est parfaitement indispensable ( © Celira )
    À quelle heure dormez-vous ?
    Censément, quelqu'un de sensé est censé s'exprimer sensément.

  3. #3
    Membre expérimenté
    Avatar de Anduriel
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Février 2004
    Messages
    2 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Février 2004
    Messages : 2 290
    Points : 1 500
    Points
    1 500
    Par défaut
    Oui, voila:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Private Sub TacheFond_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles TacheFond.DoWork
    Dim worker As BackgroundWorker = CType(sender, BackgroundWorker)
    e.Result = Traitement(CInt(e.Argument), worker, e)
    End Sub
    Merci

  4. #4
    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
    Vu le code du DoWork, je pense que c'est plutôt la méthode Traitement qu'il faudrait montrer...

  5. #5
    Membre expérimenté
    Avatar de Anduriel
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Février 2004
    Messages
    2 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Février 2004
    Messages : 2 290
    Points : 1 500
    Points
    1 500
    Par défaut
    En fait Traitement appelle à son tour LancerRecherche qui sont des fonctions un peu massives...

    Mon problème c'est que nul part, après avoir relu plusieurs fois le code! je ne touche à ce tableau.

    Mon problème venait du fait qu'à un moment j'ajoute un élément dedans, sous un index NORMALEMENT déjà existant. Du coup je faisais un Remove avant, qui plante parce qu'EN REALITE il n'y a déjà plus rien dans le tableau...

    Ca ne pose pas de grand problème pour mon code, mais j'aimerais bien connaitre l'origine de cette "disparition"...

  6. #6
    Membre expérimenté
    Avatar de Anduriel
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Février 2004
    Messages
    2 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Février 2004
    Messages : 2 290
    Points : 1 500
    Points
    1 500
    Par défaut
    En fait j'ai remarqué que tout ce qui provenait du formulaire 1 n'était pas disponible.

    J'ai un ListView sur Form1 et quand j'essaie d'accéder à ses items j'ai un accès refusé (une erreur en fait).

    Pareillement, le tableau FormatedFiles provient de Form1.

    Comment alors expliquer que tout ce qui vient de ce Form n'est plus dispo sur mon Form5 ?

  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 Anduriel Voir le message
    Comment alors expliquer que tout ce qui vient de ce Form n'est plus dispo sur mon Form5 ?
    Tu es sûr que tu fais référence à l'instance existante de Form1 ? Parce qu'en VB il y a un truc que je trouve complètement débile (d'un point de vue POO), c'est qu'il y a une instance "implicite" de chaque Form, à laquelle tu accèdes par le nom du type, au lieu de manipuler explicitement une référence à une instance de la Form... Le problème pourrait bien venir de là. Si pour une raison ou une autre tu n'accèdes pas à la bonne instance de Form1, celle-ci n'est peut-être pas initialisée correctement...

  8. #8
    Membre chevronné
    Avatar de Sehnsucht
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2008
    Messages
    847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Octobre 2008
    Messages : 847
    Points : 2 209
    Points
    2 209
    Par défaut
    Citation Envoyé par Anduriel Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    For I = 1 To Form1.FormatedFiles.Count
    ...
    TacheFond.RunWorkerAsync(Form1.TableItems.Count)
    For I = 1 To Form1.FormatedFiles.Count
    ...
    Ce qui m'étonne c'est que ta vérification porte, sur Form1.FormatedFiles
    alors que tu passe à ton traitement asynchonre Form1.TableItems ; après c'est peut-être normal en fonction du reste de ton code.
    Ensuite tu passe en paramètre la taille du tableau, au lieu du tableau directement.
    Enfin lors de l'exécution d'un traitement asynchrone, comme c'est le cas ici, tu ne peux accéder aux contrôles, car ceux-ci ne sont accessible que dans le thread qui les a créés (donc le thread principal) à moins de passer par les méthodes Invoke de tes contrôles (voir ici)

    J'espère que ça peut t'aider à avancer, mais ça ne reste que des hypothèses au vu des éléments disponibles.
    Nous sommes tous plus ou moins geek : ce qui est inutile nous est parfaitement indispensable ( © Celira )
    À quelle heure dormez-vous ?
    Censément, quelqu'un de sensé est censé s'exprimer sensément.

  9. #9
    Membre expérimenté
    Avatar de Anduriel
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Février 2004
    Messages
    2 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Février 2004
    Messages : 2 290
    Points : 1 500
    Points
    1 500
    Par défaut
    @ SehnSucht: Oui, j'avais lu qu'on ne pouvait pas toucher aux controles pendant l'execution d'une tache en arrière plan. Cependant, je touche aux controles seulement dans la sub RunWorkCompleted. Dans ce sub, je modifie le label du Form2 sans soucis par exemple, mais si je veux faire quelque chose sur le Form3, il plante! Idem pour le Form1!

    @ tomlev: Du coup, comment savoir si j'appelle le bon? Pour moi il existe une seule manière de faire référence au FormX: FormX.ControlX ...

    Est ce que le fait que je fasse des Hide, Show, ShowDialog de mes Form empechent leurs "mise à jour"? Par exemple, le Form2 auquel je peux accéder est visible, mais le form1 est Hidden, et le Form3 pas encore "appelé", sachant que mon Worker est lancé dans le Form5 en ShowDialog.

    Merci de votre aide

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 155
    Points : 25 074
    Points
    25 074
    Par défaut
    si la variable implicite tombe sur une nouvelle instance, toutes les données seront peut etre vide si elle sont remplies par l'interface et non par le code

    sinon pendant un thread il en général possible d'accéder aux propriétés des controles, mais pas de les modifier
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  11. #11
    Membre expérimenté
    Avatar de Anduriel
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Février 2004
    Messages
    2 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Février 2004
    Messages : 2 290
    Points : 1 500
    Points
    1 500
    Par défaut
    Citation Envoyé par Pol63 Voir le message
    si la variable implicite tombe sur une nouvelle instance, toutes les données seront peut etre vide si elle sont remplies par l'interface et non par le code
    Désolé, je ne comprends pas bien: qu'appelles tu variable implicite, et que veux tu dire par remplies par l'interface?

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 155
    Points : 25 074
    Points
    25 074
    Par défaut
    Citation Envoyé par Anduriel Voir le message
    @ tomlev: Du coup, comment savoir si j'appelle le bon? Pour moi il existe une seule manière de faire référence au FormX: FormX.ControlX ...

    il faut apprendre la POO
    par exemple ici :
    http://plasserre.developpez.com/cours/vb-net/

    une form tu peux afficher plusieurs fois la même, c'est comme une classe, tu peux avoir autant d'instances que tu veux, meme si pour ton projet tu n'en veux qu'une, il faut que le langage reste cohérent et apporte la possibilité de faire plein de choses

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    dim f as form1
    f.show
    dim f2 as form1
    f.show
    avec ce code on voit 2x fois form1
    vb permet de faire form1.textbox1.text directement, mais c'est de la connerie, car dans ce cas form1 va retourner une des deux et tu ne peux pas savoir laquelle
    donc il faut avoir une variable as formx pour pouvoir accéder à ses membres
    et pour qu'une form en connaisse un autre il faut le tenir au courant, en général sur le sub new
    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
     
    public class form1
     
       public sub ouvre_form2 handles button1.click
             dim f as new form2 (me)
       end sub
     
    end class
     
     
    public class form2
     
      private _f1 as form1
      public sub new (f1 as form1)
           _f1 = f1
      end sub
     
      public sub modifier_form1 handles button1.click
          _f1.textbox1.text = "modifié" ' au lieu de form1.textbox1.text = "modifié" qui est contraire à la POO
      end sub
     
    end class
    en vb.net (pas en c# qui est pourtant similaire en beaucoup de points) pour chaque classe de type form, le compilateur créé une variable implicite du meme nom, ce qui permet à un débutant d'accéder à form1 depuis form2 en écrivant form1.xxx
    alors que la logique veut que si on veut accéder à une instance de quelque chose, il faut l'avoir dans une variable
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  13. #13
    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 Anduriel Voir le message
    @ tomlev: Du coup, comment savoir si j'appelle le bon? Pour moi il existe une seule manière de faire référence au FormX: FormX.ControlX ...
    Pol63 a parfaitement répondu, je ne m'étendrai donc pas sur ce point

  14. #14
    Membre expérimenté
    Avatar de Anduriel
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Février 2004
    Messages
    2 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration

    Informations forums :
    Inscription : Février 2004
    Messages : 2 290
    Points : 1 500
    Points
    1 500
    Par défaut
    D'accord, je vois l'idée, mais je ne comprends pas comment créer cette variable form (en fait comment ajouter une variable form "explicitement", va garantir "l'unicité" de mon form).

    Dans ton code Pol63, tu écris dim f as new form2 (me): est ce que cela correspond, en "non POO", à form2.Show() ?

    Ensuite, je ne vois pas comment est définie _f1 (=f1?). Qu'est ce que ce paramètre f1? (Heu d'ailleurs, est-ce normal que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public sub new (f1 as form1)
           _f1 = f1
      end sub
    renvoit une erreur
    Erreur 6 'f1' ne peut pas exposer le type 'Form1' en dehors du projet via class 'Form5'
    Merci d'avance

  15. #15
    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 Anduriel Voir le message
    Dans ton code Pol63, tu écris dim f as new form2 (me): est ce que cela correspond, en "non POO", à form2.Show() ?
    Non, ça correspond à la création d'une instance de Form2. Pour l'afficher, tu fais f.Show().


    Citation Envoyé par Anduriel Voir le message
    Ensuite, je ne vois pas comment est définie _f1 (=f1?). Qu'est ce que ce paramètre f1?
    f1 est une instance de Form1, passée en paramètre à Form5 pour qu'elle puisse y accéder. _f1 est une variable membre de type Form1, que tu dois déclarer dans ta classe Form5.

Discussions similaires

  1. Variable globale ou passage de variable ?
    Par Invité dans le forum Langage
    Réponses: 5
    Dernier message: 14/06/2014, 01h27
  2. Passage de variable dans un lien asp
    Par VirginieGE dans le forum ASP
    Réponses: 4
    Dernier message: 27/07/2004, 10h06
  3. [Kylix] passage de variable en Libc
    Par zheng dans le forum EDI
    Réponses: 11
    Dernier message: 06/05/2004, 14h14
  4. Passage de variable par methode post ?
    Par oazar dans le forum Flash
    Réponses: 33
    Dernier message: 16/10/2003, 17h03
  5. [langage] Passage de variables...
    Par martijan dans le forum Langage
    Réponses: 8
    Dernier message: 30/07/2003, 09h48

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