Propose idée tuto - Thread

Sujets variés concernant le développement en PureBasic
Shadow
Messages : 1413
Inscription : mer. 04/nov./2015 17:39

Propose idée tuto - Thread

Message par Shadow »

Salut,

Il serais vraiment très intéressant de faire un bon gros tuto
sur les thread car c'est galère je trouve avec PB :)
Processeur: Intel Core I7-4790 - 4 Cœurs - 8 Thread: 3.60 Ghz.
Ram: 32 GB.
Disque: C: SDD 250 GB, D: 3 TB.
Vidéo: NVIDIA GeForce GTX 960: 2 GB DDR5.
Écran: Asus VX248 24 Pouces: 1920 x 1080.
Système: Windows 7 64 Bits.

PureBasic: 5.60 x64 Bits.
GG
Messages : 239
Inscription : jeu. 09/déc./2004 12:23

Re: Propose idée tuto - Thread

Message par GG »

+1, ça peut m'intéresser, je ne suis pas expert en la matière.
PureBasic 6.03 - Windows 11 22H2 (64 bits)
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Propose idée tuto - Thread

Message par falsam »

Un thread consiste à lancer une tache en arrière plan tout en permettant à l’application principale de fonctionner.

Exemple ce code sans thread.

Code : Tout sélectionner

Procedure MyProcedure()
  For n = 1 To 100000
    If IsGadget(0)      
      SetGadgetText(0, Str(n))
    EndIf
  Next 
EndProcedure

OpenWindow(0, 0, 0, 500, 500, "Thread")
StringGadget(0, 20, 20, 50, 20, "") 

MyProcedure()

Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      End
  EndSelect 
ForEver
Freeze Assuré.
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
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Propose idée tuto - Thread

Message par falsam »

Alors comment faire ? En utilisant un thread. C'est à dire faire éxécuter la procédure MyProcedure() en arrière plan avec l'instruction CreateThread()

Code : Tout sélectionner

Procedure MyProcedure(*Value)
  For n = 1 To 100000
    If IsGadget(0)      
      SetGadgetText(0, Str(n))
    EndIf
  Next 
EndProcedure

OpenWindow(0, 0, 0, 500, 500, "Thread")
StringGadget(0, 20, 20, 50, 20, "") 

CreateThread(@MyProcedure(), 100)

Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      End
  EndSelect 
ForEver
Dans les paramétres de compilation, vous devez cocher la case Activer la gestion des Threads

■ CreateThread(@MyProcedure(), 100)
-Le premier paramètre est un pointeur sur la procédure MyProcedure().
-Le second paramètre est un numéro de Thread qui sera mémorisé dans la variable *Value de la procédure MyProcedure(). La valeur 100 est un exemple. Vous mettez ce que vous voulez.
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
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Propose idée tuto - Thread

Message par falsam »

Dans cet exemple un timer aurait suffit.

Code : Tout sélectionner

Procedure MyProcedure()
  Static n
  n + 1 
  SetGadgetText(0, Str(n))
EndProcedure

OpenWindow(0, 0, 0, 500, 500, "Un timer peut être plus simple")

StringGadget(0, 20, 20, 50, 20, "") 
AddWindowTimer(0, 1, 10)

Repeat
  Select WaitWindowEvent()
    Case #PB_Event_Timer
      MyProcedure()
      
    Case #PB_Event_CloseWindow
      End
  EndSelect 
ForEver
■ AddWindowTimer(0, 1, 10) On ajoute le timer 1 de 10 ms à la fenêtre 0
■ Case #PB_Event_Timer l’événement est détectée et exécute la procédure MyProcedure().

