Page 1 sur 3

incomprehension avec les threads

Publié : sam. 17/mars/2012 16:28
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 ?

Re: incomprehension avec les threads

Publié : sam. 17/mars/2012 16:44
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

Re: incomprehension avec les threads

Publié : sam. 17/mars/2012 16:54
par dayvid
C'est pas mal ce petit truc là :)

Re: incomprehension avec les threads

Publié : sam. 17/mars/2012 16:55
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é.

Re: incomprehension avec les threads

Publié : sam. 17/mars/2012 18:51
par supercdfr
et y a t il un moyen de débloquer la situation ?

Re: incomprehension avec les threads

Publié : sam. 17/mars/2012 19:18
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() ?

Re: incomprehension avec les threads

Publié : sam. 17/mars/2012 19:54
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?

Re: incomprehension avec les threads

Publié : sam. 17/mars/2012 20:54
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.

Re: incomprehension avec les threads

Publié : sam. 17/mars/2012 22:32
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!

Re: incomprehension avec les threads

Publié : sam. 17/mars/2012 23:03
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,

Re: incomprehension avec les threads

Publié : dim. 18/mars/2012 9:03
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



Re: incomprehension avec les threads

Publié : dim. 18/mars/2012 11:47
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:

Re: incomprehension avec les threads

Publié : dim. 18/mars/2012 12:26
par graph100
je me demande souvent ce qu'est un troll ....

Re: incomprehension avec les threads

Publié : dim. 18/mars/2012 12:50
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:

Re: incomprehension avec les threads

Publié : dim. 18/mars/2012 23:13
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