Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : Obtenir les objets (instances) [ Windows / Process ] (ricklekebekoi)

vendredi 2 mai 2008 à 22:03:49 | Obtenir les objets (instances)

ricklekebekoi

Bonjour,

J'ai un besoin crucial de savoir toutes les instances existante d'une classe précise et de ces sous-classes.
J'ai tout d'abord pensé a faire une liste, mais ça implique d'appeler explicitement le destructeur car sinon elle reste a jamais dans cette liste.

Bref, par reflexion ou tout autre procédé, existe-t-il un moyen de savoir les instance d'une classe précise a un moment précis de l'execution ? Sinon qu'elle solution me proposez vous pour bien gérer le tout ?

Le probleme est que le but de ce developpement sera d'en produire une dll, donc obliger les utilisateurs de la dll a appeler explicitement une fonction pour enlever l'objet de la liste me déplait, donc j'essai de trouver mieux !

Eric

samedi 3 mai 2008 à 00:19:34 | Re : Obtenir les objets (instances)

coq

Administrateur CodeS-SourceS
Salut,

Je ne crois pas que de tels mécanismes de parcours du heap dans le programme en lui même soit fournis de base.
Quel est le besoin nécessitant la mise en place d'une telle machinerie ?


/*
coq
MVP Visual C#
CoqBlog
*/

samedi 3 mai 2008 à 01:05:24 | Re : Obtenir les objets (instances)

ricklekebekoi

En fait, c'est pour simplifier la sauvegarde dans un fichier a l'aide de la serialization.

Les éléments héritent donc tous d'un type de base (UniqueObject) qui lui contient la propriété "Serial" qui est en soi un numéro d'identification unique, et 2 méthodes "Serlialize()" et "Deserialize()"

Ainsi, lors de la save, prenons par exemple un verger, il contient 500 pommes ayant tous en propriété "Parent" l'un des 10 arbres duquel il provient. Lors de l'enregistrement, je veut qu'il sauvegarde 500 pomes et 10 arbres, et non 500 pommes et 500 arbres.

Du coup, je n'enregistre pour la pomme que le numero de serial auquel il est associé, et j'enregistre ensuite de maniere unique chacuns des objets.

Afin que ça fonctionne bien, j'ai besoin de savoir les objets unique actuellement alloués pour enregistrer leur contenu.

Eric

samedi 3 mai 2008 à 01:14:49 | Re : Obtenir les objets (instances)

ricklekebekoi

En fait le probleme que j'ai, c'est que je doit enregistrer la liste des objets unique avant d'aller enregistrer leur contenu, car sinon deserializer la pomme avant l'arbre serait fatal. Pire encore, si mon arbre contient une props "PommeMagique" qui fait référence a l'une de ces pommes, eh bah je serais dans l'embaras peu importe lequel des 2 je deserialize en premier.

Eric

samedi 3 mai 2008 à 11:58:50 | Re : Obtenir les objets (instances)

coq

Administrateur CodeS-SourceS
Heu mettre en oeuvre des mécanismes aussi lourds que des parcours du heap pour faire ça me parrait suicidaire.
Tu peux en revanche t'orienter vers des solutions de type fabrique, où tu ne laisses pas la possibilité à l'utilisateur de créer les instances directement mais uniquement via une méthode Create, te permettant ainsi de mettre en place des mécanisme de mémorisation des instances crées.



/*
coq
MVP Visual C#
CoqBlog
*/

samedi 3 mai 2008 à 17:53:03 | Re : Obtenir les objets (instances)

ricklekebekoi

Oui le parcours du heap c'est effectivement pas je croit la meilleur idée.
En fait mon probleme n'est pas de les "noter" lors de l'assignation, mais plutot de les enlever lorsqu'ils ne servent plus

Eric

samedi 3 mai 2008 à 17:56:29 | Re : Obtenir les objets (instances)

ricklekebekoi

La solution qui me vient en tete serait de noter lors du deserialize ceux qui ne sont pas appelés et de les enlevés, mais si l'arbre a eu 1000 pommes durant l'execution et qu'il n'en reste que 3, yen aura quand meme 1000 dans la save, mais que 3 après reboot. Donc j'aimerais trouver mieux :)

Eric

