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

Macros et VBA Excel Discussion :

Bouclage d'attente monopolise 90% des ressources [XL-2003]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 403
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 403
    Par défaut Bouclage d'attente monopolise 90% des ressources
    Bonjour,

    j'ai une application complexe pilotée par un Userform.

    Le userform comprend (entre autres) 1 bouton start et 1 bouton stop.

    En mode start, le code
    * scanne les fichiers d'un répertoire,
    * les traite,
    * attend 15 secondes
    * recommence son scan.

    jusqu'à ce que le bouton stop soit enfoncé.

    'Code Du Bouton start
    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
     
    Private Sub Start_Polling_Click()
    '....
    Do While BStop = False
     
        Found_Entry = ""
        Found_Entry = Dir(Search_file, vbNormal)
     
        Do While Found_Entry <> "" And BStop = False   ' Start the loop.
       'Traitement
            Found_Entry = Dir
        Loop
     
        If Not BStop Then
           Me.Status_text = "Waiting 15 sec before Polling"
           Application.Wait (Now + TimeValue("0:00:15"))
           Me.Repaint
        End If
     
     Loop
    '....
    End Sub
    'Code du bouton Stop
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub Stop_Polling_Click()
    '...
    BStop = True
    '...
    End Sub
    J'ai 2 soucis

    1) La boucle d'attente via
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
           Application.Wait (Now + TimeValue("0:00:15"))
    consomme plus de 90% des ressources de mon pc.
    Je cherche une solution moins gourmande.

    2) Certainement une autre conséquence du soucis 1, il faut cliquer de nombreuses fois sur le bouton <Stop> pour arrêter le processus.

    Est-il possible de faire autrement où dois-je d'urgence réécrire mon code dans un langage plus adapté comme le C++ ?

  2. #2
    Expert confirmé
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Par défaut
    Salut Godz

    Je pense que .OnTime est moins gourmand que .Wait

    Teste ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    If Not BStop Then
        Me.Status_text = "Waiting 15 sec before Polling"
        Application.OnTime Now + TimeValue("0:00:15"), "USF_Repaint"
    End If
    et dans un module
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sub USF_Repaint()
    Me.Repaint
    End Sub

  3. #3
    Membre Expert Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 403
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 403
    Par défaut
    Salut Fring,

    merci pour ta réponse.

    cela ne donne pas le résultat escompté.

    La soumission de USF_Repaint est bien effectuée décallée (démarre 15 secondes plus tard) mais il n'y a aucune attente pour la suite du code principal et j'ai donc un superbe bouclage avec une multitudes d'appels à USF_Repaint..

  4. #4
    Expert confirmé
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Par défaut
    Effectivement, j'ai répondu un peu vite...

    Et comme ceci :
    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
    Private Sub Start_Polling_Click()
    '....
     
        Found_Entry = ""
        Found_Entry = Dir(Search_file, vbNormal)
     
        Do While Found_Entry <> "" And BStop = False   ' Start the loop.
       'Traitement
            Found_Entry = Dir
        Loop
     
           Me.Status_text = "Waiting 15 sec before Polling"
           Application.OnTime Now + TimeValue("0:00:15"), "USF_Repaint"
     
    '....
    End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Sub USF_Repaint()
    If BStop = False Then
        Userform.Repaint '<-- adapter le nom de l'userform
        Call Start_Polling_Click
    End If
    End Sub

  5. #5
    Membre Expert Avatar de Godzestla
    Homme Profil pro
    Chercheur de bonheur
    Inscrit en
    Août 2007
    Messages
    2 403
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de bonheur
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2007
    Messages : 2 403
    Par défaut
    J'étais en train d'envisager la même chose, mais là encore 2 problèmes :

    1) La procédure appelée par .ONTIME doit être dans un module, et mon code principal est dans un USERFORM. Puis-je rappeler Start_Polling_Click() qui se trouve dans le Userform depuis USF_Repaint() qui est dans le Module ? Suffit-il de mettre Start_Polling_Click() en public ?

    2) Je dois revoir quelque peu mon code car Start polling lance (ShellexecuteEx) ACRODR32.exe (entre autres) et le ferme quand le bouton stop est enclenché. Pour des raisons de performance, je veux que cela reste
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    '3h : Open Adobe with Dummy File
    PhWnd = OpenProgramMinimize(Work_folder & "DO_NOT_TOUCH_THIS.PDF", 0)
    quand je clique START et quand je clique STOP
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        CloseProgram = CBool(TerminateProcess(hWnd, lExitCode))
    mais là aussi peut-être je peux utiliser Application.Ontime pour les 2 process.

    Qu'en penses-tu ?

  6. #6
    Expert confirmé
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Par défaut
    Citation Envoyé par Godzestla Voir le message
    Puis-je rappeler Start_Polling_Click() qui se trouve dans le Userform depuis USF_Repaint() qui est dans le Module ? Suffit-il de mettre Start_Polling_Click() en public ?
    Oui il faut mettre la Sub en Public et l'appeler comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CallByName UserForm1, "Start_Polling_Click", VbMethod

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Merci de nous aider à créer des ressources (FAQ et sources)
    Par Community Management dans le forum Evolutions du club
    Réponses: 29
    Dernier message: 19/10/2015, 00h35
  2. [Swing] Gestion des ressources
    Par speedster dans le forum AWT/Swing
    Réponses: 4
    Dernier message: 13/11/2004, 15h09
  3. Réponses: 2
    Dernier message: 09/02/2004, 08h17
  4. Réponses: 4
    Dernier message: 14/10/2003, 08h58
  5. [BCB5] Utilisation des Ressources (.res)
    Par Vince78 dans le forum C++Builder
    Réponses: 2
    Dernier message: 04/04/2002, 16h01

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