incomprehension avec les threads

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
supercdfr
Messages : 105
Inscription : sam. 21/juil./2007 15:16

incomprehension avec les threads

Message par supercdfr »

Voici un code de test pour les thread qui me pose d'enormes soucis :

Code : Tout sélectionner

Enumeration
  #window_0
  #windows_chargement
  #Text_30
  #ProgressBar_chargement
  #ProgressCircle
  #Font_Text_0
EndEnumeration

Global bureau_x.l
Global bureau_y.l
Global test_thread.l
Global i.l = 0

Procedure SetProgressCircleState(progressbar.l,segments.l, State.l, color.l, bg.l)
  Static progCirc_font.l
  Protected IW2.l,TW2.l,TH2.l,x.l,y.l,sp_to_clear.l
  Protected img.l = GetGadgetData(progressbar)
  Protected beta_in_rad.d
  StartDrawing(ImageOutput(img))
    IW2.l = ImageWidth(img)/2
    State - 1
    beta_in_rad.d = (2*#PI*State)/segments - #PI/2
    x = IW2 + (IW2 - 4)*Cos(beta_in_rad)
    y = IW2 + (IW2 - 4)*Sin(beta_in_rad)
    If State < segments/4
      x + 2
      y + 2
    ElseIf State < segments/2
      x - 2
      y + 2
    ElseIf State < 3*segments/4
      x - 2
      y - 2
    Else
      x + 2
      y - 2
    EndIf
    FillArea(x,y,bg,color)
  StopDrawing()
  SetGadgetState(progressbar,ImageID(img))
  ProcedureReturn 1
EndProcedure

Procedure ProgressCircle(gadgetNumber.l,x.l,y.l,Size.l,segments.l,bg.l)
  Protected radius.l,n.l,x2.l,y2.l,img.l, beta_in_rad.d
  img = CreateImage(#PB_Any,Size,Size)
  StartDrawing(ImageOutput(img))
    Box(0,0,Size,Size,bg)
    radius = Size/2
    Circle(radius,radius,radius)
    Circle(radius,radius,radius-8,bg)   
    For n = 0 To segments-1
      beta_in_rad = (2*#PI*n)/segments
      x2.l = radius *(1 + Cos(beta_in_rad))
      y2.l = radius *(1 + Sin(beta_in_rad))
      LineXY(radius,radius,x2,y2,bg)
    Next
  StopDrawing()
  ImageGadget(gadgetNumber,x,y,Size,Size,ImageID(img))
  SetGadgetData(gadgetNumber, img)
EndProcedure

Procedure OpenWindow_windows_chargement()
  OpenWindow(#Window_0, 0, 0, 0, 0, "", #PB_Window_BorderLess|#PB_Window_Invisible) ; fenetre fictive
  
  OpenWindow(#windows_chargement, (bureau_x - 420)/2, (bureau_y - 135)/2, 420, 135, "test", 0)
  UseGadgetList(WindowID(#windows_chargement))
  TextGadget(#Text_30, 75, 5, 345, 55, "")
  ProgressBarGadget(#ProgressBar_chargement, 10, 95, 400, 30, 0, 100, #PB_ProgressBar_Smooth)
  SetGadgetFont(#Text_30, LoadFont(#Font_Text_0, "Microsoft Sans Serif", 16, 272))
  ProgressCircle(#ProgressCircle,5,5,55,8,RGB(210,210,210))
EndProcedure
 
Procedure fenetre_theader(*type)
  r=10
  g=150
  b=10
  Repeat
    SetProgressCircleState(#ProgressCircle,8,m_circle,RGB(r, g, b),RGB(210,210,210) )
    m_circle+1
    If m_circle >= 9
      m_circle=1
      r+20
      g+25
      b+10
      If g>240
        r=10
        g=150
        b=10
      EndIf
    EndIf
    Delay(50)
  ForEver
EndProcedure

Procedure test()
  SetGadgetText(#Text_30,Str(i))
EndProcedure

ExamineDesktops()
bureau_x = DesktopWidth(0)
bureau_y = DesktopHeight(0)
OpenWindow_windows_chargement()


;************************************************ fenetre info thread
test_thread = CreateThread(@fenetre_theader(), 10)

Delay(10000) ; PROBLEME, le thread est stoppé

i=1
While i
  test()
  WindowEvent()
  i+1
  Delay(1)
Wend
Le probleme, c'est que mon thread est lancé, mais est bloqué pendant 10 secondes, avant de démarrer.
Si je mets OpenWindow_windows_chargement() dans la procedure thread, c'est l'inverse qui se produit. Cela marche 10 secondes, puis se bloque.

Quelqu'un sait quoi faire ?
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: incomprehension avec les threads

Message par graph100 »

je dirais que c'est car la mise à jour de la progressbar est bloquante car windowevent() n'est pas appelé pendant le Delay(10000)

regarde les debug suivants :

Code : Tout sélectionner

Enumeration
  #window_0
  #windows_chargement
  #Text_30
  #ProgressBar_chargement
  #ProgressCircle
  #Font_Text_0
EndEnumeration

Global bureau_x.l
Global bureau_y.l
Global test_thread.l
Global i.l = 0

Procedure SetProgressCircleState(progressbar.l,segments.l, State.l, color.l, bg.l)
  Static progCirc_font.l
  Protected IW2.l,TW2.l,TH2.l,x.l,y.l,sp_to_clear.l
  Protected img.l = GetGadgetData(progressbar)
  Protected beta_in_rad.d
  StartDrawing(ImageOutput(img))
    IW2.l = ImageWidth(img)/2
    State - 1
    beta_in_rad.d = (2*#PI*State)/segments - #PI/2
    x = IW2 + (IW2 - 4)*Cos(beta_in_rad)
    y = IW2 + (IW2 - 4)*Sin(beta_in_rad)
    If State < segments/4
      x + 2
      y + 2
    ElseIf State < segments/2
      x - 2
      y + 2
    ElseIf State < 3*segments/4
      x - 2
      y - 2
    Else
      x + 2
      y - 2
    EndIf
    FillArea(x,y,bg,color)
    StopDrawing()
    
    Debug "1"
   
    SetGadgetState(progressbar,ImageID(img))
    
    Debug "2"
  ProcedureReturn 1
EndProcedure

Procedure ProgressCircle(gadgetNumber.l,x.l,y.l,Size.l,segments.l,bg.l)
  Protected radius.l,n.l,x2.l,y2.l,img.l, beta_in_rad.d
  img = CreateImage(#PB_Any,Size,Size)
  StartDrawing(ImageOutput(img))
    Box(0,0,Size,Size,bg)
    radius = Size/2
    Circle(radius,radius,radius)
    Circle(radius,radius,radius-8,bg)   
    For n = 0 To segments-1
      beta_in_rad = (2*#PI*n)/segments
      x2.l = radius *(1 + Cos(beta_in_rad))
      y2.l = radius *(1 + Sin(beta_in_rad))
      LineXY(radius,radius,x2,y2,bg)
    Next
  StopDrawing()
  ImageGadget(gadgetNumber,x,y,Size,Size,ImageID(img))
  SetGadgetData(gadgetNumber, img)
EndProcedure

Procedure OpenWindow_windows_chargement()
  OpenWindow(#Window_0, 0, 0, 0, 0, "", #PB_Window_BorderLess|#PB_Window_Invisible) ; fenetre fictive
 
  OpenWindow(#windows_chargement, (bureau_x - 420)/2, (bureau_y - 135)/2, 420, 135, "test", 0)
  UseGadgetList(WindowID(#windows_chargement))
  TextGadget(#Text_30, 75, 5, 345, 55, "")
  ProgressBarGadget(#ProgressBar_chargement, 10, 95, 400, 30, 0, 100, #PB_ProgressBar_Smooth)
  SetGadgetFont(#Text_30, LoadFont(#Font_Text_0, "Microsoft Sans Serif", 16, 272))
  ProgressCircle(#ProgressCircle,5,5,55,8,RGB(210,210,210))
EndProcedure
 
Procedure fenetre_theader(*type)
    Debug "bip"
  r=10
  g=150
  b=10
  Repeat
    SetProgressCircleState(#ProgressCircle,8,m_circle,RGB(r, g, b),RGB(210,210,210) )
    m_circle+1
    If m_circle >= 9
      m_circle=1
      r+20
      g+25
      b+10
      If g>240
        r=10
        g=150
        b=10
      EndIf
    EndIf
    
    Delay(50)
    
  ForEver
EndProcedure

Procedure test()
  SetGadgetText(#Text_30,Str(i))
EndProcedure

ExamineDesktops()
bureau_x = DesktopWidth(0)
bureau_y = DesktopHeight(0)
OpenWindow_windows_chargement()


;************************************************ fenetre info thread
test_thread = CreateThread(@fenetre_theader(), 10)

Debug "eui"

Delay(10000) ; PROBLEME, le thread est stoppé

i=1
While i
  test()
  WindowEvent()
  i+1
  Delay(1)
Wend
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
dayvid
Messages : 1242
Inscription : mer. 11/nov./2009 18:17
Localisation : Poitiers (Vienne)

Re: incomprehension avec les threads

Message par dayvid »

C'est pas mal ce petit truc là :)
La vie, C'est comme, Une boitte, De startis, On en voie, De toutes, Les couleurs !

Mon forum http://purebasic.forumphp3.com/index.php
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: incomprehension avec les threads

Message par nico »

C'est normal que ça bloque, et la ligne qui bloque le thread est celle ci:
SetGadgetState(progressbar,ImageID(img))

Ce message est en réalité un Sendmessage (fonction bloquante) qui attend une réponse en retour de la boucle d'évènement!

Donc quand tu fais un SetGadgetState(progressbar,ImageID(img)), tu envoie un message à la boucle d'évènement de la fenêtre,
ce qui oblige à attendre le delay de 10 secondes pour que le message soit traité.
supercdfr
Messages : 105
Inscription : sam. 21/juil./2007 15:16

Re: incomprehension avec les threads

Message par supercdfr »

et y a t il un moyen de débloquer la situation ?
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: incomprehension avec les threads

Message par graph100 »

deja je ne sais pas à quoi sert ton delay !!

mais si tu as absolument besoin du delay dans la boucle principale tu as le choix entre :

- virer la ligne qui bloque
- faire un autre thread qui traite les windowevent() ?
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: incomprehension avec les threads

Message par nico »

D'accord avec Graph100, je crois qu'il faut arrêter de faire n'importe quoi, on met pas de delay dans une boucle.

Que cherche tu à faire clairement?
supercdfr
Messages : 105
Inscription : sam. 21/juil./2007 15:16

Re: incomprehension avec les threads

Message par supercdfr »

J'ai réussi a le faire fonctionner en modifiant .

Code : Tout sélectionner

Enumeration
  #window_0
  #windows_chargement
  #Text_30
  #ProgressBar_chargement
  #ProgressCircle
  #Font_Text_0
EndEnumeration


Global bureau_x.l
Global bureau_y.l
Global test_thread.l
Global i.l = 0

Procedure SetProgressCircleState(progressbar.l,segments.l, State.l, color.l, bg.l)
  Static progCirc_font.l
  Protected IW2.l,TW2.l,TH2.l,x.l,y.l,sp_to_clear.l
  Protected img.l = GetGadgetData(progressbar)
  Protected beta_in_rad.d
  StartDrawing(ImageOutput(img))
    IW2.l = ImageWidth(img)/2
    State - 1
    beta_in_rad.d = (2*#PI*State)/segments - #PI/2
    x = IW2 + (IW2 - 4)*Cos(beta_in_rad)
    y = IW2 + (IW2 - 4)*Sin(beta_in_rad)
    If State < segments/4
      x + 2
      y + 2
    ElseIf State < segments/2
      x - 2
      y + 2
    ElseIf State < 3*segments/4
      x - 2
      y - 2
    Else
      x + 2
      y - 2
    EndIf
    FillArea(x,y,bg,color)
  StopDrawing()
  SetGadgetState(progressbar,ImageID(img))
  ProcedureReturn 1
EndProcedure

Procedure ProgressCircle(gadgetNumber.l,x.l,y.l,Size.l,segments.l,bg.l)
  Protected radius.l,n.l,x2.l,y2.l,img.l, beta_in_rad.d
  img = CreateImage(#PB_Any,Size,Size)
  StartDrawing(ImageOutput(img))
    Box(0,0,Size,Size,bg)
    radius = Size/2
    Circle(radius,radius,radius)
    Circle(radius,radius,radius-8,bg)   
    For n = 0 To segments-1
      beta_in_rad = (2*#PI*n)/segments
      x2.l = radius *(1 + Cos(beta_in_rad))
      y2.l = radius *(1 + Sin(beta_in_rad))
      LineXY(radius,radius,x2,y2,bg)
    Next
  StopDrawing()
  ImageGadget(gadgetNumber,x,y,Size,Size,ImageID(img))
  SetGadgetData(gadgetNumber, img)
EndProcedure

Procedure fenetre_principale()
  OpenWindow(#Window_0, 0, 0, 0, 0, "", #PB_Window_BorderLess|#PB_Window_Invisible) ; fenetre fictive
EndProcedure

Procedure OpenWindow_windows_chargement(param)
  OpenWindow(#windows_chargement, 0,0, 420, 135, "test", #PB_Window_ScreenCentered)
  UseGadgetList(WindowID(#windows_chargement))
  TextGadget(#Text_30, 75, 5, 345, 55, "")
  ProgressBarGadget(#ProgressBar_chargement, 10, 95, 400, 30, 0, 100, #PB_ProgressBar_Smooth)
  ; Gadget Fonts
  SetGadgetFont(#Text_30, LoadFont(#Font_Text_0, "Microsoft Sans Serif", 16, 272))
  ProgressCircle(#ProgressCircle,5,5,55,8,RGB(210,210,210))
  r=10
  g=150
  b=10
  Repeat
    SetProgressCircleState(#ProgressCircle,8,m_circle,RGB(r, g, b),RGB(210,210,210) )
    m_circle+1
    If m_circle >= 9
      m_circle=1
      r+20
      g+25
      b+10
      If g>240
        r=10
        g=150
        b=10
      EndIf
    EndIf
    WindowEvent()
    Delay(50)
  ForEver
      
EndProcedure

fenetre_principale()

;************************************************ fenetre info thread
CreateThread(@OpenWindow_windows_chargement(), 1)
;************************************************ DEBUG BOUCLE PRINCIPALE
Delay(10) ; sinon erreur
SetGadgetText(#Text_30,"0")
Delay(5000)

i=1
While i
  SetGadgetText(#Text_30,Str(i))
  WindowEvent()
  i+1
  Delay(1)
Wend
Merci a ceux qui aident réellement les gens en difficulté en répondant a la question posée.
nico
Messages : 3702
Inscription : ven. 13/févr./2004 0:57

Re: incomprehension avec les threads

Message par nico »

Code : Tout sélectionner

Merci a ceux qui aident réellement les gens en difficulté en répondant a la question posée.
Il me semble t'avoir clairement expliqué où était le problème, te démontrant ainsi qu'il ne s'agissait pas d'un bug! (C'est déjà pas mal comme aide, je trouve)

Je te renvoie au topic de dayvid:
http://www.purebasic.fr/french/viewtopi ... =1&t=12651

qui si tu l'as suivi, te démontre que les "Débutants ou moins expérimenté" ont tendance a se créer des problèmes là où il n'y en a pas.

Tu demandes une résolution de problème sur un code qui est, je pense, mal construit et que ton problème n'existerait pas, s'il avait été mieux pensé.

Je préfère allez plus loin derrière la question posée pour comprendre le besoin, l'idée, le cheminement, la logique de construction, qui aboutit à un problème donné. (Si c'est pas vouloir aidé quelqu'un ça!)

A quoi sert ton delay?

Est-ce que tu as compris qu'avec ta méthode, utiliser deux boucles dans deux threads pour une même fenêtre (une folie), tu allait perdre inévitablement des messages!
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: incomprehension avec les threads

Message par graph100 »

j'appuie le message de nico. Lorsqu'on se lance dans un code il faut avoir établie clairement le but que nous voulons atteindre.
Or en programmation il n'y a pas de chemin unique pour arriver à destination.

Simplement lorsqu'on rencontre un problème il faut se remettre en question.
Ici c'est le delay qui est incriminé et cause tout tes problèmes.

Comme l'a dis nico, traiter les évents d'une même fenêtre par différents thread est complètement dangereux !
Pour le thread dont je t'ai parlé, il faut l’arrêter lorsque la boucle principale prend le relai

Et si on t'as demandé à quoi sert le delay, c'est pour la bonne raison que nous n'en voyons absolument pas l'utilité dans le contexte que tu nous as fourni.

Cordialement,
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
zaphod
Messages : 135
Inscription : dim. 07/déc./2008 9:32

Re: incomprehension avec les threads

Message par zaphod »

Salut,

peut-être ca ? :

Code : Tout sélectionner

Enumeration
  #window_0
  #windows_chargement
  #Text_30
  #ProgressBar_chargement
  #ProgressCircle
  #Font_Text_0
EndEnumeration

Global bureau_x.l
Global bureau_y.l
Global test_thread.l
Global i.l = 0
;
Global finthread.i ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; compiler avec activer la gestion des threads

Procedure SetProgressCircleState(progressbar.l,segments.l, State.l, color.l, bg.l)
  Static progCirc_font.l
  Protected IW2.l,TW2.l,TH2.l,x.l,y.l,sp_to_clear.l
  Protected img.l = GetGadgetData(progressbar)
  Protected beta_in_rad.d
  StartDrawing(ImageOutput(img))
    IW2.l = ImageWidth(img)/2
    State - 1
    beta_in_rad.d = (2*#PI*State)/segments - #PI/2
    x = IW2 + (IW2 - 4)*Cos(beta_in_rad)
    y = IW2 + (IW2 - 4)*Sin(beta_in_rad)
    If State < segments/4
      x + 2
      y + 2
    ElseIf State < segments/2
      x - 2
      y + 2
    ElseIf State < 3*segments/4
      x - 2
      y - 2
    Else
      x + 2
      y - 2
    EndIf
    FillArea(x,y,bg,color)
  StopDrawing()
  SetGadgetState(progressbar,ImageID(img))
  ProcedureReturn 1
EndProcedure

Procedure ProgressCircle(gadgetNumber.l,x.l,y.l,Size.l,segments.l,bg.l)
  Protected radius.l,n.l,x2.l,y2.l,img.l, beta_in_rad.d
  img = CreateImage(#PB_Any,Size,Size)
  StartDrawing(ImageOutput(img))
    Box(0,0,Size,Size,bg)
    radius = Size/2
    Circle(radius,radius,radius)
    Circle(radius,radius,radius-8,bg)   
    For n = 0 To segments-1
      beta_in_rad = (2*#PI*n)/segments
      x2.l = radius *(1 + Cos(beta_in_rad))
      y2.l = radius *(1 + Sin(beta_in_rad))
      LineXY(radius,radius,x2,y2,bg)
    Next
  StopDrawing()
  ImageGadget(gadgetNumber,x,y,Size,Size,ImageID(img))
  SetGadgetData(gadgetNumber, img)
EndProcedure

Procedure OpenWindow_windows_chargement()
  OpenWindow(#Window_0, 0, 0, 0, 0, "", #PB_Window_BorderLess|#PB_Window_Invisible) ; fenetre fictive
  
  OpenWindow(#windows_chargement, (bureau_x - 420)/2, (bureau_y - 135)/2, 420, 135, "test", #PB_Window_SystemMenu)
  UseGadgetList(WindowID(#windows_chargement))
  TextGadget(#Text_30, 75, 5, 345, 55, "")
  ProgressBarGadget(#ProgressBar_chargement, 10, 95, 400, 30, 0, 100, #PB_ProgressBar_Smooth)
  SetGadgetFont(#Text_30, LoadFont(#Font_Text_0, "Microsoft Sans Serif", 16, 272))
  ProgressCircle(#ProgressCircle,5,5,55,8,RGB(210,210,210))
EndProcedure
 
Procedure fenetre_theader(*type)
  r=10
  g=150
  b=10
  Repeat
    If finthread  ;>>>>>>>>>>>>>>>>>>>>>>>>><<
      Break
    EndIf
    ;
    SetProgressCircleState(#ProgressCircle,8,m_circle,RGB(r, g, b),RGB(210,210,210) )
    m_circle+1
    If m_circle >= 9
      m_circle=1
      r+20
      g+25
      b+10
      If g>240
        r=10
        g=150
        b=10
      EndIf
    EndIf
    Delay(50)
  ForEver
EndProcedure

Procedure test()
  SetGadgetText(#Text_30,Str(i))
EndProcedure

ExamineDesktops()
bureau_x = DesktopWidth(0)
bureau_y = DesktopHeight(0)
OpenWindow_windows_chargement()


;************************************************ fenetre info thread
test_thread = CreateThread(@fenetre_theader(), 10)

;Delay(10000) ; PROBLEME, le thread est stoppé

;i=1
;While i
;  test()
;  WindowEvent()
;  i+1
;  Delay(1)
;Wend

;{- Event loop
Repeat
  Select WaitWindowEvent(10)
    ; ///////////////////
    Case #PB_Event_Gadget
    ; ////////////////////////
    Case #PB_Event_CloseWindow
      Select EventWindow()
        Case #windows_chargement
          CloseWindow(#windows_chargement)
          CloseWindow(#window_0)
          Break
      EndSelect
  EndSelect
  test()
  i+1
  SetGadgetState(#ProgressBar_chargement,i/10)
ForEver
;
finthread=1 ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>><
If ThreadID(test_thread)
  WaitThread(test_thread)
EndIf


dayvid
Messages : 1242
Inscription : mer. 11/nov./2009 18:17
Localisation : Poitiers (Vienne)

Re: incomprehension avec les threads

Message par dayvid »

Bon aller, je vais te filer un cht'i coup de main
mais c'est bien pour te faire plaisir hein :wink:

Déjà faudrait que tu m'éxplique ce que tu veut faire si ça te dérange pas :)
En attendent je travail sur ton code pour l'optimiser :wink:

Voilà un premier passage:

Code : Tout sélectionner

Enumeration
  #window_0
  #windows_chargement
  #Text_30
  #ProgressBar_chargement
  #ProgressCircle
  #Font_Text_0
EndEnumeration

Global bureau_x.l
Global bureau_y.l
Global test_thread.l
Global i.l = 0
;
Global finthread.i ;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; compiler avec activer la gestion des threads

Procedure SetProgressCircleState(progressbar.l,segments.l, State.l, color.l, bg.l)
  Static progCirc_font.l
  Protected IW2.l,TW2.l,TH2.l,x.l,y.l,sp_to_clear.l
  Protected img.l = GetGadgetData(progressbar)
  Protected beta_in_rad.d
  StartDrawing(ImageOutput(img))
    IW2.l = ImageWidth(img)/2
    State - 1
    beta_in_rad.d = (2*#PI*State)/segments - #PI/2
    x = IW2 + (IW2 - 4)*Cos(beta_in_rad)
    y = IW2 + (IW2 - 4)*Sin(beta_in_rad)
    If State < segments/4
      x + 2
      y + 2
    ElseIf State < segments/2
      x - 2
      y + 2
    ElseIf State < 3*segments/4
      x - 2
      y - 2
    Else
      x + 2
      y - 2
    EndIf
    FillArea(x,y,bg,color)
  StopDrawing()
  SetGadgetState(progressbar,ImageID(img))
  ProcedureReturn 1
EndProcedure

Procedure ProgressCircle(gadgetNumber.l,x.l,y.l,Size.l,segments.l,bg.l)
  Protected radius.l,n.l,x2.l,y2.l,img.l, beta_in_rad.d
  img = CreateImage(#PB_Any,Size,Size)
  StartDrawing(ImageOutput(img))
    Box(0,0,Size,Size,bg)
    radius = Size/2
    Circle(radius,radius,radius)
    Circle(radius,radius,radius-8,bg)   
    For n = 0 To segments-1
      beta_in_rad = (2*#PI*n)/segments
      x2.l = radius *(1 + Cos(beta_in_rad))
      y2.l = radius *(1 + Sin(beta_in_rad))
      LineXY(radius,radius,x2,y2,bg)
    Next
  StopDrawing()
  ImageGadget(gadgetNumber,x,y,Size,Size,ImageID(img))
  SetGadgetData(gadgetNumber, img)
EndProcedure

Procedure SetGadget(a)
  Repeat
  SetGadgetText(#Text_30, Str(i))
  i + 1
  SetGadgetState(#ProgressBar_chargement, i / 10)
  ForEver
EndProcedure

Procedure fenetre_theader(a)
  r=10
  g=150
  b=10
  Repeat
    If finthread  ;>>>>>>>>>>>>>>>>>>>>>>>>><<
      Break
    EndIf
    ;
    SetProgressCircleState(#ProgressCircle,8,m_circle,RGB(r, g, b),RGB(210,210,210) )
    m_circle+1
    If m_circle >= 9
      m_circle=1
      r+20
      g+25
      b+10
      If g>240
        r=10
        g=150
        b=10
      EndIf
    EndIf
    Delay(50)
  ForEver
EndProcedure

Procedure OpenWindow_windows_chargement()
  OpenWindow(#Window_0, 0, 0, 0, 0, "", #PB_Window_BorderLess|#PB_Window_Invisible) ; fenetre fictive
  OpenWindow(#windows_chargement, (bureau_x - 420)/2, (bureau_y - 135)/2, 420, 135, "test", #PB_Window_SystemMenu)
  UseGadgetList(WindowID(#windows_chargement))
  TextGadget(#Text_30, 75, 5, 345, 55, "")
  ProgressBarGadget(#ProgressBar_chargement, 10, 95, 400, 30, 0, 100, #PB_ProgressBar_Smooth)
  SetGadgetFont(#Text_30, LoadFont(#Font_Text_0, "Microsoft Sans Serif", 16, 272))
  ProgressCircle(#ProgressCircle,5,5,55,8,RGB(210,210,210))
  
  CreateThread(@SetGadget(), 0)
  test_thread = CreateThread(@fenetre_theader(), 0)
  
;   finthread = 1
;   
;   If ThreadID(test_thread)
;     WaitThread(test_thread)
;   EndIf

  Repeat
    
    Event = WaitWindowEvent(1) ; This line waits until an event is received from Windows
    WindowID = EventWindow() ; The Window where the event is generated, can be used in the gadget procedures
    GadgetID = EventGadget() ; Is it a gadget event?
    Menu = EventMenu()
    EventType = EventType() ; The event type
    
    If WindowID = #windows_chargement
      
      If Event = #PB_Event_Gadget
        
        If GadgetID = 0
          
        EndIf
        
      EndIf
      
    EndIf
    
  Until Event = #PB_Event_CloseWindow ; End of the event loop
  End
  
EndProcedure
 
ExamineDesktops()
bureau_x = DesktopWidth(0)
bureau_y = DesktopHeight(0)
OpenWindow_windows_chargement()

Je supposer que tu veux faire une espèce d'image barre de progression c'est ça :P
mais que pour le moment tu coince un peu car tu ne sais pas comment la faire progresser à ta convenance, j’me trompe ?

Pourtant avec le code que tu as pondu là qui est un peu pointue quand même pour moi, tu ne saurais pas faire ça ?!
C'est pas très compliquer tu verras :wink:
La vie, C'est comme, Une boitte, De startis, On en voie, De toutes, Les couleurs !

Mon forum http://purebasic.forumphp3.com/index.php
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: incomprehension avec les threads

Message par graph100 »

je me demande souvent ce qu'est un troll ....
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
dayvid
Messages : 1242
Inscription : mer. 11/nov./2009 18:17
Localisation : Poitiers (Vienne)

Re: incomprehension avec les threads

Message par dayvid »

Pardon 8O

Tu veut dire quoi par là :?

Tu m'insulte :|

Si c'est le cas fait bien gaffe à ce que tu dis stp, je ne t'insulte pas moi :wink:
La vie, C'est comme, Une boitte, De startis, On en voie, De toutes, Les couleurs !

Mon forum http://purebasic.forumphp3.com/index.php
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Re: incomprehension avec les threads

Message par Le Soldat Inconnu »

Le thread n'est pas stoppé, simplement, tu bloque le rafraichissement de la fenêtre car il n'y a pas d'accès au évènement. Si tu veux que ta fenetre puisse être rafraichie, il faut faire un WindowEvent, ou WaitWindowEvent

Et un autre truc, un identifiant de gadget, il vaut mieux utiliser des i et pas des l pour être compatible avec les 64bits

Correction :

Code : Tout sélectionner

Enumeration
	#window_0
	#windows_chargement
	#Text_30
	#ProgressBar_chargement
	#ProgressCircle
	#Font_Text_0
EndEnumeration

Global bureau_x.l
Global bureau_y.l
Global test_thread.l
Global i.l = 0

Procedure SetProgressCircleState(progressbar.l,segments.l, State.l, color.l, bg.l)
	Static progCirc_font.l
	Protected IW2.l,TW2.l,TH2.l,x.l,y.l,sp_to_clear.l
	Protected img.l = GetGadgetData(progressbar)
	Protected beta_in_rad.d
	StartDrawing(ImageOutput(img))
		IW2.l = ImageWidth(img)/2
		State - 1
		beta_in_rad.d = (2*#PI*State)/segments - #PI/2
		x = IW2 + (IW2 - 4)*Cos(beta_in_rad)
		y = IW2 + (IW2 - 4)*Sin(beta_in_rad)
		If State < segments/4
			x + 2
			y + 2
		ElseIf State < segments/2
			x - 2
			y + 2
		ElseIf State < 3*segments/4
			x - 2
			y - 2
		Else
			x + 2
			y - 2
		EndIf
		FillArea(x,y,bg,color)
	StopDrawing()
	SetGadgetState(progressbar,ImageID(img))
	ProcedureReturn 1
EndProcedure

Procedure ProgressCircle(gadgetNumber.l,x.l,y.l,Size.l,segments.l,bg.l)
	Protected radius.l,n.l,x2.l,y2.l, beta_in_rad.d, img.l
	img = CreateImage(#PB_Any,Size,Size)
	StartDrawing(ImageOutput(img))
		Box(0,0,Size,Size,bg)
		radius = Size/2
		Circle(radius,radius,radius)
		Circle(radius,radius,radius-8,bg)   
		For n = 0 To segments-1
			beta_in_rad = (2*#PI*n)/segments
			x2.l = radius *(1 + Cos(beta_in_rad))
			y2.l = radius *(1 + Sin(beta_in_rad))
			LineXY(radius,radius,x2,y2,bg)
		Next
	StopDrawing()
	ImageGadget(gadgetNumber,x,y,Size,Size,ImageID(img))
	SetGadgetData(gadgetNumber, img)
EndProcedure

Procedure OpenWindow_windows_chargement()
	OpenWindow(#windows_chargement, (bureau_x - 420)/2, (bureau_y - 135)/2, 420, 135, "test", #PB_Window_SystemMenu)
	UseGadgetList(WindowID(#windows_chargement))
	TextGadget(#Text_30, 75, 5, 345, 55, "")
	ProgressBarGadget(#ProgressBar_chargement, 10, 95, 400, 30, 0, 100, #PB_ProgressBar_Smooth)
	SetGadgetFont(#Text_30, LoadFont(#Font_Text_0, "Microsoft Sans Serif", 16, 272))
	ProgressCircle(#ProgressCircle,5,5,55,8,RGB(210,210,210))
EndProcedure
	
Procedure fenetre_theader(*type)
	r=10
	g=150
	b=10
	Repeat
		SetProgressCircleState(#ProgressCircle,8,m_circle,RGB(r, g, b),RGB(210,210,210) )
		m_circle+1
		If m_circle >= 9
			m_circle=1
			r+20
			g+25
			b+10
			If g>240
				r=10
				g=150
				b=10
			EndIf
		EndIf
		Delay(50)
	ForEver
EndProcedure

Procedure test()
	SetGadgetText(#Text_30,Str(i))
EndProcedure

ExamineDesktops()
bureau_x = DesktopWidth(0)
bureau_y = DesktopHeight(0)
OpenWindow_windows_chargement()


;************************************************ fenetre info thread
test_thread = CreateThread(@fenetre_theader(), 10)

Repeat
	Event = WaitWindowEvent()
Until Event = #PB_Event_CloseWindow
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Répondre