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 :

Singleton / durée de vie d'une instanciation declasse [Débutant]


Sujet :

VB.NET

  1. #1
    Membre habitué
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    258
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2011
    Messages : 258
    Points : 126
    Points
    126
    Par défaut Singleton / durée de vie d'une instanciation declasse
    Bonjour,
    J’aimerais gérer les paramètres par défaut de mon appli, j’ai vu que cela était possible en gérant les my.settings, mais j’aimerais le faire avec un fichier dédié
    Je rencontre un pb de durée de vie de ma classe Singleton, sûrement du à mon ignorance donc vous remercie par avance de m’aider à corriger mes lacunes

    Grâce à l’excellent Tuto de Philippe Lasserre , j’ai crée une classe singleton (voir image 20130225-10)
    J’ai crée un Form pour modifier/enregistrer ces paramètres via Serialize/Deserialize

    Au démarrage du Form principal, j’instancie cette classe et en charge les valeurs

    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
    Dim PC As ParametreConfig = ParametreConfig.getInstance
     
    Public Sub ChargementParametreConfig()
            Call BinaryDeSerialize()
            LbLMessage1.Text = "Chargement effectué des paramétres de configuration ! " & PC.Exemple
        End Sub
     
    Private Sub BinaryDeSerialize()
            Dim Fichier As String = "ParametreConfig.bin"
            If Not File.Exists(Fichier) Then
                MessageBox.Show("Fichier de configuration non trouvé !" & vbLf & "Veuillez le créer dans le Menu : Utilitaires / Général !")
                Exit Sub
            End If
     
            Dim Deserializer As New BinaryFormatter
            Dim Stream As FileStream = New FileStream(Fichier, FileMode.Open)
            PC = CType(Deserializer.Deserialize(Stream), ParametreConfig)
            Stream.Close()
     End Sub
    Les données sont bien présentes au chargement du Form principal

    Je voudrais maintenant utiliser ces paramétres dans d’autres Form, sans avoir à les recharger en les récupérant dans l’instance en cours (Form principal toujours ouvert)

    Pour mes essais, j’ai donc essayé à l’ouverture d’un autre Form:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MessageBox.Show("Parametre chargé : " & ParametreConfig.getInstance.Exemple.ToString)
    Mais aussi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim PC As ParametreConfig = ParametreConfig.getInstance
    Pc.Exemple = ParametreConfig.getInstance.Exemple
    MessageBox.Show("Parametre chargé : " & PC.Exemple.ToString)
    L’intellisense ne me signale pas d’erreur, mais l’exécution me lève une erreur (voir image 20130225-11). Je ne peux évidemment pas recréer une nouvelle instance par new (Singleton)
    Si je recharge (deserialize) la classe dans le Form, alors plus de pb, mais ce n’est pas le but !
    Il y a forcément quelque chose que je n’ai pas compris dans la durée de vie de l’instance de ma classe, Singleton ou serialize/deserialize mais je ne vois pas ou !
    Par avance merci de vos lumières
    Bertrand
    Images attachées Images attachées   

  2. #2
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    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 154
    Points : 25 072
    Points
    25 072
    Par défaut
    pas de soucis sur le singleton
    par contre si exemple vaut nothing, pc.exemple.tostring plante, car nothing.tostring ce n'est pas possible

    enfin faire .ToString sur un string c'est totalement inutile ...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre habitué
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    258
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2011
    Messages : 258
    Points : 126
    Points
    126
    Par défaut
    Re et merci pour la réponse
    J'ai corrigé ma bévue en enlevant le Tostring !!
    Lors du chargement du Form principal, j'affiche dans un label le PC.exemple sans pb (la classe est donc instanciée et chargée)
    Lors du chargement de mon autre Form, j'ai ajouté :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MessageBox.Show("Paramétre chargé : " & ParametreConfig.getInstance.Exemple)
    et j'obtiens (sans erreur maintenant) dans ma messagebox "Paramétre chargé :" sans rien ! comme si mon instance avait disparu !
    Tant que le Form principal n'est pas fermé, je croyais qu'elle devait toujours être présente ??
    Bertrand

  4. #4
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    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 154
    Points : 25 072
    Points
    25 072
    Par défaut
    mets un point d'arret sur GetInstance

    si instance vaut nothing c'est un problème dans ton code de singleton
    si c'est la même instance qui est retournée, c'est que exemple a été modifié entre temps
    (si exemple est une propriété tu peux mettre un point d'arret dans le set pour voir d'où)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Membre habitué
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    258
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2011
    Messages : 258
    Points : 126
    Points
    126
    Par défaut
    Re, Re
    J'ai mis un point d’arrêt au chargement du Form principal
    J'obtiens bien les données mais si je clique sur Instance, il n'y a rien dedans : (Image 20130225-12)
    J'ai aussi mis un autre point d'arrêt au chargement du Form secondaire et la PC est nothing : (Image 20130225-13)

    Peut être est qu'il me manque une "connexion" entre la classe désérialisée et mon instance de Singleton ?
    Dans le chargement de mon Form Principal, j'ai mis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     Dim PC As ParametreConfig = ParametreConfig.getInstance 
     Call BinaryDeSerialize()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Private Sub BinaryDeSerialize()
            Dim Fichier As String = "ParametreConfig.bin"
            If Not File.Exists(Fichier) Then
                MessageBox.Show("Fichier de configuration non trouvé !" & vbLf & "Veuillez le créer dans le Menu : Utilitaires / Général !")
                Exit Sub
            End If
     
            Dim Deserializer As New BinaryFormatter
            Dim Stream As FileStream = New FileStream(Fichier, FileMode.Open)
            PC = CType(Deserializer.Deserialize(Stream), ParametreConfig)
            Stream.Close()
        End Sub
    Bertrand
    Images attachées Images attachées   

  6. #6
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    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 154
    Points : 25 072
    Points
    25 072
    Par défaut
    oui j'avais pas vu

    pc = getinstance
    pc = deserialize

    pc n'est qu'une variable, il a donc changé de valeur entre les 2 moments
    ca ne fait pas de liaison entre l'intance singleton et la désérialisation


    dim a as integer = 5
    a = 8
    est-ce que 5 va valoir 8 ?
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  7. #7
    Membre habitué
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    258
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2011
    Messages : 258
    Points : 126
    Points
    126
    Par défaut
    re,

    J'ai essayé de transformer ma sub Deserialize en fonction retournant un "ParametreConfig" puis en écrivant
    PC = PCFichier (provenant de ma sub)
    mais ça ne marche pas mieux !

    J'ai essayé d'instancier ma classe Singleton dans la sub Deserialize : idem
    Est ce qu'on écrit dans une classe Singleton comme dans une classe classique ?

    Pour lier les 2, je suis obligé de recopier chaque propriété de la classe chargée vers l'instance ?
    PC.Exemple = PCFichier.exemple
    Merci
    Bertrand

  8. #8
    Membre habitué
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    258
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2011
    Messages : 258
    Points : 126
    Points
    126
    Par défaut
    re, re ..
    J'ai donc modifier ma sub Deserialize comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
      Private Sub BinaryDeSerialize() 'As ParametreConfig
            Dim PCFichier As ParametreConfig
            Dim Fichier As String = "ParametreConfig.bin"
            If Not File.Exists(Fichier) Then
                MessageBox.Show("Fichier de configuration non trouvé !" & vbLf & "Veuillez le créer dans le Menu : Utilitaires / Général !")
                Exit Sub
            End If
            'Dim PCfichier As ParametreConfig
            Dim Deserializer As New BinaryFormatter
            Dim Stream As FileStream = New FileStream(Fichier, FileMode.Open)
            PCFichier = CType(Deserializer.Deserialize(Stream), ParametreConfig)
            PC.Exemple = PCFichier.Exemple
            Stream.Close()
    Et maintenant, ça marche !
    Mais y aurait il une autre solution que de recopier chaque propriété en affectant directement l'instance au résultat de la désérialisation ?
    Merci encore
    Bertrand

  9. #9
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 154
    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 154
    Points : 25 072
    Points
    25 072
    Par défaut
    dans ton singleton :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if instance is nothing then
        instance = new pc
    end if
    return instance
    =>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if instance is nothing then
        instance = deserialize
    end if
    return instance
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  10. #10
    Membre habitué
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    258
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2011
    Messages : 258
    Points : 126
    Points
    126
    Par défaut
    Bonsoir,
    Vraiment logique et évident .. quand on sait !
    En tout cas, je n'aurais jamais trouvé tout seul !
    ça marche nickel !
    Merci encore Pol63
    Bertrand

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

Discussions similaires

  1. Durée de vie d'une session
    Par khokho dans le forum Tomcat et TomEE
    Réponses: 4
    Dernier message: 28/06/2006, 21h31
  2. durée de vie d'une instruction
    Par poporiding dans le forum C++
    Réponses: 6
    Dernier message: 08/06/2006, 16h11
  3. Réponses: 3
    Dernier message: 27/04/2006, 11h37
  4. Durée de vie d'une session
    Par dbass dans le forum Langage
    Réponses: 8
    Dernier message: 21/03/2006, 19h38
  5. [AS2] durée de vie d'une classe (extends movieclip)
    Par ooyeah dans le forum ActionScript 1 & ActionScript 2
    Réponses: 4
    Dernier message: 23/07/2005, 13h33

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