A la conquête du delay...

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions

Pensez-vous que maîtriser le durée du Delay dans une boucle principale est important ?

Oui
12
60%
Non
4
20%
Raf
4
20%
 
Nombre total de votes : 20

lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message par lionel_om »

comtois a écrit : Ce qui pourrait donner

Code : Tout sélectionner

Event = WindowEvent()

Select Event

  Case 0
    Delay(10)
  
  ...  
Peut être simplifié par un :

Code : Tout sélectionner

Event = WindowEvent(10)
dans les dernières versions de PB.

/Lio
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

Ben, au moins tu m'as motivé à passer à la version 4.20 pour vérifier ce que tu écris !

C'est pas très exact... Il n'y a pas d'arguments pour WindowEvent()...

En fait, cette méthode n'est pas adaptée car elle empêche tout repos (ou passage à une autre tâche) lorsque, par exemple on sollicite en permanence une simple touche.

Jacobus a écrit un code pour montrer sa méthode, c'est elle la mieux adaptée. Le CPU monitor le confirme...

En gros, on a :

Code : Tout sélectionner

Repeat
  Delay(MainDelay)
  x = InputMessage()
  Select x

    Case #EventA
      For i = 0 to n
        ; CodeA
        Delay(SubDelay)
      Next     

    Case #EventB
      ; Code B1
      Delay(SubDelay)
      ; Code B2

  EndSelect
Until Quit
Le but étant de déterminer MainDelay (grosse valeur) et SubDelay (petite valeur) à partir de la puissance du CPU, celle du GPU et l'assiduité de fin du Delay >> Quand on met Delay(1), sur une bécane avec certain anti-virus, il revient plus tard qu'après 1 seule ms systématiquement.

L'idéal ce serait de pouvoir remplacer les délais par une instruction de mesure et exécuter le code une première fois pour faire un étalonnage. Seulement c'est impossible...
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

Ollivier a écrit :C'est pas très exact... Il n'y a pas d'arguments pour WindowEvent()...

il a surement voulu dire :)
Evenement = WaitWindowEvent([Minuteur])
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message par lionel_om »

Dobro a écrit :il a surement voulu dire :)
Evenement = WaitWindowEvent([Minuteur])
Exact, désolé... Ca fait un pb moment que je n'ai vraiment utilisé PB !
Mais aussi, grâce au nouvel argument facultatif de WaitWindowEvent(), selon moi WindowEvent() est inutile !!!

/Lio :oops:
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
Octavius
Messages : 312
Inscription : jeu. 26/juil./2007 12:10

Message par Octavius »

Ca dépend dans quelles conditions on travaille. Dans certaines conditions, en tout cas par exemple avec un écran fenêtré et l'InitMouse() activé, le WaitWindowEvent() détecte en permanence le #WM_MOUSEMOVE lorsqu'on bouge la souris, ce qui fait décoller le temps CPU, j'utilise donc un Delay(1) systématiquement.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

Octavius a écrit :Ca dépend dans quelles conditions on travaille. Dans certaines conditions, en tout cas par exemple avec un écran fenêtré et l'InitMouse() activé, le WaitWindowEvent() détecte en permanence le #WM_MOUSEMOVE lorsqu'on bouge la souris, ce qui fait décoller le temps CPU, j'utilise donc un Delay(1) systématiquement.
ben non !! :)

tu fait simplement WaitWindowEvent(1) :)
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

Bah, on va bien voir. C'est peut-être la moins pire des solutions.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

j'ajouterai qu'il faudrai recuperer le rafraichisement de l'ecran

et l'utiliser dans le Evenement = WaitWindowEvent(100/rafraichissement de l'ecran)

j'ai remarqué un affichage plus stable lorsqu'on met la meme valeur que le rafraichissement du Monitor/100 :)
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

Tu peux mettre un code pour cette dernière?
Octavius
Messages : 312
Inscription : jeu. 26/juil./2007 12:10

Message par Octavius »

Dobro a écrit :
Octavius a écrit :Ca dépend dans quelles conditions on travaille. Dans certaines conditions, en tout cas par exemple avec un écran fenêtré et l'InitMouse() activé, le WaitWindowEvent() détecte en permanence le #WM_MOUSEMOVE lorsqu'on bouge la souris, ce qui fait décoller le temps CPU, j'utilise donc un Delay(1) systématiquement.
ben non !! :)

tu fait simplement WaitWindowEvent(1) :)
Mais non ! WaitWindowEvent(1) attends une microseconde s'il ne se passe rien, or si on bouge tout le temps la souris il se passe tout le temps l'événement #WM_MOUSEMOVE, donc il faut un Delay(1) pour ralentir la boucle même s'il se passe quelque chose !
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

