DEFI AUX PROGRAMEUR : Set..=nothing automatique

ErwanPoudes Messages postés 13 Date d'inscription mercredi 1 novembre 2000 Statut Membre Dernière intervention 5 janvier 2005 - 13 déc. 2004 à 17:44
ErwanPoudes Messages postés 13 Date d'inscription mercredi 1 novembre 2000 Statut Membre Dernière intervention 5 janvier 2005 - 15 déc. 2004 à 11:05
Bonjour,

Tout le monde connait le pb des variables objets (set variable=...)
que l'on oublie de mettre à nothing (set variable = nothing) à la fin du code et qui amènent qq bug!!! :dissapprove)

Depuis qq temps j'essaye (sans aucun succés) de créer un bout de code qui mettrait toutes ces variables encore en activité à nothing au moment de la fermeture de ma base access...une espece de boucle sur la collection(si elle existe des variables objets)

Je bute sur plusieurs pb :sad) :
- si l'on met à nothing une variable déja mise à nothing , cela produit une erreur;
- je n'arrive pas à récupérer une liste dynamique de ces variables (au mieux , je me base sur une liste préétablie)
- même avec une liste préétablie , VB met à nothing la chaine de caractère , mais pas la variable qui se nomme de la même façon...c'est dire s'il ne fait pas grand chose!!

A vrai dire, j'apprécierai (et tous les programmeurs VB ;) , je pense) un code total mais même qq pistes seraient les bienvenues

Merci d'avance.
Thus

Air-1 :shy)

17 réponses

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
13 déc. 2004 à 18:15
Salut ErwanPoudes

If Not MaVar Is Nothing Then Set MaVar = Nothing


Vala
Jack
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage. (Socrate)
0
jrivet Messages postés 7392 Date d'inscription mercredi 23 avril 2003 Statut Membre Dernière intervention 6 avril 2012 60
13 déc. 2004 à 18:30
Salut,

j ai une question

Moi en vb6: (si l'on met à nothing une variable déja mise à nothing , cela produit une erreur; ) ca me donne pas de message d erreur.

j ai tester ca par exemple et ca pete pas:
Dim rs As New ADODB.Connection
Set rs = Nothing
Set rs = Nothing


Des informations?

@+
Julien
-----------------------------------------------------------
:big) Essaie ca sinon on trouvera autre chose ;)
-----------------------------------------------------------
0
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 21
13 déc. 2004 à 19:14
Salut,
Personnellement, dans toutes les sub et function, si je déclare un objet je mets un set objet = nothing en fin de sub (ou function).
A la limite, s'il y a des sorties de sub (exit sub), je les remplace par un goto Fin avec en fin de code de la sub
Fin:
et là je code un .... = nothing pour tous mes objets déclarés en début de sub.

Pour les objets déclarés en public, je crée une sub de fin qui les vide et que j'appelle à la place de End ou dans les form_unload qui quittent l'appli.

Je sais, c'est un peu ch.... mais bon, ça fait partie de la prog et surtout de l'analyse du prog.

Pour les forms, c'est plus simple, dans la sub de fin on met :

dim f as form
for each f in forms
unload f
next

Si quelqu'un a une solution plus simple et universelle pour libérer la mémoire en quittant un prog, je suis preneur.

Cordialement, CanisLupus
0
cboulas Messages postés 2641 Date d'inscription mercredi 2 juin 2004 Statut Membre Dernière intervention 8 janvier 2014 16
13 déc. 2004 à 20:08
Salut,

Bon c'est pas d'un grand secours, mais en .Net y'a le GarbageCollector qui le gère en automatique, bien entendu tu peux "gérer" l'activité de celui-ci mais il faudra pour cela lire un bouquin de +1500 pages sur celui-ci.

Chris...
Web : Firstruner - eMail : [mailto:support@firstruner.com Support]
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
crenaud76 Messages postés 4172 Date d'inscription mercredi 30 juillet 2003 Statut Membre Dernière intervention 9 juin 2006 28
14 déc. 2004 à 09:03
Je ne comprend pas le problème à la base !! Et je suis comme CanisLupus
Le fait de faire un "Set MaVar Nothing" si tu as fais un "Set MaVar New MonObjet" fait parti intégrante du travail de developpeur !! Je ne connais aucun automatisme, ormi le garbage collector, qui fait cruellement défaut en VB6, permettant de s'en passer. Et même en .NET ou tu as le Garbage collector, il est recommandé de faire toi-même les désallocations mémoire des objets. Laisser le garbage collector faire le travail serait une erreur.
Un garbage collector consomme du temps et de la puissance processeur pour rien !
Un bon developpeur devrait toujours désallouer explicitement tout ce qu'il a alloué explicitement ou implicitement. A l'époque ou on avait pas 1Go de Ram sur nos bécanes, on y faisait très attention !

