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

VBScript Discussion :

Problème d'utilisation mémoire en VB Script


Sujet :

VBScript

  1. #1
    adu
    adu est déconnecté
    Futur Membre du Club
    Inscrit en
    Décembre 2004
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 9
    Points : 7
    Points
    7
    Par défaut Problème d'utilisation mémoire en VB Script
    Bonjour,

    J'utilise un VB Script pour lire des informations (un compteur) sur une carte "style PCI" fabriquée spécifiquement pour nous.

    Cette carte est fournie avec une Dll "PI16". Pour utiliser les fonctions de cette DLL, j'utilise Dynamic Wrapper X.

    Toutes les secondes, je vais lancer ma fonction VBS. Cela fonctionne très bien sauf que je pompe petit à petit toute la ressource mémoire du PC.

    Voici mon code

    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
    Public Function Lecture(Num_Carte)
     
    Dim Retour
    Dim DX
    Dim Tab_Return(1)
     
    Set DX = CreateObject("DynamicWrapperX")
     
    DX.Register "PI16.dll","PI16_read_compteur", "i=uU", "r=l"
    Retour = DX.PI16_read_compteur (Num_Carte, Compteur)
     
    DX.Register "PI16.dll","PI16_reset", "i=u", "r=l"
    Retour = DX.PI16_reset (Num_Carte)
     
    Tab_Return(0) = Compteur
    Lecture = Tab_Return
     
    End Function
    J'ai essayé de mettre

    Set DX = Nothing à la fin de ma fonction mais ça ne change rien

    Est ce que quelqu'un a une idée ??

    D'avance merci

  2. #2
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 038
    Points
    20 038
    Par défaut
    tu as essayé d'écrire ton code autrement en n'enregistrant tes 2 fonctions Dll une seule fois .. puis toutes les secondes tu fais seulement l'appel de ces deux fonctions dll sans les enregistrer à nouveau....

    :oups: je suis pas sur d'être clair la ...

  3. #3
    Rédacteur
    Avatar de omen999
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 296
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 296
    Points : 3 549
    Points
    3 549
    Par défaut
    :oups: je suis pas sur d'être clair la ...
    si, si

    et sinon quel est l'intérêt du tableau local Tab_Return ?
    nomen omen, nemo non omen - Consultez la FAQ VBScript et les cours et tutoriels VBScript
    le plus terrible lorsqu'une voiture renverse un piéton, c'est que ce sont les freins qui hurlent. (ramón)
    pas de questions techniques par mp

  4. #4
    adu
    adu est déconnecté
    Futur Membre du Club
    Inscrit en
    Décembre 2004
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 9
    Points : 7
    Points
    7
    Par défaut
    Merci pour votre aide.

    En fait, je lance ma fonction VBS depuis un programme en Adelia Visual Studio. Cet AGL me permet d'exécuter des fonctions de script VBS.

    Je lance donc ma fonction toutes les secondes via un timer dans mon programme Adelia. Si je n'enregistre pas mes fonctions dll à chaque fois, ça ne fonctionne pas.

    Maintenant, si vous avez une idée pour me permettre de ne pas faire le "Register" à chaque fois, je suis preneur.

  5. #5
    Rédacteur
    Avatar de omen999
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 296
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 296
    Points : 3 549
    Points
    3 549
    Par défaut
    si le script est lancé à partir d'un logiciel tiers, la fuite mémoire peut aussi provenir d'une mauvaise implémentation du moteur de script par Adelia
    surtout si les concepteurs ont choisi d'appeler directement les interfaces active script sans utiliser le MS Script Control
    ce genre de programmation est assez "touchy" et je parle en connaissance de cause
    cette fuite est-elle toujours présente avec une fonction qui se contente de créer un objet sans rien faire d'autre, en testant successivement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set DX = CreateObjet("DynamicWrapperX")
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set DX = CreateObjet("Scripting.FileSystemObject")
    une solution serait de déporter le timer dans le script pour éviter les appels incessants à celui-ci mais ça suppose que ledit script puisse accéder
    d'une façon ou d'une autre à une variable du programme hôte et parallèlement que ce programme
    puisse modifier les variables publiques du script pour sortir proprement de la boucle
    exemple:
    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    Dim DX
    Dim LoopFlag
     
    Sub TimerProc(hWnd,uMsg,idEvent,dwTime)
    Dim Compteur
      DX.PI16_read_compteur Num_Carte, Compteur
      DX.PI16_reset Num_Carte
      ..
      'MAJ d'une variable dans le programme hôte Adelia
      ..
    End Sub
     
    Public Sub InitLecture(Num_Carte)
    Dim Ref
    Dim pTimerProc
    Dim TimerID
      LoopFlag=True
      Set DX = CreateObject("DynamicWrapperX")
      With DX
        .Register "PI16.dll","PI16_read_compteur", "i=uU", "r=l"
        .Register "PI16.dll","PI16_reset", "i=u", "r=l"
        .Register "user32.dll","SetTimer","i=huul","r=l"
        .Register "user32.dll","KillTimer","i=hu","r=l"
        .Register "kernel32.dll","Sleep","i=u"
      End With 
      Set Ref=GetRef("TimerProc")
      pTimerProc=oWrap.RegisterCallback(Ref,"i=huuu")
      TimerID=DX.SetTimer(0,0,1000,pTimerProc)
      While LoopFlag  'main loop le prog Adelia doit pouvoir désarmer ce flag
        DX.Sleep 500
      Wend
      DX.KillTimer 0,TimerID
    End Sub
    nomen omen, nemo non omen - Consultez la FAQ VBScript et les cours et tutoriels VBScript
    le plus terrible lorsqu'une voiture renverse un piéton, c'est que ce sont les freins qui hurlent. (ramón)
    pas de questions techniques par mp

Discussions similaires

  1. Connaitre l'utilisation mémoire d'un script
    Par Viish dans le forum Bibliothèques tierces
    Réponses: 1
    Dernier message: 02/03/2014, 09h55
  2. [PHPExcel] Utilisation de la mémoire
    Par Mitaka dans le forum Bibliothèques et frameworks
    Réponses: 5
    Dernier message: 15/07/2010, 19h25
  3. Problème d'utilisation de gnome-web-photo dans script PHP
    Par 9h0ost dans le forum Applications et environnements graphiques
    Réponses: 0
    Dernier message: 21/08/2009, 10h22
  4. Script de backup - Problème à l'utilisation SSH
    Par gcvoiron dans le forum Linux
    Réponses: 5
    Dernier message: 05/07/2008, 09h51
  5. [Tomcat][Spring] Problème utilisation mémoire
    Par Wutintin dans le forum Hibernate
    Réponses: 12
    Dernier message: 08/09/2005, 14h57

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