Bug avec les Threads !!

Archive.
Mytic
Messages : 466
Inscription : mer. 25/juil./2007 0:13

Bug avec les Threads !!

Message 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: :?: :!:
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message 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
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
Anonyme

Message par Anonyme »

met des break à la place des goto.
Mytic
Messages : 466
Inscription : mer. 25/juil./2007 0:13

Message 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 !
:?
Avatar de l’utilisateur
Jacobus
Messages : 1520
Inscription : mar. 06/avr./2004 10:35
Contact :

Message 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 
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
Mytic
Messages : 466
Inscription : mer. 25/juil./2007 0:13

Message 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:
Avatar de l’utilisateur
Jacobus
Messages : 1520
Inscription : mar. 06/avr./2004 10:35
Contact :

Message 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).
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
Répondre