Thyphoon,
Voici un exemple de barre de progression :
Code : Tout sélectionner
Procedure ProgressBar(x.l, y.l, width.l, height.l, percentage.f)
DrawingMode(0)
Box(x, y, width, height, #White)
Box(x, y, width * percentage / 100, height, #Blue)
DrawingMode(1)
BackColor(0, 0, 0)
FrontColor(255, 255, 255)
Text.s = "Loading files ..."
Locate((x + width - TextLength(Text)) / 2, y + height + 2)
DrawText(Text)
EndProcedure
ScreenWidth = GetSystemMetrics_(#SM_CXSCREEN)
ScreenHeight = GetSystemMetrics_(#SM_CYSCREEN)
ScreenDepth = 0
If InitSprite() And InitMouse() And InitKeyboard()
If ExamineScreenModes()
While NextScreenMode()
If ScreenModeWidth() = ScreenWidth And ScreenModeHeight() = ScreenHeight
If ScreenModeDepth() > ScreenDepth
ScreenDepth = ScreenModeDepth()
EndIf
EndIf
Wend
EndIf
If OpenScreen(ScreenWidth, ScreenHeight, ScreenDepth, "")
Lof = 500
Quit = #False
Repeat
FlipBuffers(0)
ClearScreen(0, 0, 0)
;
; On simule un processus qui tourne d'autre part
;
If Loc < Lof
Loc + 1
ElapsedMilliseconds = ElapsedMilliseconds()
If ElapsedMilliseconds - OldElapsedMilliseconds => 100
StartDrawing(ScreenOutput())
ProgressBar(10, 10, 200, 20, 100 * Loc / Lof)
StopDrawing()
EndIf
EndIf
;
ExamineKeyboard()
If KeyboardPushed(#PB_Key_Escape) : Quit = #True : EndIf
Delay(1)
Until Quit
CloseScreen()
EndIf
EndIf
End
Le principe ici est de faire appel à une procédure de dessin sans prendre le risque de de saturer le processeur.
On doit donc gérer le temps alloué au dessin.
La boucle de raffraichissement des buffers est poussée au maximum par FlipBuffers(0), mais limitée tout de même avec un Delay(1), pour éviter de saturer également (le délai peut être augmenté sur les CPU plus lentes).
Attention à bien régler les différents élements de gestion du temps, en fonction de la plate-forme de production utilisée, car les temps de réponse peuvent varier de manière significative.
Si le dessin se limite à des objets aussi simples que cette barre de progression, la charge de calcul et de transfert mémoire est faible, mais si il faut raffraichir de nombreux objets dans le dessin, on peut tomber sous les performances de la vidéo et du processeur.
Cette manière de procéder permet de gérer simplement les choses sans passer par un thred ou un callback.
Ce n'est pas la plus jolie manière de programmer, mais c'est très efficace et le code reste facile à maintenir.
Disons que pour un interface utilisateur bien structuré celà peut donner toutes satisfactions.
Mon avatar reproduit l'image de 4x1.8m présentée au 'Salon international du meuble de Paris' en janvier 2004, dans l'exposition 'Shades' réunisant 22 créateurs autour de Matt Sindall. L'original est un stratifié en 150 dpi.