Problème avec un thread

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Problème avec un thread

Message 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.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
MLD
Messages : 1124
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

Re: Problème avec un thread

Message 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.
Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Problème avec un thread

Message 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 ?
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
MLD
Messages : 1124
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

Re: Problème avec un thread

Message par MLD »

@ MICOUTE

Je n'aurais pas dit mieux que Spock
Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Problème avec un thread

Message par Micoute »

Ok ! Merci pour vos réponses, je voulais juste innover !
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Problème avec un thread

Message par Ollivier »

ça peut accélèrer si ton CPU a plusieurs noyaux.
Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Problème avec un thread

Message par Micoute »

Oui, il en a 8.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Répondre