Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1956 connectés 

  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  [VBA et Access] Question sur un morceau de code !

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[VBA et Access] Question sur un morceau de code !

n°446294
Yoyo@
Posté le 02-07-2003 à 14:01:04  profilanswer
 

Salut,
 
Dans le code suivant :
 

Code :
  1. Private Sub Command0_Click()
  2.   Dim mydb As Database
  3.   Dim rst As Recordset
  4.   Set mydb = CurrentDb
  5.   Set rst = mydb.OpenRecordsetnrecordset("myTable", dbOpenDynaset)
  6.  
  7.   rst.Close
  8.   Set rst = Nothing
  9.   mydb.Close
  10.   Set mydb = Nothing
  11.  
  12. End Sub


 
Je me demandais si :

Code :
  1. rst.Close
  2.   Set rst = Nothing
  3.   mydb.Close
  4.   Set mydb = Nothing


 
était absolument nécessaire! Bien sur, je parle d'un point de vue optimisation (vitesse d'exécution et données en mémoire)
Est ce que ca sert vraiemnt à quelque chose de mettre ces lignes (à part pour la propreté du code?) ou de toute maniere, une fois la procédure terminée, les objects seront éliminés de la mémoire?
 
A vrai dire, je me pose pas mal de questions sur VBA et Access depuis quelques temps, mais je ne trouve pas de lien sur MSDN ou ils parlent d'optimisation pour VBA/Access.
 
Yoyo*


Message édité par Yoyo@ le 02-07-2003 à 14:01:24
mood
Publicité
Posté le 02-07-2003 à 14:01:04  profilanswer
 

n°446328
drasche
Posté le 02-07-2003 à 14:18:47  profilanswer
 

Point de vue optimisation, il est toujours intéressant de faire soi-même des opérations qui sont prises en charge par VB implicitement.
 
Donc oui, détruis toujours proprement tes objets et tu limiteras le nombre de problèmes potentiels :jap:
 
il faut savoir que VB fait bien son travail dans beaucoup de cas, mais "seulement" beaucoup.  Dans les autres cas, au choix ça plante, ou le programme reste chargé en mémoire alors qu'on croit l'avoir quitté.


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
n°446348
Yoyo@
Posté le 02-07-2003 à 14:36:27  profilanswer
 

D'accord, donc, la conclusion, c'est que ca peut etre plus rapide si je le fais à la main, mais au bout du compte, "normalement", il n'y aura pas de perte en mémoire si je ne le fais pas?

n°446355
drasche
Posté le 02-07-2003 à 14:37:09  profilanswer
 

normalement, tout est relatif avec VB tu sais ;)


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
n°446375
MagicBuzz
Posté le 02-07-2003 à 14:52:14  profilanswer
 

Normalement, VB le fait lui-même, mais lorsque le programme s'arrête (pas quand la fonction est finie)
 
Donc mettons que tu entres 20 000 fois de suite dans une fonction créant un RS, si tu le détruit pas... Bah tu tas swapper sévère. Mais au final, quand tu vas quitter le programme, tu vas revenir à une utilisation normale.
 
PS: niveau perfs, les lignes "rs.close()" et set "rs = nothing" (idem avec cnx) sont instantannées. C'est pas VB qui le gère, mais ADO lui-même, et il le fera en // donc aucune différence d'un point de vue vitesse d'éxécution du code.

n°446521
Yoyo@
Posté le 02-07-2003 à 16:51:23  profilanswer
 

MagicBuzz a écrit :

Normalement, VB le fait lui-même, mais lorsque le programme s'arrête (pas quand la fonction est finie)
 
Donc mettons que tu entres 20 000 fois de suite dans une fonction créant un RS, si tu le détruit pas... Bah tu tas swapper sévère. Mais au final, quand tu vas quitter le programme, tu vas revenir à une utilisation normale.
 
