Parametre passé au Thread

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
SPH
Messages : 4947
Inscription : mer. 09/nov./2005 9:53

Parametre passé au Thread

Message 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 ?

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
PAPIPP
Messages : 534
Inscription : sam. 23/févr./2008 17:58

Re: Parametre passé au Thread

Message 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+
Il est fort peu probable que les mêmes causes ne produisent pas les mêmes effets.(Einstein)
Et en logique positive cela donne.
Il est très fortement probable que les mêmes causes produisent les mêmes effets.
Avatar de l’utilisateur
SPH
Messages : 4947
Inscription : mer. 09/nov./2005 9:53

Re: Parametre passé au Thread

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

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
Fred
Site Admin
Messages : 2809
Inscription : mer. 21/janv./2004 11:03

Re: Parametre passé au Thread

Message par Fred »

Il est très important de ne pas modifier le nombre de paramètre
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: Parametre passé au Thread

Message 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
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Parametre passé au Thread

Message 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
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
SPH
Messages : 4947
Inscription : mer. 09/nov./2005 9:53

Re: Parametre passé au Thread

Message 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?)

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Parametre passé au Thread

Message 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)
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
SPH
Messages : 4947
Inscription : mer. 09/nov./2005 9:53

Re: Parametre passé au Thread

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

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Parametre passé au Thread

Message 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)
 
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: Parametre passé au Thread

Message 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)
Avatar de l’utilisateur
SPH
Messages : 4947
Inscription : mer. 09/nov./2005 9:53

Re: Parametre passé au Thread

Message par SPH »

G-Rom a écrit : autant faire :
CreateThread(@VotreProcedure(), #NULL)
Pas faux :!:

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
Répondre