Il serais vraiment très intéressant de faire un bon gros tuto
sur les thread car c'est galère je trouve avec PB

Code : Tout sélectionner
Procedure MyProcedure()
For n = 1 To 100000
If IsGadget(0)
SetGadgetText(0, Str(n))
EndIf
Next
EndProcedure
OpenWindow(0, 0, 0, 500, 500, "Thread")
StringGadget(0, 20, 20, 50, 20, "")
MyProcedure()
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
End
EndSelect
ForEver
Code : Tout sélectionner
Procedure MyProcedure(*Value)
For n = 1 To 100000
If IsGadget(0)
SetGadgetText(0, Str(n))
EndIf
Next
EndProcedure
OpenWindow(0, 0, 0, 500, 500, "Thread")
StringGadget(0, 20, 20, 50, 20, "")
CreateThread(@MyProcedure(), 100)
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
End
EndSelect
ForEver
Code : Tout sélectionner
Procedure MyProcedure()
Static n
n + 1
SetGadgetText(0, Str(n))
EndProcedure
OpenWindow(0, 0, 0, 500, 500, "Un timer peut être plus simple")
StringGadget(0, 20, 20, 50, 20, "")
AddWindowTimer(0, 1, 10)
Repeat
Select WaitWindowEvent()
Case #PB_Event_Timer
MyProcedure()
Case #PB_Event_CloseWindow
End
EndSelect
ForEver
Je ne poste pas souvent, mais je lis tous les messages et j'y apprend beaucoup.Dans les paramétres de compilation, vous devez cocher la case Activer la gestion des Threads
Code : Tout sélectionner
Global DureeSec = 10
Procedure TimerEvent()
DureeSec -1
SetGadgetText (1,"BOUGE LA FENETRE " + Str(DureeSec))
PlaySound(10)
If DureeSec <= 0
SetGadgetText (1,"TERMINE")
StopSound(10)
EndIf
EndProcedure
If OpenWindow(0, 0, 0, 220, 121, "Minuteur", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
ButtonGadget (1, 1, 60, 218, 30, "BOUGE LA FENETRE ")
AddWindowTimer(0,3,1000)
BindEvent(#PB_Event_Timer, @TimerEvent()) ; Le BindEvent te permet de déplacer ta fenêtre tout en maintenant le compteur,
EndIf
Repeat
Event = WaitWindowEvent()
Until Event = #PB_Event_CloseWindow
; En bonus on libère les ressources ;)
FreeSound(10)
UnbindEvent(#PB_Event_Timer, @TimerEvent())
Code : Tout sélectionner
Procedure Teste(value)
Repeat
ForEver
EndProcedure
OpenWindow(0,0,0,800,600,"teste",#PB_Window_SystemMenu)
CreateThread(@Teste(),1)
Repeat
event=WaitWindowEvent()
Until event=#PB_Event_CloseWindow
Code : Tout sélectionner
Procedure Teste(value)
Repeat
Delay(1)
ForEver
EndProcedure
OpenWindow(0,0,0,800,600,"teste",#PB_Window_SystemMenu)
CreateThread(@Teste(),1)
Repeat
event=WaitWindowEvent()
Until event=#PB_Event_CloseWindow
Le mien de conseil et de ne pas utiliser de Delay(). Delay() or not Delay(), il y a eu plusieurs débats sur ce sujet. Je ne ne reviendrais pas dessus.microdevweb a écrit :Petit conseille, placez un Delay dans la boucle d'un thread
Une boucle Repeat ... ForEver sans aucune instruction à l'intérieur va pénaliser le processeur.microdevweb a écrit :Première exemple sans delay, le processeur est occupé à 25%
Code : Tout sélectionner
Procedure Teste(value)
Repeat
Debug "passe"
ForEver
EndProcedure
OpenWindow(0,0,0,800,600,"teste",#PB_Window_SystemMenu)
CreateThread(@Teste(),1)
Repeat
event=WaitWindowEvent(1)
Until event=#PB_Event_CloseWindow
Code : Tout sélectionner
Global X
Procedure Teste(value)
Repeat
; Delay(1)
X+1
If X>1000
X=0
EndIf
ForEver
EndProcedure
Code : Tout sélectionner
Global X
Procedure Teste(value)
Repeat
Delay(1)
X+1
If X>1000
X=0
EndIf
ForEver
EndProcedure
OpenWindow(0,0,0,800,600,"teste",#PB_Window_SystemMenu)
CreateThread(@Teste(),1)
Repeat
event=WaitWindowEvent(1)
Until event=#PB_Event_CloseWindow