Page 1 sur 1

les thread

Publié : mar. 06/juil./2010 13:55
par dayvid
pourquoi quand je crée une fenètre avec des gadget + les boucles qui vont avec
et que je lance sa avec un thread, il se coupe directe alors que la boucle ne doit pas se terminer
je sais que ont peut utiliser waitthread mais c'est pas ce qui me faut car
si faut que le programme principale continue en même temps
je ne comprend vraiment rien la, je suis québlo

Re: les thread

Publié : mar. 06/juil./2010 13:59
par SPH
Donne un code pour voir

Re: les thread

Publié : mar. 06/juil./2010 15:40
par Cls
Pour corriger, il faut comprendre ce que sont les threads. Ce sont des petites routines de ton programme principal, exécutées en parallèle de manière asynchrone (il est possible de les synchroniser via des sémaphores). Les threads permettent d'effectuer des opérations non bloquantes en parallèle les unes des autres.

Ce qu'il faut savoir, c'est que ces threads sont des fils du programme principal : si le programme ayant lancé le thread se termine, le thread se coupe également.

Concrètement voici un petit exexmple :

Code : Tout sélectionner

; Démonstration THREAD
; Auteur : Cls
; Version : 06 Juillet 2010

; Procédère permettant de créer et gérer une nouvelle fenêtre
Procedure CreateChildInterface(value)
  
  Static nbChild : nbChild + 1; Variable commune à tous les threads utilisant cette fonction
  
  windowId = OpenWindow(#PB_Any, 100, 200, 100, 30, "Child : " + Str(nbChild))
  If windowId
    btnFermer = ButtonGadget(#PB_Any, 0, 0, 100, 30, "Fermer enfant "  + Str(nbChild))
  EndIf
  
  Quit.b = #False
  Repeat
  
    Event = WaitWindowEvent()
    Select Event
      Case #PB_Event_CloseWindow : Quit = #True   
      Case #PB_Event_Gadget
        If EventGadget() = btnFermer
          CloseWindow(windowId)
        EndIf
    EndSelect
  Until Quit = #True
  
EndProcedure

; Ouvre l'ecran principal
windowId = OpenWindow(#PB_Any, 100, 100, 200, 30, "Test Thread")
If windowId
  btnAjout = ButtonGadget(#PB_Any, 0, 0, 200, 30, "Ajouter fenêtre enfant")
EndIf

; Boucle des évenement principales
Quit.b = #False
Repeat

  Event = WaitWindowEvent()
  Select Event
      
    Case #PB_Event_CloseWindow : Quit = #True  
    Case #PB_Event_Gadget
      If EventGadget() = btnAjout
        CreateThread(@CreateChildInterface(), 1)
      EndIf
  EndSelect
  
Until Quit = #True
Tu peux ajouter autant de fenêtre enfant que tu le souhaites, chacune est gérée séparément. Par contre, si tu fermes la fenêtre parent, toute les autres fenêtres sont détruites également.

Re: les thread

Publié : jeu. 08/juil./2010 11:13
par dayvid
merci, je vais vous donner des éxemple pour que vous puissiez m'aider :lol:

Re: les thread

Publié : ven. 20/août/2010 15:10
par dayvid
sa sert a quoi des mutex, semaphore etc !

je ne connais rien a sa moi, pourquoi un tread lancer ce termine et avent même d'éxécuter la procedure "procedure name is not a procedure pointeur" ou un truc comme sa quoi

moi je crée une fenêtre et tout ce qui va avec pour la gérer corectement, je met sa dans un thread et quand je le lance, rien, la procedure n'est même pas éxécuter et si elle est sa quitte
alors que la boucle n'est même pas terminer "enfin je croix"

j'ais besoin d'aide pour comprendre comment sa marche et des exemple aussi SVP
je sait utiliser plus ou moins les thread mais c'est loins d'être simple