PS: niveau perfs, les lignes "rs.close()" et set "rs = nothing" (idem avec cnx) sont instantannées. C'est pas VB qui le gère, mais ADO lui-même, et il le fera en // donc aucune différence d'un point de vue vitesse d'éxécution du code.


 
Oups, j'ai oublié de préciser que mes RecodSet sont des DAO ! Mais bon, je pense que c'est plus ou moins la meme chose ;)
 
Conclusion, j'ai intéret à etre propre, car si mon appli est ouverte pendant 24h, alors de la "merde" risque de s'accumuler en mémoire? J'ai aussi intéret à gérer tout ca dans mes gestions d'erreur, si une erreur survient, je suppose?

n°446552
MagicBuzz
Posté le 02-07-2003 à 17:05:19  profilanswer
 

Pas si c'est 24h, tu t'en bat les ***** parcequ'il va y avoir des timeout (pas d'activité = timeout) donc les objets vont s'auto-killer tout seuls.
 
y'a juste les objets CNX qui vont rester ouverts et valides (mais avec une connection fermée) mais de toute façon, faut pas en ouvrir 50, tu utilises tout le temps le même...

n°446586
Yoyo@
Posté le 02-07-2003 à 17:20:37  profilanswer
 

MagicBuzz a écrit :

Pas si c'est 24h, tu t'en bat les ***** parcequ'il va y avoir des timeout (pas d'activité = timeout) donc les objets vont s'auto-killer tout seuls.
 
y'a juste les objets CNX qui vont rester ouverts et valides (mais avec une connection fermée) mais de toute façon, faut pas en ouvrir 50, tu utilises tout le temps le même...


 
Je n'utilise pas ADO, donc, pas de probleme concernant les Objects "CNX".
 
LEs timeouts marchent commznt? Ca veut dire que Access (ou le moteur VBA?), de temps en temps, apssent en revue les objets et regardent quand ils ont éé utilisés la dernbiere fois, et si ca fait "longtemps", alors il kille?

n°446855
MagicBuzz
Posté le 02-07-2003 à 20:28:37  profilanswer
 

Il kill pas les rs, mais les close, donc libère la mémoire qu'il occupent (du moins, l'intégralité des données qu'ils avaient retourné)

n°447592
Yoyo@
Posté le 03-07-2003 à 14:47:10  profilanswer
 

MagicBuzz a écrit :

Il kill pas les rs, mais les close, donc libère la mémoire qu'il occupent (du moins, l'intégralité des données qu'ils avaient retourné)


 
D'accord, je saisis, donc, les rs ne sont pas "libérés" à la fin de la procédure, mais plus tard seulement (TimeOut)

mood
Publicité
Posté le 03-07-2003 à 14:47:10  profilanswer
 

n°447854
MagicBuzz
Posté le 03-07-2003 à 17:22:06  profilanswer
 

Ca démends, mais oui, ça arrive souvent qu'en sortie de procédure ils restent instancié, chais pas pourquoi, des fois VB déclare ses variables en globale sans qu'on lui demande rien.

n°447912
Yoyo@
Posté le 03-07-2003 à 17:48:40  profilanswer
 

Mais comment tu sais tout ça toi? Tu as un moyen de voir ce qui reste en mémoire parmi tout ce que crée VB(A)?
 
Sinon, connaitrais tu des pages web expliquant comment optimiser son code, genre utiliser des Long à la place de Int, ne pas utiliser de Variant quand c'est possible, etc...
 
Je suis assez friand de ce genre d'infos ! Ca ne mange pas de pain, et c'est bon psychologiquement de savoir qu'on ne perd pas de temps à cause de trucs "débiles"


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  [VBA et Access] Question sur un morceau de code !

 

Sujets relatifs
question bete sur les liens et les images[access et vba] method before upadte et cancel de l'update
code SQL dans une requete ....[pu d'erreur inside !!!]2 question sur les forms
Etats sous accessRécupérer le code source d'une page
Access[VBA/VB] Utilisation d'une dll - Localisation de la dll
Cherche cours d'optimisation de code PHP ![ WML ] Erreur dans le code ?
Plus de sujets relatifs à : [VBA et Access] Question sur un morceau de code !


Copyright © 1997-2018 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR