Forte consommation CPU [Résolu]

Signaler
Messages postés
135
Date d'inscription
dimanche 19 novembre 2000
Statut
Membre
Dernière intervention
2 décembre 2011
-
Messages postés
15814
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
-
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

Messages postés
15814
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
115
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
Messages postés
15814
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
115
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
Messages postés
135
Date d'inscription
dimanche 19 novembre 2000
Statut
Membre
Dernière intervention
2 décembre 2011

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 ?
Messages postés
15814
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
115
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
Messages postés
135
Date d'inscription
dimanche 19 novembre 2000
Statut
Membre
Dernière intervention
2 décembre 2011

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
Messages postés
135
Date d'inscription
dimanche 19 novembre 2000
Statut
Membre
Dernière intervention
2 décembre 2011

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 :(
Messages postés
15814
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
115
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
Messages postés
135
Date d'inscription
dimanche 19 novembre 2000
Statut
Membre
Dernière intervention
2 décembre 2011

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!
Messages postés
15814
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
115
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
Messages postés
135
Date d'inscription
dimanche 19 novembre 2000
Statut
Membre
Dernière intervention
2 décembre 2011

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