Page 1 sur 2
Fenêtre de progression
Publié : jeu. 09/juin/2011 21:33
par Droopy
Bonsoir,
Un petit code pour afficher une fenêtre de progression pendant que votre programme principal fait autre chose
Code : Tout sélectionner
Enumeration
#HAUTEUR=80
#LARGEUR=200
#PROGRESSION
#TEXTE
#STATUS
EndEnumeration
Global FermerFenetre,FenetreInitialisee
Procedure Visuel(*ptr)
OpenWindow(0,0,0,#LARGEUR,#HAUTEUR,"Titre",#PB_Window_ScreenCentered)
TextGadget(#TEXTE,10,10,#LARGEUR-20,20,"",#PB_Text_Center)
ProgressBarGadget(#PROGRESSION,10,30,#LARGEUR-20,20,0,100,#PB_ProgressBar_Smooth)
CreateStatusBar(#STATUS,WindowID(0))
AddStatusBarField(#LARGEUR)
AddWindowTimer(0,123,250)
FenetreInitialisee=#true
Repeat
If WaitWindowEvent()= #PB_Event_Timer
Value = (Value + 5) % 100
SetGadgetState(#PROGRESSION,Value)
EndIf
Until FermerFenetre=#true
EndProcedure
Procedure ConsoleText(StatusText.s,Text.s,Delai)
PrintN(Text)
StatusBarText(#STATUS,0," "+StatusText)
SetGadgetText(#TEXTE," "+Text)
Delay(Delai)
EndProcedure
OpenConsole()
ConsoleTitle("Progression")
CreateThread(@Visuel(),0)
Repeat
Delay(1)
Until FenetreInitialisee=#true
ConsoleText("Veuillez patienter (étape 1/3)","Initialisation",2000)
ConsoleText("Veuillez patienter (étape 2/3)","Décompression",2000)
ConsoleText("Veuillez patienter (étape 3/3)","installation",4000)
HideGadget(#PROGRESSION,#true)
ConsoleText("Merci d'avoir patienté","Installation terminée",2000)
FermerFenetre=#true
For n=1 To 80
Delay(100)
Print(".")
Next
Re: Fenêtre de progression
Publié : jeu. 09/juin/2011 22:03
par Kwai chang caine
Merci DROOPY
J'ai un message d'erreur ligne
Peut etre ai-je encore pas compris quelque chose

Re: Fenêtre de progression
Publié : jeu. 09/juin/2011 22:28
par Droopy
Essaye sans le débogueur
Re: Fenêtre de progression
Publié : jeu. 09/juin/2011 22:47
par G-Rom
Visuel() n'a pas d'arguments , rajoute Visuel(void.i) pour voir kcc.
Re: Fenêtre de progression
Publié : ven. 10/juin/2011 7:41
par Backup
...................
Re: Fenêtre de progression
Publié : ven. 10/juin/2011 9:31
par Kwai chang caine
G-Rom a écrit :Visuel() n'a pas d'arguments , rajoute Visuel(void.i) pour voir kcc.
Merci GRom, mais en t'ammeliorant t'as oublié que moi....

J'avais meme pas trouvé ou le rajouter ce Visuel(void.i)
@DOBRO
Merci de la correction ça marche, nickel
@DROOPY
Encore merci a toi, pour le partage, super code

Re: Fenêtre de progression
Publié : ven. 10/juin/2011 10:18
par graph100
@kkc : pour appeler une procedure dans un thread, il lui faut obligatoirement un paramètre.
Code : Tout sélectionner
Procedure exemple(parametre_bidon.l)
; code du thread
EndProcedure
Car lorsque tu appelles le thread, tu lui passes un parametre :
Ici je lui passe 0, car je n'ai pas besoin d'un paramètre pour que ma procedure fonctionne. Mais des fois, ça peut servir pour donner une adresse de variable, ou autre.
Ce que Droopy avait oublié, c'est qu'il faut passer un paramètre obligatoirement, même si c'est un 0

Re: Fenêtre de progression
Publié : ven. 10/juin/2011 18:48
par Droopy
Le code fonctionne très bien chez moi sans aucune correction (j'ai PB 4.51)

Re: Fenêtre de progression
Publié : ven. 10/juin/2011 19:46
par graph100
on doit tous être sur 4.60, (beta 2 pour moi ^^)
Re: Fenêtre de progression
Publié : ven. 10/juin/2011 20:45
par Backup
Droopy a écrit :Le code fonctionne très bien chez moi sans aucune correction (j'ai PB 4.51)

oui moi aussi
mais j'ai XP Sp3 .. ça viens peut etre de là ? ..
(ou alors ta lib fais des siennes et te permet de ne pas avoir besoin de parametres ..

)
Re: Fenêtre de progression
Publié : sam. 11/juin/2011 9:19
par Droopy
Je suis sous 7x64
Re: Fenêtre de progression
Publié : sam. 11/juin/2011 10:40
par Backup
et ça marche meme si tu compile en 32 bits ?
Re: Fenêtre de progression
Publié : sam. 11/juin/2011 10:42
par Le Soldat Inconnu
Je m'excuse par avance mais je vais un peu râler
Je n'aime pas du tout le principe de mettre une boucle d'évènement dans un thread. pour moi, c'est utilisable mais peu générer beaucoup d'erreur de codage, surtout si on veut utiliser ta fenêtre non pas sur une console mais sur une autre fenêtre.
Pour moi, la boucle d'évènement doit toujours être dans la tâche principal. Ce qui permet de toujours avoir les évènements pour toutes les fenêtres visibles. Et le chargement des données, doit par contre être mis dans le thread.
Donc je pense qu'il est plus logique de faire l'inverse de ce que tu as fais. Le chargement dans le thread et l'affichage en normal.
dans ce genre
Code : Tout sélectionner
; Auteur : Le Soldat Inconnu
; Version de PB : 4.50
;
; Explication du programme :
; Pour faire des programmes de test rapidement, il ne reste qu'a rajouter les gadgets et la gestion des évènements.
Enumeration
#Fenetre_Pincipale
#Fenetre_Chargement
#Fenetre_Chargement_Gadget_Etape
#Fenetre_Chargement_Gadget_Progression
EndEnumeration
Procedure Chargement(Parametre)
Protected Progression, Etape
For Etape = 1 To 3
SetGadgetText(#Fenetre_Chargement_Gadget_Etape, "Etape " + Str(Etape) + "/3")
For Progression = 0 To 100
SetGadgetState(#Fenetre_Chargement_Gadget_Progression, Progression)
Delay(50)
Next
Delay(1000)
Next
EndProcedure
; Création de la fenêtre et de la GadgetList
If OpenWindow(#Fenetre_Pincipale, 0, 0, 500, 300, "Principal", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget) = 0
End
EndIf
If OpenWindow(#Fenetre_Chargement, 0, 0, 400, 40, "Chargement", #PB_Window_SystemMenu | #PB_Window_WindowCentered, WindowID(#Fenetre_Pincipale)) = 0
End
EndIf
TextGadget(#Fenetre_Chargement_Gadget_Etape, 0, 0, 400, 16, "")
ProgressBarGadget(#Fenetre_Chargement_Gadget_Progression, 0, 16, 400, 24, 0, 100)
AddWindowTimer(#Fenetre_Chargement, 1, 250)
Chargement_Thread = CreateThread(@Chargement(), 0)
Repeat
Event = WaitWindowEvent()
Select EventWindow()
Case #Fenetre_Pincipale
Select Event
Case #PB_Event_Gadget
Select EventGadget() ; Gadgets
EndSelect
Case #PB_Event_CloseWindow
Quitter = 1
EndSelect
Case #Fenetre_Chargement
Select Event
Case #PB_Event_Gadget
Select EventGadget() ; Gadgets
EndSelect
Case #PB_Event_CloseWindow
Quitter = 1
Case #PB_Event_Timer
Select EventTimer()
Case 1
If IsThread(Chargement_Thread) = 0
CloseWindow(#Fenetre_Chargement)
EndIf
EndSelect
EndSelect
EndSelect
Until Quitter
Re: Fenêtre de progression
Publié : sam. 11/juin/2011 10:51
par Backup
+1

Re: Fenêtre de progression
Publié : sam. 11/juin/2011 11:20
par Chris
Le Soldat Inconnu a écrit :Je m'excuse par avance mais je vais un peu râler
Pour les membres les plus récents ça peut paraître déconcertant, mais pour les anciens ce n'est qu'un retour à un état habituel!
Tu râlais déjà pas mal avant, la seule différence, c'est que tu ne t'excusais pas par avance
