Forte consommation CPU

Résolu
Leo_Robotic_Passion Messages postés 135 Date d'inscription dimanche 19 novembre 2000 Statut Membre Dernière intervention 2 décembre 2011 - 8 juil. 2010 à 08:04
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 - 8 juil. 2010 à 13:03
Bonjour,
Ce petit code est relativement gourmand en CPU!
Pouvez-vous m'aider à l'améliorer ou le corriger svp ?

' Déclaration des la variables
Dim Ligne As String 'pour la lecture
Dim Stop_Boucle As Boolean 'pour arrèter la boucle

Private Sub Attendre()
' Variable Date utilisée pour la "pause"
    Dim MaDate As Date
' Date système
      MaDate = Now
' Boucle de temporisation en seconde "ici a 2 seconde"
    Do While Abs(DateDiff("s", MaDate, Now)) < 2
        DoEvents
    Loop
End Sub

Private Sub Bt_Lire_Click()
    'Activation de la variable
    Stop_Boucle = True
        'Boucle "jusqu'au stop"
        Do While Stop_Boucle
                ' Appel de la fonction Sub OuvertureFichier()
                Call OuvertureFichier
        DoEvents
    Loop
End Sub

Sub OuvertureFichier()
    ' Ouverture du fichier en lecture
    Open App.Path & "\ListePositionMarche.txt" For Input As #1
        ' Tant que le fichier n'est pas fini
        Do While Not EOF(1)
            ' Lecture de la ligne
            Line Input #1, Ligne
            ' Affichage de la ligne courante qui vient d'être lue
            List1.AddItem (Ligne)
            List1.TopIndex = List1.ListCount - 1

                
            Call Attendre
                'Conditionnement de l'arret de la boucle
                If Stop_Boucle = False Then
                    'Quit
                    Exit Do
                End If
        DoEvents
        Loop
    ' Fermeture du fichier
    Close #1
End Sub

Private Sub Bt_Stop_Click()
    'Désactivation de la variable
    Stop_Boucle = False
End Sub

10 réponses

cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
8 juil. 2010 à 09:04
Salut,

Forcément, tu fais une attente active, ce qui consommera 100% de ton cpu, fais lui un sleep plutôt :
[del]Do While Abs(DateDiff("s", MaDate, Now)) < 2
DoEvents
Loop/del
Sleep(2000)

Il te faut bien entendu rajouter la déclaration de cette fonction de l'API windows en haut de ton form.
______________________________________

AVANT de poster votre message, veuillez lire, comprendre, et appliquer notre réglement
3
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
8 juil. 2010 à 13:03
Salut,

Parce que le doevents est fait après l'appel à ta temporisation :
Sub OuvertureFichier()
    ' Ouverture du fichier en lecture
    Open App.Path & "\ListePositionMarche.txt" For Input As #1
        ' Tant que le fichier n'est pas fini
        Do While Not EOF(1)
            ' Lecture de la ligne
            Line Input #1, Ligne
            ' Affichage de la ligne courante qui vient d'être lue
            List1.AddItem (Ligne)
            List1.TopIndex = List1.ListCount - 1
            DoEvents 'c'est à ce moment là qu'il faut raffraichir l'interface, pas après la temporisation
                For i = 0 To 19
                    Sleep (100)
                        'Conditionnement de l'arret de la boucle
                        If Stop_Boucle = False Then
                            'Quit
                            Exit Do
                        End If
                Next i
        Loop
    ' Fermeture du fichier
    Close #1
End Sub

______________________________________

AVANT de poster votre message, veuillez lire, comprendre, et appliquer notre réglement
3
Leo_Robotic_Passion Messages postés 135 Date d'inscription dimanche 19 novembre 2000 Statut Membre Dernière intervention 2 décembre 2011
8 juil. 2010 à 11:05
Re,
Merci cela fonction bien et utilisation CPU a 0 ^^

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)


' Déclaration des la variables
Dim Ligne As String 'pour la lecture
Dim Stop_Boucle As Boolean 'pour arrèter la boucle

Private Sub Attendre()
' Variable Date utilisée pour la "pause"
Dim MaDate As Date
    ' Date système
    MaDate = Now
    ' Boucle de temporisation en seconde "ici a 2 seconde"
    Sleep (2000)
End Sub


Le problème maintenant est que le stop de la boucle n'est plus instantané lors du clique sur le bouton!
Une idée ?
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
8 juil. 2010 à 11:07
Salut,

Normal vu que le sleep met en pause ton application. A ce moment là, réduit l'intervale du sleep (par exemple : 100 ms dans une boucle de 20 itérations) et ainsi tu pourras traîter les événements.
______________________________________

AVANT de poster votre message, veuillez lire, comprendre, et appliquer notre réglement
0

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

Posez votre question
Leo_Robotic_Passion Messages postés 135 Date d'inscription dimanche 19 novembre 2000 Statut Membre Dernière intervention 2 décembre 2011
8 juil. 2010 à 11:11
Oups je n'ai pas tous n'nettoyer pour le Sleep

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

' Déclaration des la variables
Dim Ligne As String 'pour la lecture
Dim Stop_Boucle As Boolean 'pour arrèter la boucle

