Page 1 sur 1
Parametre passé au Thread
Publié : lun. 27/août/2012 6:53
par SPH
Salut,
La notice sur les thread est vague en ce qui concerne le parametre passé :
L'argument '*Valeur' de CreateThread() est passé comme argument de la procédure appelée. Il est très important de ne pas modifier le nombre de paramètre de cette procédure, qui doit toujours rester à 1.
Dans un exemple, le parametre passé est 154 et pas 1 :
CreateThread(@NetworkThread(), 154)
Alors, que mettre en parametre ?
Re: Parametre passé au Thread
Publié : lun. 27/août/2012 7:29
par PAPIPP
Bonjour SPH
Comme il n'y a qu'un seul paramètre On peut passer une adresse de données
ayant une structure aussi complexe que l'on veut
A+
Re: Parametre passé au Thread
Publié : lun. 27/août/2012 7:33
par SPH
PAPIPP a écrit :Bonjour SPH
Comme il n'y a qu'un seul paramètre On peut passer une adresse de données
ayant une structure aussi complexe que l'on veut
A+
Je n'ai RIEN compris !
Re: Parametre passé au Thread
Publié : lun. 27/août/2012 8:12
par Fred
Il est très important de ne pas modifier le nombre de paramètre
Re: Parametre passé au Thread
Publié : lun. 27/août/2012 8:21
par G-Rom
SPH a écrit :PAPIPP a écrit :Bonjour SPH
Comme il n'y a qu'un seul paramètre On peut passer une adresse de données
ayant une structure aussi complexe que l'on veut
A+
Je n'ai RIEN compris !
Code : Tout sélectionner
Structure mesDonnees
a.s
b.s
c.s
d.i
ect.i
EndStructure
Procedure monThread(*ptr.mesDonnees)
*ptr\ect = ElapsedMilliseconds() + 2500
*ptr\d = 0
PrintN( "Debut du thread" )
Repeat
If *ptr\ect < ElapsedMilliseconds()
*ptr\d = 1
EndIf
Until *ptr\d = 1
PrintN("Fin du thread")
EndProcedure
OpenConsole()
*pointeur.mesDonnees = AllocateMemory(SizeOf(mesDonnees))
CreateThread(@monThread(), *pointeur)
Repeat
ForEver
Re: Parametre passé au Thread
Publié : lun. 27/août/2012 8:27
par falsam
J'en ajoute une couche

