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 :!: