Les threads permettent à un programme d'effectuer plusieurs opérations en même temps (Presque en même temps). Cela devient utile lorsque celui-ci doit effectuer une tâche relativement longue et que vous voulez tout de même permettre à l'utilisateur d'agir sur le programme.
A titre d'exemple
Je code une fenetre (#MainForm)
avec un bouton (#StartStop ) qui a un rôle d’interrupteur
qui lance une procédure(Count()) contenant une boucle. Durant cette boucle on teste l'état On/Off du bouton pour stopper ou pas la procédure.
Sans gestion de thread, si je clique sur le bouton qui lance la procédure, je suis obligé d'attendre la fin de la boucle car je ne peux plus intervenir sur le bouton poru stopper cette procédure.
Code : Tout sélectionner
Enumeration
#MainForm
#StartStop
#Result
EndEnumeration
Procedure Count()
For i=0 To 10000
SetGadgetText(#Result, "Compteur = "+Str(i))
If GetGadgetData(#StartStop)=#False
Break
EndIf
Next i
EndProcedure
Procedure MainFormShow()
OpenWindow(#MainForm,0,0,300,200,"Exemple sans Thread",#PB_Window_ScreenCentered | #PB_Window_SystemMenu)
TextGadget(#Result, 20 ,30, 120, 20, "Compteur = 0")
ButtonGadget(#StartStop, 200, 25, 70, 20, "Start/Stop")
EndProcedure
MainFormShow()
Repeat
Select WaitWindowEvent()
Case #PB_Event_Gadget
Select EventGadget()
Case #StartStop
If GetGadgetData(#StartStop)=#False
SetGadgetData(#StartStop, #True) ;Indiquer au bouton qu'il est actif
Count()
Else
SetGadgetData(#StartStop, #False) ;Indique au bouton qu'il est plus actif
EndIf
EndSelect
Case #PB_Event_CloseWindow
End
EndSelect
ForEver
Je vais lancer la procédure Count en parallèle à l’exécution du programme principale.
je remplace Count() par CreateThread(@Count(), 0)
Code : Tout sélectionner
Enumeration
#MainForm
#StartStop
#Result
EndEnumeration
Procedure Count(*Value)
For i=0 To 10000
SetGadgetText(#Result, "Compteur = "+Str(i))
If GetGadgetData(#StartStop)=#False
Break
EndIf
Next i
EndProcedure
Procedure MainFormShow()
OpenWindow(#MainForm,0,0,300,200,"Exemple avec Thread",#PB_Window_ScreenCentered | #PB_Window_SystemMenu)
TextGadget(#Result, 20 ,30, 120, 20, "Compteur = 0")
ButtonGadget(#StartStop, 200, 25, 70, 20, "Start/Stop")
EndProcedure
MainFormShow()
Repeat
Select WaitWindowEvent()
Case #PB_Event_Gadget
Select EventGadget()
Case #StartStop
If GetGadgetData(#StartStop)=#False
SetGadgetData(#StartStop, #True) ;Indiquer au bouton qu'il est actif
CreateThread(@Count(), 0)
Else
SetGadgetData(#StartStop, #False)
EndIf
EndSelect
Case #PB_Event_CloseWindow
End
EndSelect
ForEver