samedi 3 mai 2008 à 18:24:39 | Re : Obtenir les objets (instances)

jesusonline

Membre Club Administrateur CodeS-SourceS
Bonjour,
je ne comprend pas ce que tu cherches à faire (ce que je comprend c'est que tu cherches à faire un complexifier un truc d'apparence simple).
En tout cas les mots que j'ai capté me font penser aux WeakReference ( [ Lien ]) qui te permettront d'avoir un lien faible (non pris en compte par le GC) sur l'instance d'un objet. C'est juste une piste, je ne vois pas en quoi ca peut servir puisque je comprend pas trop la problèmatique ;)


Cyril - MSP - MCPD ASP.net & MCTS SQL - Consultant indépendant

dimanche 4 mai 2008 à 17:29:50 | Re : Obtenir les objets (instances)

ricklekebekoi

J'ai jeter un oeil et malheureusement je ne croit pas que ce soit la solution idéale
"Tu cherches a complexifier un truc d'apparence simple"
C'est possible, je n'ai probablement pas la bonne approche is c'est le cas.

Mon objectif:
Présenter un système de Save/Load utilisant la serialisation binaire et l'utiliser de manière efficace même lorsque les objets à serializer sont complexes. Permettre a l'usager d'avoir a n'en faire le moins possible pour enregistrer ces trucs dans un fichier et les reloader.

Ma solution, lors du Save:
Faire heriter les objets à sauvegarder d'un objet contenant un "Serial", soit un numéro unique associé a l'objet. N'enregistrer tout d'abord dans le fichier la liste des serial à enregistrer, puis ensuite Serialiser chacun des objets associé.

Ma solution, lors du Load:
Créer des objets vides avec chacun des serials de la liste. Leur propriétés se rempliront lorsque le deserialize de cet objet sera appelé. Deserializer ensuite chacun des objets de la liste.

Exemple:
Dans mon programme de gestion familial, j'ai 5 objets de type personne:
Personne( string nom, DateTime dateNaiss, Personne[] Amis )
Serial 0x45CF : Personne( Bob, 1987-01-09, {Ginette,Alphonse})
Serial 0x55E3 : Personne( Ginette, 1988-03-13, {Bob,Leo} )
Serial 0x1CF8: Personne( Leo, 1989-05-14, {Ginette,Alphonse,Rita} )
Serial 0x432E : Personne( Alphonse, 1980-07-21, {Bob,Leo,Rita} )
Serial 0x1111 : Personne( Rita, 1981-08-31, {Leo,Alphonse} )

Au moment de la save, je save d'abord type&serial
0x45CF : Personne
0x55E3 : Personne
0x1CF8: Personne
0x432E : Personne
0x1111 : Personne

Ensuite, je serialize chacun des objets. Lorsqu'un objet de type Personne est demandé, il n'écrit que le serial de la personne
Personne : 0x45CF, Bob, 1987-01-09, 2, 0x55E3, 0x432E
Personne : 0x55E3, Ginette, 1988-03-13, 2, 0x45CF, 0x1CF8
Personne : 0x1CF8, Leo, 1989-05-14, 3, 0x55E3, 0x432E, 0x1111
Personne : 0x432E, Alphonse, 1980-07-21, 3, 0x45CF, 0x1CF8, 0x1111
Personne : 0x1111, Rita, 1981-08-31, 2, 0x432E, 0x1CF8

Voila, ils ont tous été sauvegardés de manière unique.
Maintenant, si l'on desire loader le tout, on va commencer par créer les 5 objets personnes en n'y déposant QUE le serial.
new Personne(0x45CF );
new Personne(0x55E3 );
new Personne(0x1CF8 );
new Personne(0x432E );
new Personne(0x1111 );

Ensuite, on appel la fonction deserialize des objets. Au moment de déserializer le premier, 0x45CF, il fait référence aux 2 objets 0x55E3, 0x432E. Puisque 2 objets existe avec ces 2 serial, on peut directement les référencés sans problemes et ce même si ces objets ne sont pas encore deserializé.

Au final, nous nous retrouvons avec la même structure qu'au départ, et la save aura nécessité un minimum d'espace memoire.

Probleme rencontré:

