Page 2 sur 3

Publié : ven. 27/juin/2008 23:46
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

Publié : sam. 28/juin/2008 3:48
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...

Publié : sam. 28/juin/2008 8:06
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])

Publié : sam. 28/juin/2008 9:25
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:

Publié : sam. 28/juin/2008 10:34
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.

Publié : sam. 28/juin/2008 11:01
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) :)

Publié : sam. 28/juin/2008 12:59
par Ollivier
Bah, on va bien voir. C'est peut-être la moins pire des solutions.

Publié : sam. 28/juin/2008 13:02
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 :)

Publié : sam. 28/juin/2008 13:26
par Ollivier
Tu peux mettre un code pour cette dernière?

Publié : sam. 28/juin/2008 13:49
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 !

Publié : sam. 28/juin/2008 14:18
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]

Publié : sam. 28/juin/2008 18:59
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

Publié : sam. 28/juin/2008 19:06
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 :)

Publié : sam. 28/juin/2008 19:42
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)...

Publié : sam. 28/juin/2008 20:27
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".