Le défaut de VB, c'est d'avboir fait croire à ces developpeurs qu'il s'occupait tout seul des désallocations et qu'ils perdaient du temps d'execution en les faisant eux-même !! Que tu laisses VB faire la désallocation tout seul en sortie de procédure (ce qu'il ne fait pas touours très bien !) ou que tu la fasses toi-même par un set MaVar = Nothing ne ralentit pas le code, c'est plus propre, ca permet une meilleure compréhension du code par un tiers ... bref, cela n'a que des avantages.
Y a plus qu'à être courageux et à ne pas les oublier.
Je ne suis juste pas d'accord avec Canis Lupus, qui met un "Goto Fin" en cas de rupture de l'execution linéaire d'une procédure, moi, j'évite au maximum les goto (je n'en pet que dans mais gestionnaire d'erreur) et je préfère multiplier les lignes de Set MaVar = Nothing à plusieurs endroit dans la procédure, plutot qu'un "Goto Fin", mais c'est une histoire de goût ...

Christophe R.
0
bouv Messages postés 1411 Date d'inscription mercredi 6 août 2003 Statut Membre Dernière intervention 3 mars 2019 1
14 déc. 2004 à 09:57
Petite question sur la remarque de CanisLupus concernant le code suivant :

dim f as form
for each f in forms
unload f
next

Je pensais que la fonction End s'occupait de ça automatiquement ?

Bonne prog
++
0
ErwanPoudes Messages postés 13 Date d'inscription mercredi 1 novembre 2000 Statut Membre Dernière intervention 5 janvier 2005
14 déc. 2004 à 10:33
En fait le truc, c'est que j'ai besoin de conserver les bojets d'une procédure à l'autre...
Donc je ne peux pas les mettre à nothing en fin de fonction ...


Air-1 :shy)
0
crenaud76 Messages postés 4172 Date d'inscription mercredi 30 juillet 2003 Statut Membre Dernière intervention 9 juin 2006 28
14 déc. 2004 à 11:43
Il seront normalement détruit en sortie de procédure si tu les a déclarer dans la procédure ! Tu ne pourras pas les conserver.
Pour qu'il survive à ta procédure, ils doivent être déclaré au niveau module.
Bouv < la fonction "End" le fait mais de façon si malpropre et se comporte un peu comme Alien en détruisant tout ce qui se trouve devant elle, alors ce n'est vraiment pas propre et en plus il y a des soucis e fuite mémoire avec "End" ! Perso, je ne l'utilsies jamais !! Le code de Canis Lupus est une très bonne alternative.

Christophe R.
0
ErwanPoudes Messages postés 13 Date d'inscription mercredi 1 novembre 2000 Statut Membre Dernière intervention 5 janvier 2005
14 déc. 2004 à 12:47
Ecoutez..je suis d'accord avec vous tous!!!

c'est plus propre de tout désallouer au fur et à mesure et c'est signe d'un bon programmeur

D'accord aussi pour la portée des variables!!

JE FAIS TOUT çA!!!!!
Il n'y a aucun pb là dessus!!!

En fait , je debugge un appli développée par un fou furieux (300MO alors que la base est pratiquement vide, il a recréé une calculette et pleins de choses qui existe déja, il y a un historique d'absolument tout ce qui se passe sur les tables y compris consultation, il a doublé le systeme de sécurité d'accès de microsoft....bref plus de 1200 objets (formulaires, états, requetes..), 180 modules et environ 43000lignes de codes sans les commentaires (j'ai un util qui me calcule ça, et encore j'ai bien reduit de moitié)

Il n'a désalloué aucune de ses variables..et comme je l'ai écrit il s'en sert d'une procédure à l'autre, d'un module à l'autre (elles sont par contre déclarées au bon endroit)

Access ne se ferme correctement, il y a toujours une instance qui reste ouverte et je suspecte fortemement que ça vient de là!!

Voilà mon problème...Please HEEEEEEEEEELLLLLLP me!!!! %-6

OK pour le test si mise à nothing ou pas...quelq'un à une idée pour lister toutes les variables objets???
Air-1 :shy)
0
bouv Messages postés 1411 Date d'inscription mercredi 6 août 2003 Statut Membre Dernière intervention 3 mars 2019 1
14 déc. 2004 à 13:29
Quel type de connection utilises-tu ?
DAO, ADO ?

A tu pensé à
MaConnection.Close

