Problème avec les thread

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
dayvid
Messages : 1242
Inscription : mer. 11/nov./2009 18:17
Localisation : Poitiers (Vienne)

Problème avec les thread

Message 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))
La vie, C'est comme, Une boitte, De startis, On en voie, De toutes, Les couleurs !

Mon forum http://purebasic.forumphp3.com/index.php
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Problème avec les thread

Message 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
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
dayvid
Messages : 1242
Inscription : mer. 11/nov./2009 18:17
Localisation : Poitiers (Vienne)

Re: Problème avec les thread

Message 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 ?
La vie, C'est comme, Une boitte, De startis, On en voie, De toutes, Les couleurs !

Mon forum http://purebasic.forumphp3.com/index.php
Avatar de l’utilisateur
GallyHC
Messages : 1708
Inscription : lun. 17/déc./2007 12:44

Re: Problème avec les thread

Message 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
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Problème avec les thread

Message 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
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
dayvid
Messages : 1242
Inscription : mer. 11/nov./2009 18:17
Localisation : Poitiers (Vienne)

Re: Problème avec les thread

Message par dayvid »

Merci a vous les gars :P
La vie, C'est comme, Une boitte, De startis, On en voie, De toutes, Les couleurs !

Mon forum http://purebasic.forumphp3.com/index.php
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Problème avec les thread

Message 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

~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Répondre