En règle générale (ce n'est que mon opinion) préférer un timer, c'est plus simple à gérer et je crois plus stable.
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
cage
Messages : 604
Inscription : ven. 16/oct./2015 18:22
Localisation : France
Contact :

Re: Propose idée tuto - Thread

Message par cage »

Bonjour a tous,

J'étais fan des Timers car venant de VB, les Timers étaient gérés en 'temps réel' et rien ne pouvait les bloquer.

Dans PB, j'ai vraiment été déçu car les Timers se bloquent dés que l'on fait une action.

Dans l'exemple donné avec le timer, cliquez juste sur la barre de titre et le compteur s’arrête.

Dés que j'ai découvert les Threads dans PB, j'ai remplacé toutes mes gestions Timer par des Threads.

Et comme le dit falsam
Dans les paramétres de compilation, vous devez cocher la case Activer la gestion des Threads
Je ne poste pas souvent, mais je lis tous les messages et j'y apprend beaucoup.
Merci a vous tous.
Gérard
■ Win10 Pro 64-bit (Intel Celeron CPU N2920 @ 1.86GHz, 4,0GB RAM, Intel HD Graphics) & PB 6.12 LTS
■ Vivre et laisser vivre.
■ PureBasic pour le fun
■ Gérard sur le forum Anglais
■ Mes sites: http://pbcage.free.fr - http://yh.toolbox.free.fr
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Propose idée tuto - Thread

Message par Ar-S »

@Cage,
Ce soucis de freeze n'a plus lieu via BindEvent(#PB_Event_Timer, @TimerEvent())

Code : Tout sélectionner

Global DureeSec = 10

Procedure TimerEvent()
  DureeSec -1
  SetGadgetText (1,"BOUGE LA FENETRE " + Str(DureeSec))
  PlaySound(10)
  
  If DureeSec <= 0
    SetGadgetText (1,"TERMINE")
    StopSound(10)
  EndIf
EndProcedure

If OpenWindow(0, 0, 0, 220, 121, "Minuteur", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  ButtonGadget  (1, 1, 60, 218, 30, "BOUGE LA FENETRE ")
  AddWindowTimer(0,3,1000)
  BindEvent(#PB_Event_Timer, @TimerEvent()) ; Le BindEvent te permet de déplacer ta fenêtre tout en maintenant le compteur, 
EndIf

Repeat
  Event = WaitWindowEvent()
Until Event = #PB_Event_CloseWindow
; En bonus on libère les ressources ;)
FreeSound(10)
UnbindEvent(#PB_Event_Timer, @TimerEvent())

~~~~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
Avatar de l’utilisateur
microdevweb
Messages : 1802
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: Propose idée tuto - Thread

Message par microdevweb »

Petit conseille, placez un Delay dans la boucle d'un thread

Première exemple sans delay, le processeur est occupé à 25%

Code : Tout sélectionner

Procedure Teste(value)
    Repeat
        
    ForEver 
EndProcedure
OpenWindow(0,0,0,800,600,"teste",#PB_Window_SystemMenu)
CreateThread(@Teste(),1)
Repeat
    event=WaitWindowEvent()    
Until event=#PB_Event_CloseWindow
Deuxième exemple avec delay, le processeur est occupé à 0%

Code : Tout sélectionner

Procedure Teste(value)
    Repeat
        Delay(1)
    ForEver 
EndProcedure
OpenWindow(0,0,0,800,600,"teste",#PB_Window_SystemMenu)
CreateThread(@Teste(),1)
Repeat
    event=WaitWindowEvent()    
Until event=#PB_Event_CloseWindow
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Propose idée tuto - Thread

Message par falsam »

microdevweb a écrit :Petit conseille, placez un Delay dans la boucle d'un thread
Le mien de conseil et de ne pas utiliser de Delay(). Delay() or not Delay(), il y a eu plusieurs débats sur ce sujet. Je ne ne reviendrais pas dessus.
microdevweb a écrit :Première exemple sans delay, le processeur est occupé à 25%
Une boucle Repeat ... ForEver sans aucune instruction à l'intérieur va pénaliser le processeur.

Reprenons ce premier exemple et plaçons un debug "passe" dans la boucle.

Code : Tout sélectionner

Procedure Teste(value)
  Repeat
    Debug "passe"   
  ForEver 
EndProcedure

OpenWindow(0,0,0,800,600,"teste",#PB_Window_SystemMenu)
CreateThread(@Teste(),1)

Repeat
  event=WaitWindowEvent(1)    
Until event=#PB_Event_CloseWindow
L'occupation processeur est de presque 0%. Ne pas oublier non plus de cocher la case Activer la gestion des threads dans les options de compilation.
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
microdevweb
Messages : 1802
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: Propose idée tuto - Thread

Message par microdevweb »

Et bien voici un autre teste

Sans Delay

Code : Tout sélectionner

Global X
Procedure Teste(value)
    Repeat
;         Delay(1)
      X+1
      If X>1000
          X=0
      EndIf
  ForEver 
EndProcedure
Image

Avec Delay

Code : Tout sélectionner

Global X
Procedure Teste(value)
    Repeat
        Delay(1)
      X+1
      If X>1000
          X=0
      EndIf
  ForEver 
EndProcedure

OpenWindow(0,0,0,800,600,"teste",#PB_Window_SystemMenu)
CreateThread(@Teste(),1)

Repeat
  event=WaitWindowEvent(1)    
Until event=#PB_Event_CloseWindow
Image

Alors faites comme vous le désiré, moi je place un Delay :wink:
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Répondre