Perso en ADO, meme si je ne le met pas le connection se ferme seule (sauf cas de plantage de l'appli) car la BDD voit qu'il n'y a plus personne connecté (mais il vaut quand meme mieux le mettre).

Regarde plutot part là !

crenaud76>> Merci pour l'explication, j'ai beaucoup aimé l'exemple d'Alien...

Bonne prog
++
0
bouv Messages postés 1411 Date d'inscription mercredi 6 août 2003 Statut Membre Dernière intervention 3 mars 2019 1
14 déc. 2004 à 13:29
Quel type de connection utilises-tu ?
DAO, ADO ?

A tu pensé à
MaConnection.Close

Perso en ADO, meme si je ne le met pas le connection se ferme seule (sauf cas de plantage de l'appli) car la BDD voit qu'il n'y a plus personne connecté (mais il vaut quand meme mieux le mettre).

Regarde plutot part là !

crenaud76>> Merci pour l'explication, j'ai beaucoup aimé l'exemple d'Alien...

Bonne prog
++
0
bouv Messages postés 1411 Date d'inscription mercredi 6 août 2003 Statut Membre Dernière intervention 3 mars 2019 1
14 déc. 2004 à 13:32
Oups j'ai posté 2 fois.

Au fait pour lister les variables objet, j'ai jetter un oeil dans la MSDN et j'ai bien failli me retrouver borgne.
Non je plaisante, mais ils disent que c'est pas possible.

Bonne prog
++
0
ErwanPoudes Messages postés 13 Date d'inscription mercredi 1 novembre 2000 Statut Membre Dernière intervention 5 janvier 2005
14 déc. 2004 à 15:20
J'utilise DAO...

En fait , je ne sais pas encore trop ce que c'est que ADO...je vais y venir...mais c'est une autre histoire!!!
Air-1 :shy)
0
bouv Messages postés 1411 Date d'inscription mercredi 6 août 2003 Statut Membre Dernière intervention 3 mars 2019 1
14 déc. 2004 à 20:39
Non, très peu de choses changent, les requettes sont exactement les memes et l'ADO est BEAUCOUP plus rapide.
Si tu veux, je peux t'envoyer un petit projet en ADO juste pour exemple.

Et pour le MaConnection.Close en fin de programme, tu y a pensé ?

Bonne prog
++
0
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 21
14 déc. 2004 à 20:49
Juste un petit passage pour donner raison à crenaud76 pour le goto.
J'avais mis "à la limite", j'aurais dù mettre "à l'extrême limite" et comme lui, je ne l'utilise que dans un gestionnaire d'erreur.

Sinon, ErwanPoudes, je compatis. Ne serait-il pas plus rapide de redévelopper cette appli ?
En attendant, je ne peux que te conseiller de repérer les principaux points de sortie de l'appli, les objets déclarés au niveau général de tous tes modules et feuilles (ça comprend aussi les objets de base de données du style database, recordset, ....), en fait tout ce qui est initialisé avec un set .....

Dans une sub de fin que tu appelleras à tous les points de sortie de l'appli, tu mets, pour chaque objet que tu as repéré :

set varobj = nothing

Pas besoin de tester si la var est déjà à nothing, ça plantera pas si elle est déclarée en global ou public.

Le code de jack est par contre valable pour les objets touchant à une base de données :

If MaVar Is Not Nothing Then
MaVar.close
Set MaVar = Nothing
endif

Et pour finir, mon code pour décharger les forms oubliées par ci par là.

dim f as form
for each f in forms
unload f
next

Mais, dis, on t'oblige à faire ça ? C'est inhumain !
Une calculette qui pèse 300Mo j'avais pas encore vu !
Tu pourrais publier la source qu'on rigole un bon coup ? Car ça doit être un morceau d'anthologie à conserver précieusement dans un musée pour montrer aux générations futures ce qu'il ne faut pas faire.

:big) >:)
Cordialement, CanisLupus
0
cs_CanisLupus Messages postés 3757 Date d'inscription mardi 23 septembre 2003 Statut Membre Dernière intervention 13 mars 2006 21
14 déc. 2004 à 20:58
Oups, c pas If MaVar Is Not Nothing Then ..., c'est bien If Not MaVar Is Nothing Then ... comme dit jack.

Cordialement, CanisLupus
0
ErwanPoudes Messages postés 13 Date d'inscription mercredi 1 novembre 2000 Statut Membre Dernière intervention 5 janvier 2005
15 déc. 2004 à 11:05
Bon OK, je me résigne ... :(

Vous n'aurez malheureusement pas le code (on m'a fait signer un jouuuuuuli contrat de confidentialité ;)

Mais je vous rassure, ça fait autre chose que calculette (en fait ça gère tous les baux immobiliers d'une grande boite de presta)
C'est TRES TRES complet...

Je ne sais pas comment décrire : à la fois génial et ç la fois complètement dingue.

Merci à tous

Air-1 :shy)
0
Rejoignez-nous