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

Code : Tout sélectionner

CreateThread(@Visuel(),0)
Peut etre ai-je encore pas compris quelque chose :roll:

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.... :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)

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 :

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:

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 .. 8O )

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

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