Créer un thread?

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Programmes
Messages : 80
Inscription : mer. 24/mai/2006 12:12

Créer un thread?

Message par Programmes »

Bonjour à tous,
Je suis en train de créer un programme sous PB 4.60 pour faire des exe des fichiers pb de codearchive...
J'ai un soucis, je ne sais pas comment démarrer les fonctions uniquement quand la fenêtre est affiché. Je pense (sauf erreur de ma part), qu'il faut créer un thread? J'ai un doute et je ne sais vraiment pas comment faire...
C'est la ligne RechercherFichiers(Repertoire) qui est mal placé. Voici mon code:

Code : Tout sélectionner

Global Repertoire.s,NFichier
Procedure CreerExe()
    ;1- Créer le répertoire C:\Compilateur
    ;2- Copier le répertoire Purebasic\Compilers\ dans C:\Compilateur\
    ;3- Copier le répertoire Purebasic\PureLibraries\ dans C:\Compilateur\
    ;4- Copier le répertoire Purebasic\Residents\ dans C:\Compilateur\
    r.s="C:\Compil~1\"
    File.s="tmp.pb"
    Exe.s=ReplaceString(File,".pb",".exe")
    Input.s=r+File
    Output.s=r+Exe
    Icon.s=r+"code.ico"
    compiler.s="C:\Compil~1\Compilers\PBCompiler.exe"
    Comp=RunProgram(compiler,Input+" "+"/EXE"+" "+Output+" "+"/ICON"+" "+Icon,"", #PB_Program_Open|#PB_Program_Read)
    If Comp
        While ProgramRunning(Comp)
            If AvailableProgramOutput(Comp)
                Output$+ReadProgramString(Comp)+Chr(13)
            EndIf
        Wend
        CloseProgram(Comp)
    EndIf
EndProcedure
Procedure NombreFichier(Path.s,DId=0);1894<>1850
    If Right(Path,2)<>"\":Path=Path+"\":EndIf
    If ExamineDirectory(DId,Path, "*.*")
        While NextDirectoryEntry(DId)
            Type= DirectoryEntryType(DId)
            Select Type
                Case #PB_DirectoryEntry_File
                    If GetExtensionPart(DirectoryEntryName(DId))="pb" Or GetExtensionPart(DirectoryEntryName(DId))="pbi"
                        NFichier+1
                    EndIf
                Case #PB_DirectoryEntry_Directory
                    If DirectoryEntryName(DId)<>"." And DirectoryEntryName(DId)<>".."     
                        NombreFichier(Path+DirectoryEntryName(DId),DId+1)
                    EndIf
            EndSelect  
        Wend
        FinishDirectory(DId)
    EndIf
EndProcedure
Procedure RechercherFichiers(Path.s,SousRepertoire=1,DirectoryId=0)
    If Right(Path,2)<>"\":Path=Path+"\":EndIf
    If ExamineDirectory(DirectoryId,Path, "*.*");===================>On est obligé de mettre *.*  
        While NextDirectoryEntry(DirectoryId)
            Type= DirectoryEntryType(DirectoryId)
            Select Type
                Case #PB_DirectoryEntry_File
                    If GetExtensionPart(DirectoryEntryName(DirectoryId))="pb"
                        SetGadgetText(100,Path+DirectoryEntryName(DirectoryId))
                        SetGadgetState(101,GetGadgetState(101)+1)
                        ;File.s=DirectoryEntryName(DirectoryId)
                        ;CopyFile(Repertoire+File,"C:\Compilateur\tmp.pb")
                        ;CreerExe()
                        ;File=ReplaceString(File,".pb",".exe")
                        ;RenameFile("C:\Compilateur\tmp.exe",Repertoire+File)
                    EndIf
                Case #PB_DirectoryEntry_Directory
                    If DirectoryEntryName(DirectoryId)<>"." And DirectoryEntryName(DirectoryId)<>".."     
                        If SousRepertoire=1:RechercherFichiers(Path+DirectoryEntryName(DirectoryId),SousRepertoire,DirectoryId+1):EndIf
                    EndIf
            EndSelect  
        Wend
        FinishDirectory(DirectoryId)
    EndIf
EndProcedure
;Rep.s=Space(255):GetCurrentDirectory_(255, @Rep):If Right(Rep,1)<>"\" : Rep+"\":EndIf 
;CopyFile(Rep+"Code.ico","C:\Compilateur\Code.ico")
Repertoire="C:\CodeArchive\"
NombreFichier(Repertoire)
OpenWindow(0,0,0,460,65,"",#PB_Window_ScreenCentered|#PB_Window_BorderLess)
SetWindowColor(0,16698567)
TextGadget(100,5,10,WindowWidth(0)-10,20,"jfksdmqkfljqklmsf")
ProgressBarGadget(101,GadgetX(100),GadgetY(100)+GadgetHeight(100)+5,GadgetWidth(100),20,0,100)
SetGadgetColor(100,#PB_Gadget_BackColor,16698567)
SetGadgetAttribute(101,#PB_ProgressBar_Maximum,NFichier)
RechercherFichiers(Repertoire);===========>C'EST ICI QUE C'EST MAL PLACE!!!
Repeat
    Event=WaitWindowEvent()
    Select Event
        Case #PB_Event_Menu ; We only have one shortcut
            Select EventMenu()
            EndSelect            
        Case #PB_Event_Gadget 
            Select EventGadget()
            EndSelect
        Default 
    EndSelect
Until Event=#PB_Event_CloseWindow
Pour attendre la fin du compilateur, j'ai mis dans CreerExe()

Code : Tout sélectionner

    Comp=RunProgram(compiler,Input+" "+"/EXE"+" "+Output+" "+"/ICON"+" "+Icon,"", #PB_Program_Open|#PB_Program_Read)
    If Comp
        While ProgramRunning(Comp)
            If AvailableProgramOutput(Comp)
                Output$+ReadProgramString(Comp)+Chr(13)
            EndIf
        Wend
        CloseProgram(Comp)
    EndIf
Ne vaut-il pas mieux mettre:

Code : Tout sélectionner

RunProgram(compiler,Input+" "+"/EXE"+" "+Output+" "+"/ICON"+" "+Icon,"",#PB_Program_Wait)
Si vous avez une solution, je suis preneur! Merci à tous d'avance pour vos réponses...
Programmes
Messages : 80
Inscription : mer. 24/mai/2006 12:12

Re: Créer un thread?

Message par Programmes »

Personne ne peut me répondre?
Avatar de l’utilisateur
TazNormand
Messages : 1297
Inscription : ven. 27/oct./2006 12:19
Localisation : Calvados (14)

Re: Créer un thread?

Message par TazNormand »

Programmes a écrit :Bonjour à tous,
Je suis en train de créer un programme sous PB 4.60 pour faire des exe des fichiers pb de codearchive...
Salut

On est quand même à la version 5.22 LTS, tu devrais faire la mise à jour, à moins que ta version ne soit pas officielle ?
Image
Image
Programmes
Messages : 80
Inscription : mer. 24/mai/2006 12:12

Re: Créer un thread?

Message par Programmes »

Aucun soucis de ce côté la ma version est tout à fait officielle et je suis entièrement enregistrer contrairement à ce que tu as l'air de sous entendre!
Si j'utilise la version 4.60 c'est parce ce que j'utilise les librairy de Gnozal et j'ai bien la version 5.22.

De toute façon, je ne vois absolument pas le rapport avec ma demande...
Dernière modification par Programmes le lun. 12/mai/2014 14:54, modifié 2 fois.
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Créer un thread?

Message par falsam »

Quand tu parles de codearchiv je suppose que tu fais référence à ce lien
:arrow: http://www.purearea.net/pb/CodeArchiv/CodeArchiv.html
Sans réaménagement, la plupart des codes de purearea.net ne fonctionnent pas ou plus avec la version 4.60 et supérieur.

Je vais supposer que tu réaménages donc ces codes avec la version 4.60 et donc tu peux passer à la version 5.22 :)

Je ne t'ai pas répondu parce que tout simplement .... je n'ai pas compris ta demande et que je n'avais pas envie de répondre à cotés.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
TazNormand
Messages : 1297
Inscription : ven. 27/oct./2006 12:19
Localisation : Calvados (14)

Re: Créer un thread?

Message par TazNormand »

J'avoue c'est bien ce que je sous-entendais, mais sans aucune agressivité de ma part.
Image
Image
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Créer un thread?

Message par falsam »

Allez je tente de répondre à cotes ...héhé :mrgreen:

Création d'un thread pour parcourir le dossier et sous dossier d'installation de Pure basic.

Code : Tout sélectionner

Enumeration
  #MainForm
  #ListFolder
  #CountFiles
EndEnumeration

Global CountFiles.i, Run.b = #False

;Fonction recurssive pour parcourir un dossier et ses sous dossiers
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) <> ".."
        AddGadgetItem(#ListFolder,-1, folder +Chr(10)+DirectoryEntryName(id))
        countFiles+1
        SetGadgetText(#CountFiles, Str(CountFiles))
        If DirectoryEntryType(id) = #PB_DirectoryEntry_Directory
          ParseDirectory(folder + DirectoryEntryName(id), id + 1)
        EndIf
      EndIf
    Wend
    FinishDirectory(id)
  EndIf
EndProcedure 

Procedure StartThread(*Value)
  ClearGadgetItems(#ListFolder)
  CountFiles=0
  
  ;Listons le contenu du dossier d'installation de Pure Basic
  ParseDirectory(#PB_Compiler_Home)
    
  While Run=#True
  Wend
EndProcedure

If OpenWindow(#MainForm,0,0,400,300,"Lecture d'un dossier(Thread)",#PB_Window_ScreenCentered | #PB_Window_SystemMenu | #PB_Window_SizeGadget)
  TextGadget(#PB_Any, 5, 10, 50, 20, "Fichier(s)")
  TextGadget(#CountFiles, 100, 10, 80, 20, "0")
  ListIconGadget(#ListFolder, 5, 30, 390,250, "Dossier", 200)
  AddGadgetColumn(#ListFolder, 1, "Fichier",200)

  CreateThread(@StartThread(), 0)
  
  Repeat
    Select WaitWindowEvent()
      
      Case #PB_Event_Gadget
        Select EventGadget()       
        EndSelect
      
      Case #PB_Event_SizeWindow
        WWidth=WindowWidth(#MainForm)
        Wheight=WindowHeight(#MainForm)
        ResizeGadget(#ListFolder, #PB_Ignore, #PB_Ignore , WWidth-10, Wheight-75)
      
      Case #PB_Event_CloseWindow
       End
    EndSelect
  ForEver
EndIf
Dernière modification par falsam le lun. 12/mai/2014 20:46, modifié 2 fois.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Programmes
Messages : 80
Inscription : mer. 24/mai/2006 12:12

Re: Créer un thread?

Message par Programmes »

Merci pour ta réponse. En fait je pense que c'est moi qui doit mal expliquer et confondre un peu tout
Je viens de tester ton exemple et c'est bien l'évent sur le bouton "Start" qui déclanche la procédure
Ce que je voudrais, c'est que la procédure démarre automatiquement à l'affichage de la fenêtre c'est pour ça que je parlais de Thread mais sans vraiment savoir ce que c'était.
Pour le moment, j'en suis là:

Code : Tout sélectionner

Repeat
    Event=WaitWindowEvent()
    Select Event
        Case #PB_Event_Menu
            Select EventMenu()
            EndSelect            
        Case #PB_Event_Gadget 
            Select EventGadget()
            EndSelect
        Default 
            If GetGadgetState(102)=0
                If NFichier>0:RechercherFichiers(Repertoire):EndIf;====================================>Appel de la procédure!!!
            ElseIf GetGadgetState(102)>NFichier
                SetGadgetText(100,"")
                SetGadgetState(102,0)
                NFichier=0
            EndIf
    EndSelect
Until Event=#PB_Event_CloseWindow

mais à mon avis c'est pas la meilleur solution...
Quand pensez-vous?
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Créer un thread?

Message par falsam »

Programmes a écrit :Ce que je voudrais, c'est que la procédure démarre automatiquement à l'affichage de la fenêtre
Tu sais facilement si une fenetre est ouverte!

Ajoute un If devant l'ouverture de ta fenêtre.

Code : Tout sélectionner

If OpenWindow(0,0,0,460,65,"",#PB_Window_ScreenCentered|#PB_Window_BorderLess)
    ;Le reste de ton code
EndIf
J'ai modifié mon code en conséquence.
Dernière modification par falsam le lun. 12/mai/2014 15:38, modifié 1 fois.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Programmes
Messages : 80
Inscription : mer. 24/mai/2006 12:12

Re: Créer un thread?

Message par Programmes »

Je veux vraiment aller trop vite! La réponse était vraiment simple et sous mes yeux!
Merci quand même et bonne journée.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Créer un thread?

Message par Backup »

veux pas relancer le debat, mais voir qu'on utilise les procedures pour n'importe quoi ....

les procedures a outrance; sans meme vraiment savoir ce que c'est ....

et vas y que je t'y fourre tout ce que je peux ....

de la creation de thread, a l'ouverture de fenetre, et le pire quelque fois, la boucle principale !
et le tout placé en debut de code , comme ça on met 3 plombes a faire defiler le code ...
vous avez vraiment codé des Gros Listing ?? j'en doute fortement ! :mrgreen:


des Procedures, des Procedures , des Procedures .... toujours des procedures

(sur l'air du poinçonneur des Lilas)
Image

chui l'createur, de procedures ,
j'aime bien, quand fais, des procedures
c'est remede ,a toute allure
j'veux qu'ça dure,
il me faut des procedures , des procedures ,car moi j'aime les procedures... :lol:
Avatar de l’utilisateur
Fig
Messages : 1176
Inscription : jeu. 14/oct./2004 19:48

Re: Créer un thread?

Message par Fig »

Syndrome POO ?
Il y a deux méthodes pour écrire des programmes sans erreurs. Mais il n’y a que la troisième qui marche.
Version de PB : 6.00LTS - 64 bits
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Créer un thread?

Message par Backup »

non , au contraire nostalgie du procédural (le vrais ... celui des origines :) )

celui de faire une procedure parce qu'elle renvoie un resultat ..et qu'elle évite la repetition d'une portion de code, pas pour etre a la mode ;)
j'inclue les sous Programmes ;)

un prg procedurale devrai avoir l'architecture d'une pieuvre

le centre (la tete de la pieuvre) c'est la boucle principale (evenementiel )

les tentacules sont les liens qui vont vers les procédures !

comme la pieuvre le corp se trouve au dessus , les tentacules dessous :)
(c'est pour ça que Fred s'est pris la courge a creer la commande "Declare")

Image


pour moi , meme (s'il m'arrive de le faire a cause de PureForm) , une fenetre ça fait partie de l'initialisation ....
sauf Fenetre Filles eventuel (creation apres lancement du prg ) ...
une fenetre devrai etre créé dans la parti initialisation (avant la boucle principale ... mais apres les declarations et les Variables ... )

creer systématiquement une fenetre en utilisant une procedure, je trouve que ça fait gachi de ressources ....
G-rom va me dire qu'on s'en fout on ne code pas sur des Comodores64 , il aura raison
mais on ne se refait pas ... :) les millions de cycles d'horloges cumulé par des procedures inutiles , finissent par contribuer au réchauffement climatique :lol:


ça peut etre vu comme du snobisme, j'en avait deja parler dans le topic "Beauté d'un code"
mais cette Architecture Strict m'aide a retourner dans des codes Vieux de plusieurs Années ....

ici on répond a un "Debutant" , la moindre des choses c'est de donner une réponse avec un code Simple .....
sans Procedures, qui ne servent a rien ! ... sauf a bouffer de la pile()
je pense que certains s'evertue a utiliser de la procedure a tout vas pour me gaver :mrgreen: ça marche !

on peux bien coder comme on veux, je ne suis pas un flic, mais je me demande a quoi ressemble les codes
des "Procedurier" a outrance ... ça dois etre fatiguant a Tracer ! :roll:
Avatar de l’utilisateur
falsam
Messages : 7317
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Créer un thread?

Message par falsam »

@Dobro: J'ai pris un de mes templates pour ce code. Je t'accorde que le code de décrivant la fenêtre étant court, ça ne valait pas la peine de créer une procédure. j'ai modifié mon code en conséquence :)

Personnellement j'ai une large préférence pour du code structuré avec différentes unités de traitements sous forme de procédure voir même d'include selon l'importance du code. Ça facilite le travail d'équipe et c'est comme ça que j'ai été formé au sein d'IBM et de grosses entreprises ayant des équipes de plus de 30 développeurs par exemple.

je ne sais pas si tu te mettra un jour à Spider basic mais il va falloir t'y faire ..... même la boucle événementielle disparaît. Tu vas faire des binds de la mort avec des tas d'appel à des procédure forcement :mrgreen:

PS : Je me demande même si cette boucle événementielle avec Pure Basic ne devrait pas se retrouver à nouveau dans un état embryonnaire.
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Répondre