[Résolu] Désincarcérer un thread

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
SPH
Messages : 4726
Inscription : mer. 09/nov./2005 9:53

[Résolu] Désincarcérer un thread

Message par SPH »

Salut,
j'aimerais "désincarcérer" le thread (l'enlever quoi) de ce code :

Code : Tout sélectionner

Enumeration
  #MainForm
  #StartStop
  #ListFolder
  #CountFiles
EndEnumeration

Global CountFiles.i
Global Chemin$ = PathRequester("Répertoire a scanner", GetUserDirectory(#PB_Directory_Desktop))
Global nb=10000
Global Dim dossier$(nb)
Global dossier
Global Dim name$(nb)
Global name
Global Dim taille.q(nb)
Global Dim contenu.q(nb)
Global test_vide=0


;Parcourir un dossier (Fonction recurssive by Flype il me semble)
Procedure.s ParseDirectory(folder.s, id.l = 0)
  If Right(folder, 1) <> "\"
    folder + "\"
  EndIf
  
  If ExamineDirectory(id, folder, "*.*")
    While NextDirectoryEntry(id) And GetGadgetData(#StartStop)=#True
      If DirectoryEntryName(id) <> "." And DirectoryEntryName(id) <> ".."
        AddGadgetItem(#ListFolder,-1, folder +Chr(10)+DirectoryEntryName(id))
        ;Debug folder
        countFiles+1
        SetGadgetText(#CountFiles, Str(CountFiles))
        If DirectoryEntryType(id) = #PB_DirectoryEntry_Directory
          
          
          dossier+1
          If dossier>=nb
            Debug "trop court (dossier)": End
          EndIf
          dossier$(dossier)=folder + DirectoryEntryName(id)+"\"
          
          Debug dossier$(dossier)
          
          ParseDirectory(folder + DirectoryEntryName(id), id + 1)
          
        Else
          
          name+1
          If name>=nb
            Debug "trop court (name)": End
          EndIf
          name$(name)=folder + DirectoryEntryName(id)
          test_vide=0
          Debug ">>  "+name$(name)

        EndIf
        
        
      EndIf
    Wend
    FinishDirectory(id)
  EndIf
  
EndProcedure

Procedure StartThread(*Value)
  ClearGadgetItems(#ListFolder)
  CountFiles=0
  ParseDirectory(Chemin$)
  While GetGadgetData(#StartStop)=#True
  Wend
EndProcedure

Procedure MainFormShow()
  OpenWindow(#MainForm,0,0,800,600,"Lecture d'un dossier(Thread)",#PB_Window_ScreenCentered | #PB_Window_SystemMenu | #PB_Window_SizeGadget)
  TextGadget(#PB_Any, 10, 10, 50, 20, "Fichier(s)")
  TextGadget(#CountFiles, 100, 10, 80, 20, "0")
  ListIconGadget(#ListFolder, 10, 30, 780,530, "Dossier", 380)
  AddGadgetColumn(#ListFolder, 1, "Fichier",390)
  ButtonGadget(#StartStop, 10, 570, 780, 20, "Start/Stop")
EndProcedure

MainFormShow()


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


Repeat
  
  
  Select WaitWindowEvent()
    Case #PB_Event_Gadget
      Select EventGadget()
        Case #StartStop
          If GetGadgetData(#StartStop)=#False
            SetGadgetData(#StartStop, #True) ;Indiquer au bouton qu'il est actif
            tread=CreateThread(@StartThread(), 0)
          Else
            SetGadgetData(#StartStop, #False)
          EndIf
          
      EndSelect
      
    Case #PB_Event_SizeWindow
      WWidth=WindowWidth(#MainForm)
      Wheight=WindowHeight(#MainForm)
      ResizeGadget(#ListFolder, #PB_Ignore, #PB_Ignore , WWidth-10, Wheight-75)
      ResizeGadget(#StartStop, (WWidth/2)-35, Wheight-30 , #PB_Ignore, #PB_Ignore)
      
    Case #PB_Event_CloseWindow
      If tread<>0
        KillThread(tread)
      EndIf
      
      For i=1 To actu
      Debug "=>  "+name$(i)+ " : "+taille(i)
      Next
      Debug("......")
      Debug "dossier = "+Str(dossier)
      Debug "name = "+Str(name)
      
      End
  EndSelect
ForEver

MERCI D'AVANCE :?
Dernière modification par SPH le lun. 01/juin/2020 10:29, modifié 1 fois.
http://HexaScrabble.com/
!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.00 - 64 bits
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Désincarcérer un thread

Message par Ollivier »

Déjà, pour qu'il fonctionne correctement (insertion d'un Delay() ):

Code : Tout sélectionner

Procedure StartThread(*Value)
ClearGadgetItems(#ListFolder)
CountFiles=0
ParseDirectory(Chemin$)
While GetGadgetData(#StartStop)=#True
 Delay(30)
Wend
EndProcedure
Et là, si tu es encore motivé à le défaire, tu lui enlèves sa boucle de maintien :

Code : Tout sélectionner

Procedure StartThread(*Value)
ClearGadgetItems(#ListFolder)
CountFiles=0
ParseDirectory(Chemin$)
EndProcedure
Mais bon... Il n'y a pas la fermeture après la boucle donc il était vraiment bizarrement conçu, pour ne pas dire complètement mal conçu...
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Désincarcérer un thread

Message par Zorro »

bien qu'il ne soit pas trop compliquer de retirer le thread , je prefere te proposer une autre solution

pour l'exemple je liste les "*.exe" qui se trouvent dans ton repertoire Program File(86)
patiente un petit peut le temps qu'il fasse l'arbo .....
(chez moi environ 5-6 secondes) , c'est fonction du nombre de prg que tu as d'installé

vers la fin du code, tu as 2 parametres a preciser ,
1- le chemin que tu veux lister
2- le type de fichier que tu veux faire ressortir ....

si tu veux tout les fichiers , tu met "*.*" , si tu veux que les images Jpg , "*.jpg" etc ....

le code te met tout en treegadget , mais bien sur c'est la procedure "ListeFichiers(NumDir.l, NameDir.s, Ext.s)"
qui te renvoi ce qu'elle trouve , plus qu'a en faire ce que tu veux !!



Code : Tout sélectionner


; *******************************************************************
;   ARBORESCENCES  - Liste de répertoire et fichiers...
;
; *******************************************************************
#ImgFile = 1
#ImgFold = 2

Declare ListeFichiers(NumDir.l, NameDir.s, Ext.s)


Global Tree_0
;{- Images du TreeGadget
If CreateImage ( #ImgFile , 16, 16)
      StartDrawing ( ImageOutput ( #ImgFile ))
            Box (0, 0, 16, 16, $8FF7F7)
            DrawText (3,0, "F" , $0306F8,$86F7F7)
      StopDrawing ()
EndIf
    ;
If CreateImage ( #ImgFold , 16, 16)
      StartDrawing ( ImageOutput ( #ImgFold ))
            Box (0, 0, 16, 16, $8FF7F7)
            DrawText (3,0, "D" , $FF0000,$86F7F7)
      StopDrawing ()
EndIf
;}-


If OpenWindow (0, 5, 5, 400, 543, "Tree" , #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
      Tree_0 = TreeGadget ( #PB_Any , 5, 5, 390, 535)
EndIf

; FICHIERS CONCERNES ou répertoire de départ
;               
Chem$ = "C:\Program Files (x86)\"  ; <<==== ICI La base du répertoire de la recherche
ExtensionA_Chercher$ = "*.exe"            ; <<==== ICI L'extension ou base de fichier a rechercher
;
ListeFichiers(0, Chem$, ExtensionA_Chercher$)
;
Repeat
      Event = WaitWindowEvent ()
Until Event = #PB_Event_CloseWindow
End 



;-Procédures Recursive...
Procedure ListeFichiers(NumDir.l, NameDir.s, Ext.s)
      
      File.s : NameDir = Trim (NameDir)
      ; Vérification de la chaine
      If Right (NameDir,1) = "." : NameDir = Left (NameDir, Len (NameDir)-1) : EndIf
      If Right (NameDir,1)<> "\" : NameDir+ "\" : EndIf
      
      ; Vérification de l'extension
      If Right (Ext, 1) = "*" Or Ext = ""
            NoExt = #True
      Else
            If FindString (Ext, "." , 1)
                  Ext = GetExtensionPart (Ext) : NoExt = #False
            Else
                  Ext = Ext : NoExt = #False
            EndIf
      EndIf
      
      If ExamineDirectory (NumDir, NameDir, "*.*" )
            While NextDirectoryEntry (NumDir)
                  File = DirectoryEntryName (NumDir)
                  
                  Select DirectoryEntryType (NumDir)
                        Case #PB_DirectoryEntry_File
                              
                              Select NoExt
                                    Case #True
                                          ; ********** Avec extension *********
                                          AddGadgetItem (Tree_0, -1, File, ImageID ( #ImgFile ), NumDir)
                                          ; ***********************************
                                    Case #False
                                          ;*********** Sans Extension *********
                                          If GetExtensionPart (File) = Ext
                                                AddGadgetItem (Tree_0, -1, File, ImageID ( #ImgFile ), NumDir)
                                                
                                          EndIf
                                          ; ***********************************
                              EndSelect
                        Case #PB_DirectoryEntry_Directory
                              If DirectoryEntryName (NumDir) <> "." And DirectoryEntryName (NumDir) <> ".."
                                    ; ***********************************
                                    AddGadgetItem (Tree_0, -1, DirectoryEntryName (NumDir), ImageID ( #ImgFold ), NumDir)
                                    ;
                                    ; ************  ICI ***********************
                                    ListeFichiers(NumDir +1, NameDir + File, Ext)
                                    ;
                              EndIf
                  EndSelect
            Wend
            FinishDirectory (NumDir)
      EndIf
EndProcedure
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Avatar de l’utilisateur
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Désincarcérer un thread

Message par Zorro »

sinon tu as ceci , plus court, tu meurt (mais pas de filtre, ça ressort tout !! )

Code : Tout sélectionner


Procedure.s ParseDirectory(folder.s, id.l = 0) 
  If Right(folder, 1) <> "\"
    folder + "\"
  EndIf 
  If ExamineDirectory(id, folder, "*.*") 
    While NextDirectoryEntry(id) 
      If DirectoryEntryName(id) <> "." And DirectoryEntryName(id) <> ".." 
        ;##########################################
        Debug folder + DirectoryEntryName(id)
        ;########################################## 
        If DirectoryEntryType(id) = #PB_DirectoryEntry_Directory
          ParseDirectory(folder + DirectoryEntryName(id), id + 1)
        EndIf 
      EndIf 
    Wend 
    FinishDirectory(id) 
  EndIf 
EndProcedure

ParseDirectory("C:\Program Files (x86)\") 
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Avatar de l’utilisateur
SPH
Messages : 4726
Inscription : mer. 09/nov./2005 9:53

Re: Désincarcérer un thread

Message par SPH »

10*100 merci a vous 2 (ca fait 1000 merci) :mrgreen:

Ca maaaaarche :idea:
http://HexaScrabble.com/
!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.00 - 64 bits
Répondre