PATRON SINGLETON (AVEC PROTECTION CONTRE LES MULTI THREAD), TUTORIAL PATRON 1

Signaler
Messages postés
414
Date d'inscription
mercredi 16 juin 2004
Statut
Membre
Dernière intervention
26 juillet 2007
-
Messages postés
2336
Date d'inscription
samedi 14 juillet 2001
Statut
Membre
Dernière intervention
5 mai 2009
-
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/31960-patron-singleton-avec-protection-contre-les-multi-thread-tutorial-patron-1

Messages postés
2336
Date d'inscription
samedi 14 juillet 2001
Statut
Membre
Dernière intervention
5 mai 2009
6
oui, il doit y avoir un problème dans ton singleton.
en passant, mieux vaut toujours mettre tes composant private et faire un getTexte à la place

ceci serait suffusant
console.writeline(form2.getInstance().getTexte())
Messages postés
414
Date d'inscription
mercredi 16 juin 2004
Statut
Membre
Dernière intervention
26 juillet 2007
3
dsl pour le double post mais c'est vbfrance qui as merdouillé...
sinon ben j'ai fait plein de test comme t'as dit mais le prblm est plus compliqué que ca:
la form1 initialise la form2.
la form2 contient une textbox
la form2 contient un bouton qui lance un sub sur un module
et la fonction de ce module recupère l'info du textbox de la form2.

j'ai mis ce code dans le module:
dim formulaire2 as form2 = form2.getinstance
dim string1 as new string
string1 = formulaire2.textbox1.text
console.writeline(string1)

et ben string1 est nul, par contre, quand je mets:
dim string1 as new string
string1 = WindowsApplication1.Form2.textbox1.text
console.writeline(string1)

ca marche...
donc en fait le singleton, malgré qu'il contienne la valeur windowsapplication1.form2, n'est pas égal a windowsapplication1.form2
quand je remplace formulaire2 par windowsapplication1.form2, ca fonctionne MAIS attention! windowsapplication1.form2 ne fonctionne QUE si la fonction ne se trouve dans le meme thread que la form2.

donc voila, contrairement a ce que pourrait laisser croire visual: formulaire2 n'as pas de valeur ! (fodrait que ce soit une fonction pour que on puisse envisager de lui donner une valeur)
le singleton permet donc d'initialiser une form avec une protection multithread. Elle n'arrive pas a en recuperer l'instance dans mon cas.
quand on utilise windowsapplication1.form2, ca mets cette erreur: "Object reference not set to an instance of an object."

voila j'espere que c'est plus clair...
Messages postés
2336
Date d'inscription
samedi 14 juillet 2001
Statut
Membre
Dernière intervention
5 mai 2009
6
c'est dur de te répondre sans voir exactement le code
un petit truc quand tu es pas sur si ce que retourne le singleton est bien correct. Met toi une variable globale qui est vide en partant et dans ton new met lui une valeur.

démare ton code est fait lui un break quand tu le rappelles. Si ta varialbe globale de test est bien initialisé, il te retourne bien l'instance correctement, donc le problème viens d'ailleur. Si ta variable est vide, bien ton instance est mal créé, donc le problème viens du singleton qui doit avoir une erreur
Messages postés
414
Date d'inscription
mercredi 16 juin 2004
Statut
Membre
Dernière intervention
26 juillet 2007
3
alors en effet je me suis reinteressé plus pronfodemment (apres avoir appris bocoup sur le multithread) et finalement j'ai compris ce script plutot difficile du premier abord mais en fait plutot simple quand on le comprend. Voila, je me suis interessé de plus pres qu'avant (avec mes connaissance toute fraiche) et en fait je me rend compte que c'est abordable pour un esprit comme moi ^^, voila en fait c'est juste un script qui permet de bloquer l'evenement NEW lors d'un initialisation de form si celle si existe deja et synclock permet d'eviter que 2 multitthread fasse ensemble merder le script (utilise pour les thread mis dans des boulce appelant l'ouverture d'une form). Voila, mon probleme principal venait du fait que je croyais que .getinstance était integré au framework, finalement j'ai voulu l'utiliser hors de ta source et j'ai compris qu'en fais ce code était dans le code concepteur de la form (etant desormais dans un fichier a part dans visual 2005 ce qui est plutot chiant). Donc voila je sais comment eviter que des form s'initialise 2 fois et ceci a partir d'un thread mais j'aimerais savoir comment je peut faire pour obtenir le controle des objet sur cette meme form: je m'explique, j'ai fait un code comme ceci qui se trouve dans un thread:

dim formulaire2 as form2 = form2.getinstance
dim string1 as new string
string1 = formulaire2.label1.textbox1
console.writeline(string1)

malheuresement, il s'avere que string1 ne renvoie aucune donnée, il est vide (alors que je rempli bien le bon textbox ^^)
en clair, j'obtient: string1 = ""
donc voila, j'ai beau remplasser:
formulaire2.label1.textbox1 par form2.label1.textbox1
mais form2 n'est plus reconnu...

voila si on pouvais m'aider svp, ca m'aiderait super bien.
d'ailleur je supsonne bien que le prblm vien du fait que form2.getinstance donne pas une "redirection" vers la form2. puisque finalement, son but principal ne sert juste a initialiser ^^

@+
Lucyberad
Afficher les 14 commentaires