Page 1 sur 1

Problème avec un thread

Publié : sam. 22/août/2015 16:16
par Micoute
Bonjour à tous, j'essaie de me faire un petit débogueur perso, mais ça ne fonctionne pas comme je le souhaiterais.

Code : Tout sélectionner

Enumeration 1
  
  #FenetreDebugueur
  #PanelGadget
  #EditorGadgetDebuguage
  #EditorGadgetArchivage
  #FichierDebugueur
  
EndEnumeration

Global NewMap MapDebugueur.s()

Procedure AjouterElementMapDebugueur(NomElement$, ValeurElement$)
  MapDebugueur.s(NomElement$) = ValeurElement$
EndProcedure

AjouterElementMapDebugueur("Abc", "123")
AjouterElementMapDebugueur("Def", "456")
AjouterElementMapDebugueur("Ghi", "789")

Procedure AjouterElementsDebugueur(Element$, Parametre.i)
  
  Static LigneTempon, NombreLigneEditorGadgetDebuguage
  Static *MemoireTempon
  
  If Not *MemoireTempon <> 0
    
    *MemoireTempon = AllocateMemory(1)
    
    If Not *MemoireTempon <> 0
      MessageRequester("Erreur", "Mémoire insufisante.")
      End
    EndIf
    
  EndIf

  LigneTempon + 1
  NombreLigneEditorGadgetDebuguage + 1
  
  *MemoireTempon = ReAllocateMemory(*MemoireTempon, MemorySize(*MemoireTempon) + Len(Element$) + 1)
  
  If Parametre = 0
    
    If Not *MemoireTempon <> 0
      MessageRequester("Erreur", "Mémoire insufisante.")
      End
      
    ElseIf LigneTempon <= 99
      PokeS(*MemoireTempon, PeekS(*MemoireTempon) + Element$ + Chr(13) + Chr(10))
      
    ElseIf LigneTempon = 100
      
      AddGadgetItem(#EditorGadgetDebuguage, -1, PeekS(*MemoireTempon) + Element$)
      
      If NombreLigneEditorGadgetDebuguage => 10000
        AddGadgetItem(#EditorGadgetArchivage, -1, GetGadgetText(#EditorGadgetDebuguage))
        ClearGadgetItems(#EditorGadgetDebuguage)
        NombreLigneEditorGadgetDebuguage = 0
      EndIf
      
      FreeMemory(*MemoireTempon)
      
      *MemoireTempon = AllocateMemory(1)
      
      If Not *MemoireTempon <> 0
        MessageRequester("Erreur", "Mémoire insufisante.")
        End
      EndIf
      
      LigneTempon = 0
      
    EndIf
    
  ElseIf Parametre = 1
    
    If PeekS(*MemoireTempon) > ""
      
      AddGadgetItem(#EditorGadgetDebuguage, -1, PeekS(*MemoireTempon))
      FreeMemory(*MemoireTempon)
      
      *MemoireTempon = AllocateMemory(1)
      
      If Not *MemoireTempon <> 0
        MessageRequester("Erreur", "Mémoire insufisante.")
        End
      EndIf
      
      LigneTempon = 0
      
    EndIf
    
  EndIf
  
EndProcedure

Procedure LancerDebuguage(*Parametre)
  
  Repeat
    
    WindowEvent = WindowEvent()

    Select WindowEvent
        
      Case #PB_Event_Gadget
        
        Select EventGadget()
            
          Case #EditorGadgetArchivage
            
            Select EventType()
                
              Case #PB_EventType_Change
                
                DisableGadget(#EditorGadgetDebuguage, 1)
                
            EndSelect
            
          Case #EditorGadgetDebuguage
            
            Select EventType()
                
              Case #PB_EventType_Change
                
                DisableGadget(#EditorGadgetDebuguage, 0)
                
            EndSelect
            
        EndSelect
        
      Case #PB_Event_SizeWindow
        ResizeGadget(#PanelGadget, 1, 1, WindowWidth(#FenetreDebugueur), WindowHeight(#FenetreDebugueur) - 1)
        ResizeGadget(#EditorGadgetDebuguage, 0, 0, GadgetWidth(#PanelGadget) - 8, GadgetHeight(#PanelGadget) - 27)
        ResizeGadget(#EditorGadgetArchivage, 0, 0, GadgetWidth(#PanelGadget) - 8, GadgetHeight(#PanelGadget) - 27)
        
    EndSelect
    
  Until WindowEvent = #PB_Event_CloseWindow
  
EndProcedure

If OpenWindow(#FenetreDebugueur, 0, 0, 800, 600, "Débug...", #PB_Window_SystemMenu | #PB_Window_TitleBar | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget | #PB_Window_ScreenCentered)
  PanelGadget(#PanelGadget, 1, 1, WindowWidth(#FenetreDebugueur), WindowHeight(#FenetreDebugueur) - 1)
  AddGadgetItem(#PanelGadget, 1, "Débug")
  EditorGadget(#EditorGadgetDebuguage, 0, 0, GadgetWidth(#PanelGadget) - 8, GadgetHeight(#PanelGadget) - 27, #PB_Editor_ReadOnly)
  AddGadgetItem(#PanelGadget, 1, "Archive")
  EditorGadget(#EditorGadgetArchivage, 0, 0, GadgetWidth(#PanelGadget) - 8, GadgetHeight(#PanelGadget) - 27, #PB_Editor_ReadOnly)
  SetActiveGadget(#EditorGadgetDebuguage)
  
  CreateThread(@LancerDebuguage(), 0)
  ;WaitThread(@LancerDebuguage())
  
Else
  
EndIf
Et voici un petit programme pour tester.

Code : Tout sélectionner

IncludeFile "Débugeur Maison.pb"

For Ligne = 1 To 100998
  AjouterElementsDebugueur("-------------------------------------------------------------------------------------------------------------------------------------------- Element n°" + 
                           Str(Ligne) + " --------------------------------------------------------------------------------------------------------------------------------------------", 0)
Next

AjouterElementsDebugueur("", 1)
Merci pour votre aide.

Re: Problème avec un thread

Publié : dim. 23/août/2015 8:29
par MLD
Bonjour Micoute

Le message d'érreur ligne 100 est assez explicite il me semble.
Mettre la boucle générale de la fenetre principale dans un thread me semble pour le moins un peu tordu. Cela revient un peu a mettre un thread dans un thread.

Re: Problème avec un thread

Publié : dim. 23/août/2015 8:52
par Micoute
Bonjour MLD, je le conçois très bien, j'aurais sûrement du supprimer la procédure LancerDebuguage() et mettre son contenu dans la boucle principale, mais où est l'utilité du thread ?

Re: Problème avec un thread

Publié : dim. 23/août/2015 10:19
par MLD
@ MICOUTE

Je n'aurais pas dit mieux que Spock

Re: Problème avec un thread

Publié : dim. 23/août/2015 10:52
par Micoute
Ok ! Merci pour vos réponses, je voulais juste innover !

Re: Problème avec un thread

Publié : dim. 23/août/2015 19:12
par Ollivier
ça peut accélèrer si ton CPU a plusieurs noyaux.

Re: Problème avec un thread

Publié : dim. 23/août/2015 19:32
par Micoute
Oui, il en a 8.