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

VB 6 et antérieur Discussion :

Boucle Do Loop d'attente et Utilisation de l'UC


Sujet :

VB 6 et antérieur

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 132
    Par défaut Boucle Do Loop d'attente et Utilisation de l'UC
    Le sujet est dans le titre.
    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
    Private Sub Main()
    Dim LeTimer As Long
    Dim Frequence As Long
    Dim Arret As Boolean
    Arret = False
    Frequence = 10000 'en millisecondes = 10 Sc
    LeTimer = SetTimer(0, 0, Frequence, AddressOf TimerProc)
    Do While Arret = False
        DoEvents
        If GetAsyncKeyState(vbKeyControl) And _
            GetAsyncKeyState(vbKeyMenu) And _
            GetAsyncKeyState(vbKeyW) Then
           'detection de ctrl + Alt + w
           'masque pour eviter des declanchements non voulues
            Arret = True
        End If
    Loop
    KillTimer 0, LeTimer
    MsgBox "Prog arreté", vbInformation, ""
    End Sub
    Cette boucle me permet de mettre fin a la surveillance d'un autre prog géré dans Sub TimerProc
    Lorsque je regarde dans le gestionnaire de tâche, l'utilisation de l'UC est égal a 100%, est ce penalisant pour les autres programmes ?
    je sais que c'est la boucle Do Loup qui produit ce phénomène
    Question, est il possible de faire un arret de survaillance d'une autre façon.

    Merci


    20H50, MOTIF de l'edit, je viens de posté, mais gros orage, je dois quitter le forum pour arreter l'ordi
    :whistle:pourquoi pas, pour remercier, un :plusser: pour celui/ceux qui vous ont dépannés.
    saut de ligne
    OOOOOOOOO👉 → → Ma page perso sur DVP ← ← 👈

  2. #2
    Membre Expert
    Avatar de Delbeke
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    2 675
    Détails du profil
    Informations personnelles :
    Âge : 72
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 2 675
    Par défaut
    Je penses que c'est plutot le doevents qui surcharge l'uc pour rien.
    Essaye d'utiliser GetInputState pour tester si on a besoin de faire le Doevents

    (The GetInputState function determines whether there are mouse-button or keyboard messages in the calling thread's message queue.)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Private Declare Function GetInputState Lib "user32" () As long 
    ....
    Do While Arret = False
        If GetInputState then DoEvents 
        If GetAsyncKeyState(vbKeyControl) And _
            GetAsyncKeyState(vbKeyMenu) And _
            GetAsyncKeyState(vbKeyW) Then
           'detection de ctrl + Alt + w
           'masque pour eviter des declanchements non voulues
            Arret = True
        End If
    Loop
    Ca pourrait bien soulager l'UC

  3. #3
    Expert confirmé
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 132
    Par défaut
    Merci Delbeke, mais le resultat est identique avec un effet de retard sur le rafraichissement des fenêtres des autres programmes.
    Sur mon PC personnel (UC à 1.3 GHz, 224 Mo de RAM), la charge dût au doevents systematique, n'est pas des plus penalisantes, par contre au pro (UC à 350 MHz 128 Mo de RAM) sa devient limite.
    Je tag resolut, rien n'empechant des propositions d'autres forumeurs.
    Salut
    :whistle:pourquoi pas, pour remercier, un :plusser: pour celui/ceux qui vous ont dépannés.
    saut de ligne
    OOOOOOOOO👉 → → Ma page perso sur DVP ← ← 👈

  4. #4
    Membre Expert
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    1 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Argentine

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 173
    Par défaut
    Salut,

    En commentant le doevents, même constat sur le cpu ? Si oui, la réponse de delbeke qui bien que valide dans certains cas ne t'apportera rien.

    En effet, le cpu va être totallement consommé par ta boucle infinie et ce cycliquement jusqu'à l'intervention de "TimerProc".

    La solution selon moi est d'insérer un deuxième timer, branché en fréquence = toutes les 0.2 secondes par exemple (à affiner), et d'inclure le contenu de ta boucle dans l'événement de ce dernier (_timer).

    Autrement, mais je suis moins sur du résultat, une idée intermédiaire serait d'également utiliser un timer mais cette fois juste pour relever des intervalles de temps minimum entre chaque passage dans ta boucle.

    Par 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
    Private Sub Main()
    Dim LeTimer As Long
    Dim LeTimer2 As Long 'Nouveau timer servant à se donner un intervalle
    Dim Frequence As Long
    Dim Arret As Boolean
     
    Arret = False
    Frequence = 10000 'en millisecondes = 10 Sc
    LeTimer = SetTimer(0, 0, Frequence, AddressOf TimerProc)
    LeTimer2 = SetTimer(0, 0, 10, 0) 'Ici j'ai fait comme toi mais je suis pas sûr du tout de ce que ça peut donner avec 0 ;)
     
    LeTimer2.enabled = true
     
    Do While Arret = False
        'Test de l'intervalle 
        If LeTimer2.value = 200 then
            If GetAsyncKeyState(vbKeyControl) And _
                GetAsyncKeyState(vbKeyMenu) And _
                GetAsyncKeyState(vbKeyW) Then
               'detection de ctrl + Alt + w
               'masque pour eviter des declanchements non voulues
                Arret = True
            End if
            LeTimer2.value = 0
        End If
    Loop
    KillTimer 0, LeTimer
    MsgBox "Prog arreté", vbInformation, ""
    End Sub
    J'ai pas de vb sous la main, à débugguer

  5. #5
    Expert confirmé
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 132
    Par défaut
    Merci de la propsition, je vais essayer, mais je n'aime pas faire une boucle (Do .... Loop ou For .... Next ou ...) sans un Doevents dedans, car il est defois bien difficile d'en sortire et/ou les autres programmes risque de ramer car la boucle prend toutes les ressources.
    Je regarde sa et je tiendrai au courant.

    Salut
    :whistle:pourquoi pas, pour remercier, un :plusser: pour celui/ceux qui vous ont dépannés.
    saut de ligne
    OOOOOOOOO👉 → → Ma page perso sur DVP ← ← 👈

  6. #6
    Membre Expert
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    1 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Argentine

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 173
    Par défaut
    ce qu'il faut savoir, c'est que le doevents est parfois la source d'un 100% cpu load, parfois non mais dans tous les cas, il PERMET aux autres ressources d'utiliser une partie du cpu.

    En fait, le 100% de charge ne veut rien dire, car dès qu'une autre ressource aura besoin (alors ça c'est sûr pour une ressource interne au programme, pour les autres programmes je sais pas) de CPU elle l'obtiendra dans la mesure du possible. Finalement, c'est un peu "je bouffe 100% sauf si vous en avez besoin" ...

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

Discussions similaires

  1. Probleme de boucle do loop
    Par jacko842 dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 18/01/2008, 15h31
  2. Problème avec une boucle Do.. Loop Until
    Par gta126 dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 29/12/2007, 12h27
  3. terminer une boucle Do Loop
    Par svedberg dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 15/10/2007, 04h17
  4. boucle while loop trop lente et pennible
    Par jm_force dans le forum Access
    Réponses: 3
    Dernier message: 10/08/2006, 18h36
  5. [VBA-E] PRobleme avec une boucle DO..LOOP WHILE
    Par AliochaBada dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 31/07/2006, 02h04

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