bon et ça ça attends peut etre ??

tu n'as manifestement pas compris le role de Delay()

mais pour faire court, cela correspond a DoEVENT() du Visual Basic

ça n'attends, pas vraiment, ça rends la main au systeme (a Windows)

voici un code qui montre que WaitWindowEvent(100/60) ; (ici mon monitor est a 60 FPS) c'est pareil que WindowEvent() + un delay derriere

t'a qua changer pour voir que justement, ça change rien :D

(vous remarquerez au passage l'immense qualité artistique de mon exemple :) )

Code :


  ; code Dobro
LoadFont (1, "arial" , 50 )
LoadFont (2, "arial" , 50 )
Resultat = InitSprite ()
Global angle,Amplitude
Amplitude=10
Texte.s= "Le Lac d'annecy !"

WindowID = OpenWindow (1, 50, 50, 640, 200, "hello" , #PB_Window_SystemMenu|#PB_Window_MinimizeGadget )
WindowID = WindowID (1)
OpenWindowedScreen ( WindowID , 0, 0, 640, 200, 1, 0, 0)

CreateImage (100, 640, 100)
StartDrawing ( ImageOutput (100))
     FrontColor ( RGB ($0,$FF,$FF))
     BackColor ( RGB (0, 0, 0))
    
    
     DrawingFont ( FontID (1))
     DrawingMode (1)
    
     DrawText (0,0,Texte.s)
StopDrawing ()

For t=0 To 100
     GrabImage (100, t, 0, t, 640,1)
Next t
Repeat
    
    
     For Y= 0 To 100
         StartDrawing ( ScreenOutput ())
            angle+1 : If angle=360*10: angle=0 : EndIf
            x=1+( Sin (angle*2*3.1415926/50)* Amplitude)
             DrawImage ( ImageID (Y), x+40, Y+20*x/25+50,640,1)
         StopDrawing ()
        dep+1 : If dep>640 :dep=-100: EndIf
     Next Y
    
     StartDrawing ( ScreenOutput ())
         DrawingFont ( FontID (2))
         DrawingMode (1)
         FrontColor ( RGB ($95,$25,$BA))
         BackColor ( RGB (0, 0, 0))
         DrawText (40,0,Texte.s)
     StopDrawing ()
    
     FlipBuffers ()
     ClearScreen ( RGB (0, 0, 0))
    event= WaitWindowEvent (100/60)
     ;Delay(1)
Until event= #PB_Event_CloseWindow

[/code]
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message par lionel_om »

Dobro a écrit :tu n'as manifestement pas compris le role de Delay()

mais pour faire court, cela correspond a DoEVENT() du Visual Basic

ça n'attends, pas vraiment, ça rends la main au systeme (a Windows)
Je pense qu'Octavius a raison :
Met un Delay(200), ton exemple va "ramer".


En effet ces deux codes ne renvoient pas au même :

Code : Tout sélectionner

WaitWindowEvent(100)

Code : Tout sélectionner

WaitWindowEvent(): Delay(100)
Par contre le premier est équivalent à celui-ci:

Code : Tout sélectionner

If WaitWindowEvent() = 0: Delay(100): EndIf
/Lio
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

lionel_om a écrit :
Dobro a écrit :tu n'as manifestement pas compris le role de Delay()

mais pour faire court, cela correspond a DoEVENT() du Visual Basic

ça n'attends, pas vraiment, ça rends la main au systeme (a Windows)
Je pense qu'Octavius a raison :
Met un Delay(200), ton exemple va "ramer".
c'est normal tu donne 200 milliseconde au system

pendant ce temps ton prg se fige !! :roll:
En effet ces deux codes ne renvoient pas au même :

Code:
WaitWindowEvent(100)

Code:
WaitWindowEvent(): Delay(100)
je pense que si :)
Avatar de l’utilisateur
Jacobus
Messages : 1559
Inscription : mar. 06/avr./2004 10:35
Contact :

Message par Jacobus »

Un autre exemple d'utilisation du Delay() dans la Doc avec PauseThread()
A noter que je n'ai pas noté de grosse différence de l'usage cpu avec ou sans Delay() dans les Threads. La charge est autour des 90% à 100% avec des chutes à 70% par moment. (essais sur Windows Vista 32 bits et IP Dual core)...
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message par djes »

Dobro a écrit :(delay) ça rends la main au systeme (a Windows)
Evidemment que ça rend la main au système, puisque tu es dans un système multitâches (sic). Seulement, ton programme ne peut plus rien faire pendant la durée indiquée. Sa file d'attente se remplit des messages qui lui sont envoyés par windows, et qu'il faudra traiter au "réveil".
Répondre