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

VB.NET Discussion :

Portée d'une variable depuis un Thread secondaire [Débutant]


Sujet :

VB.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2012
    Messages
    640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2012
    Messages : 640
    Par défaut Portée d'une variable depuis un Thread secondaire
    Bonjour a tous,
    J'espère ne pas vous induire en erreur avec le titre de mon post. Voici mon problème :
    J’exécute une grosse opération depuis un BackgroundWorker (scrutation d'une arborescence à la recherche de certains fichiers selon certains critères et quand le ou les fichiers sont trouvés je mets a jour une table 'Paths' avec inscription du chemin trouvé). Pour m'éviter des effets indésirables, je désactive a ce moment là certains événements dans ma procédure ActiveControlesHandler, notamment ceux liés aux tables.
    Cette procédure fonctionne très bien sauf depuis mon BackgroundWorker depuis lequel je n'arrive pas a désactiver les événements. Voici mes constations après avoir placé plusieurs points d'arrêts et fait du pas a pas :
    Ma variable 'ControleHanddlerIsActive' est égale a False chaque fois que je rentre dans la procédure depuis mon BackgroundWorker alors qu'au lancement du programme cette variable a été correctement initialisé a True et les événements activés.
    Mieux qu'un long discours voici l'extrait de mon code :
    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
    28
    29
    Public Class frmModPaths
    Dim ControleHanddlerIsActive As Boolean
     
        Public Sub ActiveControlesHandler(ByVal State As Boolean)
     
            If State = True And ControleHanddlerIsActive = False Then
                AddHandler DataGridView1.CurrentCellDirtyStateChanged, AddressOf EventCurrentCellDirtyChanged
                AddHandler MainBindingSourcePaths.CurrentItemChanged, AddressOf EventbsCurrentItemChanged
                AddHandler MainBindingSourcePaths.CurrentChanged, AddressOf EventbsCurrentChanged
                AddHandler MainBindingSourcePaths.PositionChanged, AddressOf EventbsPositionChanged
                AddHandler dtTablePaths.ColumnChanging, AddressOf EventTableColumnChanging
                AddHandler dtTablePaths.ColumnChanged, AddressOf EventTableColumnChanged
                AddHandler dtTablePaths.TableNewRow, AddressOf EventTableNewRow
     
                ControleHanddlerIsActive = True
            ElseIf State = False And ControleHanddlerIsActive = True Then
                RemoveHandler DataGridView1.CurrentCellDirtyStateChanged, AddressOf EventCurrentCellDirtyChanged
                RemoveHandler MainBindingSourcePaths.CurrentItemChanged, AddressOf EventbsCurrentItemChanged
                RemoveHandler MainBindingSourcePaths.CurrentChanged, AddressOf EventbsCurrentChanged
                RemoveHandler MainBindingSourcePaths.PositionChanged, AddressOf EventbsPositionChanged
                RemoveHandler dtTablePaths.ColumnChanging, AddressOf EventTableColumnChanging
                RemoveHandler dtTablePaths.ColumnChanged, AddressOf EventTableColumnChanged
                RemoveHandler dtTablePaths.TableNewRow, AddressOf EventTableNewRow
     
               ControleHanddlerIsActive = False
            End If
     
        End Sub
    End Class
    Les lignes executées depuis mon BackGroundWorker :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    frmModPaths.ActiveControlesHandler(False)
    ' .....Opérations de mise a jour de la table 'Paths'
    frmModPaths.ActiveControlesHandler(True)
    Merci a tous pour votre aide.

  2. #2
    Membre éclairé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2012
    Messages
    640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2012
    Messages : 640
    Par défaut
    Personne pour m'aider ? Je ne comprends vraiment pas pourquoi ma variable ControleHanddlerIsActive n'est pas accessible et non partagé par le thread du BackGroundWorker. Sans cette désactivation des événements j'ai des appels récursifs sur l’événement ColumnChanging, l'architecture de mon programme est certainement un peu bancale mais je ne peux pas remmetre en cause cette architecture aujourd'hui, ça me demanderait trop de travail. Bref c'est le bazard

    Sinon je serais aussi preneur pour une solution de contournement.

    Voici la ligne dans le code d'actualisation de la base qui me lève un événement indésirable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim Row As DataRow = dt.NewRow()
    Je travail avec un dataset et le but est d'actualiser la table 'Paths' de ce Dataset en tache de fond tout en permettant a l'utilisateur de travailler.

    Si quelqu'un a une idée ça m'aiderais beaucoup.

  3. #3
    Membre éclairé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2012
    Messages
    640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2012
    Messages : 640
    Par défaut
    Bonsoir, j'ai trouvé une solution. C'est franchement pas très propre mais ça fonctionne a peu prêt.
    Je désactive les événements avant de rentrer le BackGroundWorker autrement dit depuis le Thread du programme principal et je réactive les événements lorsque le BackgroundWorker a terminé son travail. Seul soucis l'utilisateur peut aussi indirectement activer ou désactiver ces événements lors d'une saisie. Pour régler ce problème j'ai rajouté ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Public Sub ActiveControlesHandler(ByVal State As Boolean)
    If BackGroundWorker1.IsBusy Then Exit Sub
    '.......suite
    End Sub
    Par contre si l'utilisateur fait des saisies dans la table 'Paths' au moment ou s'execute le BackGroundWorker, la saisie ne sera pas prise en compte mais normalement l'utilisateur ne devrait faire des saisies dans la table Paths que de façon exceptionnelle.
    Je fait du code pas terrible en ce moment
    J’hésite a passer en résolue mais on va dire que c'est bon .

  4. #4
    Membre Expert
    Avatar de GuruuMeditation
    Homme Profil pro
    .Net Architect
    Inscrit en
    Octobre 2010
    Messages
    1 705
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : Belgique

    Informations professionnelles :
    Activité : .Net Architect
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 705
    Par défaut
    Bizarre ton worker devrait avoir accès à ta variable. tu es sur que tu n'instancie pas un autre frmModPaths?

  5. #5
    Membre Expert Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Par défaut
    Bonjour. Je peux garantir que ce n'est pas un problème de parallélisme : il n'existe aucune portée sémantique associée à un thread. En C# tous les threads voient les mêmes variables avec les mêmes valeurs.

    Deux petites exceptions dans lesquelles un champ statique peut avoir une valeur différente dans chaque thread:
    * Les champs marqués avec ThreadStaticAttribute.
    * Les applications utilisant plusieurs domaines d'applications : chaque domaine a sa propre valeur. Plus généralement les domaines d'applications restreignent la communication entre eux si bien que rien ne peut être partagé et tout doit être dupliqué, comme entre plusieurs processus.


    Enfin il est normal que l'on ne puisse pas altérer l'état du formulaire depuis un autre thread que le principal : chaque contrôle est lié au thread sur lequel il a été créé et seul ce dernier peut le modifier. Un autre thread devra passer par Control.Invoke / BeginInvoke. C'est une façon d'assurer la synchronisation.

  6. #6
    Membre éclairé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2012
    Messages
    640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2012
    Messages : 640
    Par défaut
    Bonjour et merci pour vos réponses, je vais regarder cette histoire de plus prêt car même si j'ai résolu mon problème, apriori vous me confirmez que ce n'est pas trés normal de ne pas pouvoir acceder a cette variable de facon partagée.
    @GuruuMeditation : Je n'instancie pas mes formulaires, je travaille directement avec la classe (en statique) mais je verifirais quand même ce soir si je ne dit pas de bétises.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 19/12/2006, 22h55
  2. Portée d'une variable dans une boucle FOR ?
    Par Neo41 dans le forum C++
    Réponses: 20
    Dernier message: 17/11/2006, 11h14
  3. [XSLT] pb portée d'une variable
    Par NPortmann dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 23/05/2006, 15h53
  4. Portée d'une variable globale
    Par Giill dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 27/12/2005, 10h13
  5. Réponses: 5
    Dernier message: 08/09/2005, 20h33

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