Page 1 sur 1
Problème avec les thread
Publié : ven. 29/juil./2011 12:43
par dayvid
bonjour
Voilà un exemple concret avec les
thread
4
thread qui tourne ensemble
pas de problème si ce n'est:
Si je met pas: WaitThread(CreateThread(@d(), 0))
le programme se termine de suite
Si quand le programme est en court d'exécution et que je clique
sur le code de l'ide (sur une variable de boucle par exemple), sa bug
Code : Tout sélectionner
Procedure a(a)
For aa = 1 To 10000000
Next
EndProcedure
Procedure b(b)
For bb = 1 To 10000000
Next
EndProcedure
Procedure c(c)
For cc = 1 To 10000000
Next
EndProcedure
Procedure d(d)
For dd = 1 To 10000000
Next
EndProcedure
CreateThread(@a(), 0)
CreateThread(@b(), 0)
CreateThread(@c(), 0)
WaitThread(CreateThread(@d(), 0))
Re: Problème avec les thread
Publié : ven. 29/juil./2011 13:01
par Ar-S
Attention avec les threads, tu peux vite faire foirer ton programme avec...
N'oublie pas que si tu veux balancer une procedure en
thread, tu doit ajouter une valeur bidon.
Procedure.l CurseurFocus(*ARS) dans mon exemple.
Je te renvoie sur ce sujet ou j'ai mis un exemple.
http://www.purebasic.fr/french/viewtopi ... =1&t=12124
Re: Problème avec les thread
Publié : ven. 29/juil./2011 13:04
par dayvid
hum, je voie, en faite tu met un pointeur c'est ça, qu'elle estla différence avec une variable ?
c'est pas ce que j'ai fait pourtant avec les variables ?
Re: Problème avec les thread
Publié : ven. 29/juil./2011 13:10
par GallyHC
Bonjour,
Le seul problème que je vois dans ton prog c'est juste qu'une procedure avec un for vide c très rapide donc en gros ton soft s'arrête parce-qu'il a fini. Voila un exemple plus claire parti de ton exemple.
Code : Tout sélectionner
Procedure a(a)
For aa = 1 To 10000000
Debug "aa " + Str(aa)
Delay(100)
Next
EndProcedure
Procedure b(b)
For bb = 1 To 10000000
Debug "bb " + Str(bb)
Delay(100)
Next
EndProcedure
Procedure c(c)
For cc = 1 To 10000000
Debug "cc " + Str(cc)
Delay(100)
Next
EndProcedure
Procedure d(d)
For dd = 1 To 10000000
Debug "dd " + Str(dd)
Delay(100)
Next
EndProcedure
CreateThread(@a(), 0)
CreateThread(@b(), 0)
CreateThread(@c(), 0)
WaitThread(CreateThread(@d(), 0))
Cordialement,
GallyHC
Re: Problème avec les thread
Publié : ven. 29/juil./2011 13:38
par Ar-S
Voilà un exemple concret.
Y'a peut-être plus simple mais je trouve ça clair.
La procédure ajoute 1 à l'infini.
On lui indique juste de renvoyer au programme l'état du
thread.
Si StopAA = 0 alors le
thread va s'arrêter.
StopAA = 0 sous 2 conditions
1) - Si on clique sur le bouton
2) - Si aa = 100
je peux pas faire plus clair.
Code : Tout sélectionner
; by Ar-S / 2011
; exemple de Thread avec
; Activation / arrêt via le même bouton
Enumeration
#Window_0
EndEnumeration
Enumeration
#BT
#Affiche
EndEnumeration
aa = 1 ; On initialise aa à 1
StopAA = 0 ; L'indicateur StopAA = 0 ce qui signifie que le thread n'est pas actif
Procedure.l a(*a)
Shared aa,StopAA
Repeat ; On répète l'opération jusqu'à ce que aa = 100 OU que StopAA = 0
SetGadgetText(#Affiche,Str(aa))
If aa = 100
SetGadgetText(#Affiche,"aa = " + Str(aa) + " ! Je renvoie StopAA = 1")
StopAA = 0
EndIf
Delay(50)
aa + 1
Until StopAA = 0
EndProcedure
If OpenWindow(#Window_0, 454, 216, 301, 82, "Thread", #PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_MinimizeGadget|#PB_Window_TitleBar)
If CreateGadgetList(WindowID(#Window_0))
ButtonGadget(#BT, 5, 5, 290, 45, "GO")
StringGadget(#Affiche, 10, 55, 280, 20, "", #PB_String_ReadOnly)
EndIf
Repeat
Select WaitWindowEvent()
Case #PB_Event_Gadget
Select EventGadget()
Case #BT
; Si tu souhaites que le thread recompte à partir de 1
; tu réinitialises la valeur de aa
aa = 1
; on vérifie l'état de StopAA
If StopAA = 0
StopAA + 1 ; Etat Activé
SetGadgetText(#BT,"Clique pour arrêter (et tuer) le thread")
Else
StopAA = 0 ; Etat Désactivé
SetGadgetText(#BT,"GO")
EndIf
; Le thread se lance SI StopAA = 1
If StopAA = 1
thread = CreateThread(@a(),123)
Else ; Sinon on arrête le Thread (avec une petite vérif Isthread qui peut pas faire de mal)
If IsThread(thread)
KillThread(thread)
EndIf
EndIf
EndSelect
Case #PB_Event_CloseWindow
Select EventWindow()
Case #Window_0
If IsThread(thread)
KillThread(thread)
EndIf
CloseWindow(#Window_0)
Break
EndSelect
EndSelect
ForEver
EndIf
Re: Problème avec les thread
Publié : ven. 29/juil./2011 14:17
par dayvid
Merci a vous les gars

Re: Problème avec les thread
Publié : ven. 02/sept./2011 23:30
par Ar-S
Un exemple que j'ai mis
ICI
qui se rapproche plus de ton code.
Code : Tout sélectionner
Global.l aa,bb,cc,dd
Procedure a(a)
aa = 1
Repeat
Debug "aa = " + Str(aa)
Delay(90)
aa + 1
Until aa = 10
ProcedureReturn aa
EndProcedure
Procedure b(b)
bb = 1
Repeat
Debug "bb = " + Str(bb)
Delay(95)
bb + 1
Until bb = 10
ProcedureReturn bb
EndProcedure
Procedure c(c)
cc = 1
Repeat
Debug "cc = " + Str(cc)
Delay(98)
cc + 1
Until cc = 10
ProcedureReturn cc
EndProcedure
Procedure d(d)
dd = 1
Repeat
Debug "dd = " + Str(dd)
Delay(100)
dd + 1
Until dd = 10
ProcedureReturn dd
EndProcedure
Ta = CreateThread(@a(), a)
Tb = CreateThread(@b(), b)
Tc = CreateThread(@c(), c)
Td = CreateThread(@d(), d)
If Ta
If Tb
If Tc
If Td
WaitThread(Td)
Debug aa
Debug bb
Debug cc
Debug dd
EndIf
EndIf
EndIf
EndIf