Private Sub Bt_Lire_Click()
    'Activation de la variable
    Stop_Boucle = True
        'Boucle "jusqu'au stop"
        Do While Stop_Boucle
                ' Appel de la fonction Sub OuvertureFichier()
                Call OuvertureFichier
        DoEvents
    Loop
End Sub

Sub OuvertureFichier()
    ' Ouverture du fichier en lecture
    Open App.Path & "\ListePositionMarche.txt" For Input As #1
        ' Tant que le fichier n'est pas fini
        Do While Not EOF(1)
            ' Lecture de la ligne
            Line Input #1, Ligne
            ' Affichage de la ligne courante qui vient d'être lue
            List1.AddItem (Ligne)
            List1.TopIndex = List1.ListCount - 1

             Sleep (2000)

                'Conditionnement de l'arret de la boucle
                If Stop_Boucle = False Then
                    'Quit
                    Exit Do
                End If
        DoEvents
        Loop
    ' Fermeture du fichier
    Close #1
End Sub

Private Sub Bt_Stop_Click()
    'Désactivation de la variable
    Stop_Boucle = False
End Sub


Toujours ce problème de stop
0
Leo_Robotic_Passion Messages postés 135 Date d'inscription dimanche 19 novembre 2000 Statut Membre Dernière intervention 2 décembre 2011
8 juil. 2010 à 11:13
DARKSIDIOUS a dit:

Salut,
Normal vu que le sleep met en pause ton application. A ce moment là, réduit l'intervale du sleep (par exemple : 100 ms dans une boucle de 20 itérations) et ainsi tu pourras traîter les événements.

DSl je n'ai pas tous compris :(
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
8 juil. 2010 à 11:17
Salut,

Par exemple :
Sub OuvertureFichier()
    ' Ouverture du fichier en lecture
    Open App.Path & "\ListePositionMarche.txt" For Input As #1
        ' Tant que le fichier n'est pas fini
        Do While Not EOF(1)
            ' Lecture de la ligne
            Line Input #1, Ligne
            ' Affichage de la ligne courante qui vient d'être lue
            List1.AddItem (Ligne)
            List1.TopIndex = List1.ListCount - 1

             for i = 0 to 19
                
                Sleep(100)
                'Conditionnement de l'arret de la boucle
                If Stop_Boucle = False Then
                    'Quit
                    Exit Do
                End If
             next i
        DoEvents
        Loop
    ' Fermeture du fichier
    Close #1
End Sub


______________________________________

AVANT de poster votre message, veuillez lire, comprendre, et appliquer notre réglement
0
Leo_Robotic_Passion Messages postés 135 Date d'inscription dimanche 19 novembre 2000 Statut Membre Dernière intervention 2 décembre 2011
8 juil. 2010 à 11:47
La "pause" ne se fait toujours pas a immédiatement (certes l'attente après le clique est plus court, mais pas immédiat)
Et le temps de "pause" n'est plus à 2 secondes!
J'avoue ne pas bien comprendre!
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
8 juil. 2010 à 12:01
Salut,

Tu ne peux pas avoir un temps de pause immédiat, sinon il faut scruter ta variable en temps réel, et du coup, tu fais remonter le cpu à 100%. 100 ms ca doit être à peine perceptible pour l'utilisateur normalement.

Par contre, la pause doit toujours être de 2 secondes normalement : tu teste 20 fois si ton bouton à été cliqué, et un temps de 100ms s'écoule entre chaque test.
______________________________________

AVANT de poster votre message, veuillez lire, comprendre, et appliquer notre réglement
0
Leo_Robotic_Passion Messages postés 135 Date d'inscription dimanche 19 novembre 2000 Statut Membre Dernière intervention 2 décembre 2011
8 juil. 2010 à 12:48
Re,
Je ne sais pas si je fais une erreur mais quand je clique pour stopper la boucle, j'ai 2 lignes qui s'affichent dans mon liste box juste après le clique ???


Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

' Déclaration des la variables
Dim Ligne As String 'pour la lecture
Dim Stop_Boucle As Boolean 'pour arrèter la boucle

Private Sub Bt_Lire_Click()
    'Activation de la variable
    Stop_Boucle = True
        'Boucle "jusqu'au stop"
        Do While Stop_Boucle
                ' Appel de la fonction Sub OuvertureFichier()
                Call OuvertureFichier
        DoEvents
    Loop
End Sub

Sub OuvertureFichier()
    ' Ouverture du fichier en lecture
    Open App.Path & "\ListePositionMarche.txt" For Input As #1
        ' Tant que le fichier n'est pas fini
        Do While Not EOF(1)
            ' Lecture de la ligne
            Line Input #1, Ligne
            ' Affichage de la ligne courante qui vient d'être lue
            List1.AddItem (Ligne)
            List1.TopIndex = List1.ListCount - 1
                For i = 0 To 19
                    Sleep (100)
                        'Conditionnement de l'arret de la boucle
                        If Stop_Boucle = False Then
                            'Quit
                            Exit Do
                        End If
                Next i
        DoEvents
        Loop
    ' Fermeture du fichier
    Close #1
End Sub

Private Sub Bt_Stop_Click()
    'Désactivation de la variable
    Stop_Boucle = False
End Sub
0
Rejoignez-nous