-Un exemple avec un seul paramètre.
-Un exemple avec deux paramètres à travers l’utilisation d'une structure.
Exemple classique d'un thread avec un seul paramétre.
Code : Tout sélectionner
Enumeration
#Mainform
#Buffer
EndEnumeration
Define.l Event
Global WindowStyle.i=#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_ScreenCentered|#PB_Window_SizeGadget
Procedure MyThread(Value)
Protected N.i
While N<>100000
N+1
SetGadgetText(#Buffer, Str(N))
Wend
EndProcedure
Procedure Open_MainForm()
OpenWindow(#Mainform, 0, 0, 500, 400, "New Form", WindowStyle)
StringGadget(#Buffer, 20, 20, 100, 20, "")
EndProcedure
;Ouverture de la fenetre
Open_MainForm()
;Lancement du thread
CreateThread(@MyThread(), 0)
Repeat
Event = WaitWindowEvent(10)
Select Event
Case #PB_Event_CloseWindow
End
EndSelect
ForEver
Si tu souhaites passer plusieurs paramètres tu peux utiliser une structure. Je vais reprendre l'exemple précédent en indiquant au thread que le début de la boucle commence à 1000 pour se terminer à 15000.
Code : Tout sélectionner
Enumeration
#Mainform
#Buffer
EndEnumeration
Define.l Event
Global WindowStyle.i=#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_ScreenCentered|#PB_Window_SizeGadget
Structure Condition
Minimum.i
Maximum.i
EndStructure
Procedure MyThread(*Value.Condition)
Protected N.i
N=*Value\Minimum
While N<>*value\Maximum
N+1
SetGadgetText(#Buffer, Str(N))
Wend
ClearStructure(*Value, Condition)
EndProcedure
Procedure Open_MainForm()
OpenWindow(#Mainform, 0, 0, 500, 400, "New Form", WindowStyle)
StringGadget(#Buffer, 20, 20, 100, 20, "")
EndProcedure
;Ouverture de la fenetre
Open_MainForm()
;Lancement du thread
Parameter.Condition
Parameter\Minimum = 1000
Parameter\Maximum = 15000
CreateThread(@MyThread(), Parameter)
Repeat
Event = WaitWindowEvent(10)
Select Event
Case #PB_Event_CloseWindow
End
EndSelect
ForEver
Re: Parametre passé au Thread
Publié : lun. 27/août/2012 9:41
par SPH
Fred a écrit :Il est très important de ne pas modifier le nombre de paramètre
Merci pour vos exemple et pour la reponse de Fred.
J'utilise un thread a un parametre pour faire un serveur :
Code : Tout sélectionner
Procedure NetworkThread(Parameter)
Port = 6832
len=5000
*Buffer = AllocateMemory(len)
If CreateNetworkServer(0, Port)
Repeat
SEvent = NetworkServerEvent()
If SEvent
ClientID = EventClient()
Select SEvent
Case 1
;PrintN("Connected...")
Case 2
ReceiveNetworkData(ClientID, *Buffer, len)
reponse$=(PeekS(*Buffer))
Repeat
a$=Left(reponse$,80)
ConsoleColor(12,0)
PrintN(a$)
reponse$=Mid(reponse$,81,Len(reponse$)-80)
Until reponse$=""
*Buffer = AllocateMemory(len)
Case 4
;PrintN("...Disconnected")
EndSelect
EndIf
ForEver
;Until Quit = 1
CloseNetworkServer(0)
Else
MessageRequester("Error", "Can't create the server (port in use ?).", 0)
EndIf
End
EndProcedure
Tout cela ne me dis pas quel nombre passé en parametre je dois mettre ! (0?)
Re: Parametre passé au Thread
Publié : lun. 27/août/2012 9:49
par falsam
SPH a écrit :Tout cela ne me dis pas quel nombre passé en parametre je dois mettre ! (0?)
0 ou n'importe quel chiffre. Ça n'a aucune importance.
Code : Tout sélectionner
Procedure VotreProcedure(*Valeur)
; La variable '*Valeur' contiendra 23
EndProcedure
CreateThread(@VotreProcedure(), 23)
Re: Parametre passé au Thread
Publié : lun. 27/août/2012 10:16
par SPH
falsam a écrit :SPH a écrit :Tout cela ne me dis pas quel nombre passé en parametre je dois mettre ! (0?)
0 ou n'importe quel chiffre. Ça n'a aucune importance.
Code : Tout sélectionner
Procedure VotreProcedure(*Valeur)
; La variable '*Valeur' contiendra 23
EndProcedure
CreateThread(@VotreProcedure(), 23)
Haaaaaaaaaaa okkkkkkkkkkk, je comprend : on passe une valeur en parametre au cas ou on l'utilisait dans la procedure, c'est ca ?
Mais comme je n'utilise pas le parametre, je peux mettre n'importe quoi !
Re: Parametre passé au Thread
Publié : lun. 27/août/2012 10:51
par Backup
oui ,
perso je passe le pointeur appelé *Bidon
Code : Tout sélectionner
Procedure VotreProcedure(*bidon)
; La variable '*bidon' contiendra 0
EndProcedure
CreateThread(@VotreProcedure(), *bidon)
Re: Parametre passé au Thread
Publié : lun. 27/août/2012 11:30
par G-Rom
Dobro a écrit :oui ,
perso je passe le pointeur appelé *Bidon
Code : Tout sélectionner
Procedure VotreProcedure(*bidon)
; La variable '*bidon' contiendra 0
EndProcedure
CreateThread(@VotreProcedure(), *bidon)
autant faire :
CreateThread(@VotreProcedure(), #NULL)
Re: Parametre passé au Thread
Publié : lun. 27/août/2012 11:52
par SPH
G-Rom a écrit :
autant faire :
CreateThread(@VotreProcedure(), #NULL)
Pas faux
