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 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
| Private Threadid As Long 'Id du Thread Non-utilisé
Private WithEvents ThreadForm As Form 'Formulaire fournissant le timer
Private ProgressBar As clProgress 'Objet Barre de progression
Private ThreadProc As String 'Nom de la fonction à appeler
Private ThreadParam As Variant 'Adresse des paramètres propre à la fonction
Private Iteration As Long 'Nombre d'itération effectués
Private Loops As Long 'Nombre total d'itérations à effectuer
Private Token As Boolean 'Jeton autorisant l'éxécution de la tâche
Public Event Started() 'Evénement Démarré - Non utilisé
Public Event Canceled()'Evénement Annulé - Non utilisé
Public Event Asleep() 'Evénement Endormi
Public Event Complete() 'Evénement Terminé
Private Sub Class_Initialize()
Set ThreadForm = New Form_FormThread
ThreadForm.OnTimer = "[Event procedure]"
End Sub
'Le Timer sert à mettre fin à l'éxécution de la procédure RunThread
'Redonne la main au programme appelant, le gestionnaire de la boucle
'On peut aussi lever un événement permettant à l'objet parent
'de passer la main au Thread suivant dans la boucle
Private Sub ThreadForm_Timer()
Token = False
ThreadForm.TimerInterval = 0
RaiseEvent Asleep
End Sub
'Initialisation de la tâche
'Si la fonction contenue dans ThreadProc renvoie False le Thread ne sera pas ajouté à la boucle de traitement
Public Function Init(ProcedureName As String, lParam As Variant) As Boolean
Init = False
If ProcedureName = "" Then Exit Function
ThreadProc = ProcedureName
ThreadParam = lParam
'Initialisation de la tâche permier appel à la fonction
If Run(ThreadProc, acLBInitialize, ThreadParam) = 0 Then Exit Function
'Ouverture de la tâche
If Run(ThreadProc, acLBOpen, ThreadParam) = 0 Then Exit Function
'Récupération du nombre total d'itérations
Loops = Run(ThreadProc, acLBGetRowCount, ThreadParam)
If Loops <= 0 Then Exit Function
'Chargement de l'objet ClProgress
Set ProgressBar = New clProgress
ProgressBar.Modal = False
ProgressBar.AnimationTimer = 250
ProgressBar.GeneralInfo = "Veuillez patienter durant le traitement..."
ProgressBar.ProgressMin = 1
Iteration = 1
ProgressBar.ProgressMax = Loops
ProgressBar.ProgressPercent = 0
ProgressBar.Visible = True
Init = True
End Function
'Boucle de Traitement de la tâche
Public Sub RunThread(Duration As Long)
Dim OldPercent As Single
Token = True
ThreadForm.TimerInterval = Duration
While Token = True And Iteration < Loops
'Exécute la tâche et attend en retour le nombre d'itération exécuté
Iteration = Run(ThreadProc, acLBGetValue, ThreadParam)
'Mise à jour de la barre de progression
ProgressBar.ProgressPercent = Iteration / ProgressBar.ProgressMax
'Temporisation via un test pour limiter la fréquence des DoEvents
'En retirant le test on récupére en occupation CPU,
'la tâche mettra nettement plus de temps pour se terminer
If ProgressBar.ProgressPercent > OldPercent + 0.01 Then
ProgressBar.ProgressInfo = Run(ThreadProc, acLBGetPrompt, ThreadParam) & FormatPercent(ProgressBar.ProgressPercent, 0)
OldPercent = ProgressBar.ProgressPercent
ProgressBar.Repaint
DoEvents
End If
Wend
'Vérifie que la tâche est bien fini
'si retour ThreadProc = True alors lever l'événement Complete
If Run(ThreadProc, acLBEnd, ThreadParam) = True Then
Set ProgressBar = Nothing
RaiseEvent Complete
End If
End Sub |
Partager