Page 1 sur 1

Bug avec les Threads !!

Publié : ven. 15/août/2008 18:37
par Mytic
Bonjour,
Pour faire bref, voici deux exemples qui montrent le bug : :?
Avec le Bug :

Code : Tout sélectionner


Enumeration 100
  #Window
EndEnumeration

;
Enumeration 100
  #Button_0k
  #Button_1k
EndEnumeration

Procedure Open_Window()
  If OpenWindow(#Window, 291, 106, 417, 192, "test",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
    If CreateGadgetList(WindowID(#Window))
      ButtonGadget(#Button_0k, 60, 120, 120, 30, "B1")
      ButtonGadget(#Button_1k,320, 100, 80, 70, "B2")
 
      
    EndIf
  EndIf
EndProcedure


Procedure test(*vkeyeur)

Open_Window()
  
Repeat
Delay(10)
evenk.l = WindowEvent()
If evenk = #PB_Event_Gadget
  Select EventGadget()

        Case #Button_1k
             Goto exikeyey:
 
        Case #Button_0k
             Goto exikeyey:
  EndSelect
EndIf

Until evenk = #PB_Event_CloseWindow
exikeyey:
CloseWindow(#Window)

EndProcedure


CreateThread(@test(),1)

Repeat


ForEver
Sans le Bug :

Code : Tout sélectionner


Enumeration 100
  #Window
EndEnumeration

;
Enumeration 100
  #Button_0k
  #Button_1k
EndEnumeration

Procedure Open_Window()
  If OpenWindow(#Window, 291, 106, 417, 192, "test",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
    If CreateGadgetList(WindowID(#Window))
      ButtonGadget(#Button_0k, 60, 120, 120, 30, "B1")
      ButtonGadget(#Button_1k,320, 100, 80, 70, "B2")
 
      
    EndIf
  EndIf
EndProcedure


Procedure test(*vkeyeur)

Open_Window()
  
Repeat
Delay(10)
evenk.l = WindowEvent()
If evenk = #PB_Event_Gadget
  Select EventGadget()

        Case #Button_1k
             evenk = #PB_Event_CloseWindow
 
        Case #Button_0k
             evenk = #PB_Event_CloseWindow
  EndSelect
EndIf

Until evenk = #PB_Event_CloseWindow
exikeyey:
CloseWindow(#Window)

EndProcedure


CreateThread(@test(),1)

Repeat


ForEver
:idea: :?: :!:

Publié : sam. 16/août/2008 12:19
par lionel_om
Oué c'est bizarre, on dirait que les Goto faire sortir le Thread de son contexte. Pourtant j'ai vérifié avec un GetCurrentThreadId_() et c'ets toujours bien le même Thread qui exécute le code dans la fonction.

Avec Debugger actvé et en faisait un Debug "bidule", le programme plante à la ligne "EndProcedure" avec un message : "Exécutable terminé".

Du moins, il y a bug quand on clic sur un bouton, mais quand on clic sur "Quitter", ca marche normalement...

Vraiment bizarre
/Lio

Publié : sam. 16/août/2008 12:25
par Anonyme
met des break à la place des goto.

Publié : sam. 16/août/2008 16:04
par Mytic
Avec le X le programme quitte avec un evenk = #PB_Event_CloseWindow et non pas avec un Goto !
Je sais qu’on peut utiliser un break , mais le but ici c’est de montrer le bug , et c’est assez gênant comme bug je trouve !

La réponse se trouve du coté assembleur !
:?

Publié : sam. 16/août/2008 16:27
par Jacobus
Essayes comme ça, chez moi ça fonctionne

Code : Tout sélectionner

Enumeration ;100 
  #Window 
;EndEnumeration 

; 
;Enumeration 100 
  #Button_0k 
  #Button_1k 
EndEnumeration 

Procedure Open_Window() 
  If OpenWindow(#Window, 291, 106, 417, 192, "test",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar ) 
    If CreateGadgetList(WindowID(#Window)) 
      ButtonGadget(#Button_0k, 60, 120, 120, 30, "B1") 
      ButtonGadget(#Button_1k,320, 100, 80, 70, "B2") 
  
      
    EndIf 
  EndIf 
EndProcedure 


Procedure test(vkeyeur.l) 

Open_Window()
  
Repeat 
Delay(10) 
evenk.l = WindowEvent() 
If evenk = #PB_Event_Gadget 
  Select EventGadget() 

        Case #Button_1k 
             Goto exikeyey 
  
        Case #Button_0k 
             Goto exikeyey 
  EndSelect 
EndIf 

Until evenk = #PB_Event_CloseWindow 
exikeyey: 
CloseWindow(#Window) 
End 
EndProcedure 


CreateThread(@test(),1) 

Repeat 


ForEver 

Publié : sam. 16/août/2008 16:39
par Mytic
C’est sure que ça va marcher comme ça ! Vu que le END arrête l’exécution du programme en entier, et non pas le thread seulement. :roll:

Publié : sam. 16/août/2008 16:44
par Jacobus
Oui mais sinon j'ai un message d'erreur "invalid memory access" sur repeat ou forever, normal il n'y a rien.
Ok, ça déconne même dans un programme plus complet. Pourtant j'utilise des Goto dans des Threads sans problème (threads sans ouverture de fenêtre).