Fenêtre de progression

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
Droopy
Messages : 1151
Inscription : lun. 19/juil./2004 22:31

Fenêtre de progression

Message 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
Dernière modification par Droopy le mar. 14/juin/2011 20:39, modifié 1 fois.
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Fenêtre de progression

Message par Kwai chang caine »

Merci DROOPY
J'ai un message d'erreur ligne

Code : Tout sélectionner

CreateThread(@Visuel(),0)
Peut etre ai-je encore pas compris quelque chose :roll:
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
Droopy
Messages : 1151
Inscription : lun. 19/juil./2004 22:31

Re: Fenêtre de progression

Message par Droopy »

Essaye sans le débogueur
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: Fenêtre de progression

Message par G-Rom »

Visuel() n'a pas d'arguments , rajoute Visuel(void.i) pour voir kcc.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Fenêtre de progression

Message par Backup »

...................
Dernière modification par Backup le ven. 30/sept./2011 20:11, modifié 1 fois.
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Fenêtre de progression

Message 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.... :lol:
J'avais meme pas trouvé ou le rajouter ce Visuel(void.i) :oops:

@DOBRO
Merci de la correction ça marche, nickel 8)

@DROOPY
Encore merci a toi, pour le partage, super code 8)
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: Fenêtre de progression

Message 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 :

Code : Tout sélectionner

thread_id = CreateThread(@exemple(), 0)
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 :wink:
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Avatar de l’utilisateur
Droopy
Messages : 1151
Inscription : lun. 19/juil./2004 22:31

Re: Fenêtre de progression

Message par Droopy »

Le code fonctionne très bien chez moi sans aucune correction (j'ai PB 4.51) :?
Avatar de l’utilisateur
graph100
Messages : 1318
Inscription : sam. 21/mai/2005 17:50

Re: Fenêtre de progression

Message par graph100 »

on doit tous être sur 4.60, (beta 2 pour moi ^^)
_________________________________________________
Mon site : CeriseCode (Attention Chantier perpétuel ;))
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Fenêtre de progression

Message 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 .. 8O )
Avatar de l’utilisateur
Droopy
Messages : 1151
Inscription : lun. 19/juil./2004 22:31

Re: Fenêtre de progression

Message par Droopy »

Je suis sous 7x64
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Fenêtre de progression

Message par Backup »

et ça marche meme si tu compile en 32 bits ?
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Re: Fenêtre de progression

Message par Le Soldat Inconnu »

Je m'excuse par avance mais je vais un peu râler :mrgreen:

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
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Fenêtre de progression

Message par Backup »

+1 :)
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Re: Fenêtre de progression

Message par Chris »

Le Soldat Inconnu a écrit :Je m'excuse par avance mais je vais un peu râler :mrgreen:
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 :mrgreen:
Répondre