Dans cet histoire, Bob part en voyage loin loin, mais son avion Crash, et meurt.
On enleve donc Bob des amis de Ginette et Alphonse, car Bob n'existe plus dans le systeme.
Au moment de la save, on enregistrera toujours bob, car même si celui-ci n'existe plus dans le système, il est encore dans la liste des "ObjetsUnique" A sauvegarder.

Solutions trouvés:

1. Obliger l'usager a appeler explicitement une methode "Dispose()" ou similaire qui permetterait de l'enlever de la liste et de "nullifier" l'objet. Cette action me déplait car il faudra obliger l'usager a le faire lui meme toujours. Dans le cas de l'Exemple, c'est simple rajouter la ligne dans la fonction "Meurt()" de Personne. Parcontre, dans des systemes plus complexes ou tres différentes, ce ne sera pas commode.

2. Lors du load, noter tous les objets encore utilisés et ceux qui ne le sont plus. Supprimer les inactif et lors de la prochaine save, elle aura ceux-la en moins. Cette solution me déplait car la save sera parfois tres volumineuse pour rien sur le disque, et le Load() sera fait de maniere plus lente.

3. Lors du save, effectuer une premiere fois la save dans un fichier bidon, pour noter les objets utilisés. Ensuite enlever les inactifs et faire la vrai save. Cette solution me déplait car la save sera énormément longue dans les gros systemes.

Conclusion:
Bref, la solution 2 serait celle que j'implémenterais je pense faute d'avoir une meilleure solution, tout en ajoutant la solution 1 en "a coté" a l'usagé. Maius bon, j'aimerais trouver mieux.
Donc, est-ce que je complexifie quelquechose de simple et que je pourrais obtenir un resultat semblable de maniere bien plus intéressante et simple ?
Et si non, comment pourrais-je miraculeusement résoudre mon problème ?

Un gros merci, j'espere qu'avec ce roman tout est plus clair

Eric

mercredi 7 mai 2008 à 20:44:57 | Re : Obtenir les objets (instances)

ricklekebekoi

Auncune idée personne ???

Eric


1 2

Cette discussion est classé dans : liste, classe, obtenir, objets, instances


Répondre à ce message

Sujets en rapport avec ce message

Liaison d'objets [ par smoundangha ] Bonjour,Questions de débutant : peut-on en c#, dans une classe X (créee dans un namespace Y), appeler une autre le constructeur d'une autre classe X' liste d'objets dépendants [ par taoetc ] Bonjour, j'aurais voulu pouvoir lister la liste des objets chargés par mon projet Est ce que quelqu'un connait l'instruction nécessaire?J'utilise déjà Question d'ordre général [ par el_teedee ] Bonjour, je souhaiterais afficher les objets de ma classe dans une sorte de tableau, avec de lignes en lignes les objets, et de colonnes en colonnes, ArrayList et objets [ par engelho ] Bonjour,Je suis en train de mettre en place une ArrayList dont chaques élément est un objet (tiré d'une classe que j'ai écrit plus tôt).Pour l'afficha Comparer deux listes d'objets [ par emmanuel9 ] Bonjour à tous, J'ai deux ArrayList d'objet Personne avec nom,prenom,etc...Et je voudrais comparer la premiere liste à la seconde.Comment faire detect Comment obtenir la liste des pc (IP ou nom de pc) d'un reseau local? [ par Tellurian ] Je cherche un code pour obtenir la liste des pc d'un reseau local car jusqua maintenant j'utilise la commande dos:net view > liste.txtle pb c'est la c Récupérer les objets d'une Form [ par Kaneda Shotaro ] Bonjour,je crée une application avec des plugins. je peux accèder aux controls visuels de ma Form avec MaFiche.Controls depuis mon plugin pour retrouv Liste d'objets dans les tables [ par scoubidou944 ] Untruc bête comme choux sous csharp& Cie1ere table : une liste de constructeurs (avec en plus un id en clé primaire)2eme table : une liste de modeles Question de programmation objet [ par LaPatoshe ] Salut à tous.J'ai un petit soucis en programmation C#. Je souhaite créer des objets de mobilier diverses. chacun de ces meubles devra contenir des obj Liste d'objets [ par tonitto ] Bonjour, mon probleme est de recuperer la liste des composants d'une FORM, j ai tout essayer sans résultat <font face=


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,328 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.