Page 1 sur 1

Quel est l'inrêt de WindowEvent() ?

Publié : jeu. 17/juin/2004 21:58
par Oliv
Quand on fait

Code : Tout sélectionner

Sortie.b
OpenWindow(0,X,Y,200,200,#PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_TitleBar | #PB_Window_ScreenCentered,"")
Repeat
  Select WindowEvent()
    Case #PB_Event_CloseWindow
      Sortie = 1
  EndSelect
  ; commandes ici
Until Sortie = 1
End
Le programme ce comporte comme lorque l'on fait

Code : Tout sélectionner

Sortie.b
OpenWindow(0,120,20,200,200,#PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_TitleBar | #PB_Window_ScreenCentered,"")
SetTimer_(WindowID(),1,1,0)
Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      Sortie = 1
    Case #WM_Timer
     ; commandes ici
  EndSelect
Until Sortie = 1
End
Alors que dans le premier exemple, le programme prend entre 89 et 97% du temps CPU (celon windows) et le second code prend maximum 2%.
Quel est l'inetrêt de cette commande ?
Merci

Publié : jeu. 17/juin/2004 22:03
par Aranoth
l'interet ? quand tu mélange le clavier (keyboard lib) aux gadgets, si tu met WaitWindowEvent, la gestion du clavier va merder alors que si tu met juste WindowEvent, tout va bien^^

Publié : jeu. 17/juin/2004 22:28
par filperj
Par ex, dans un jeu en windowedscreen, le rythme de la boucle principale sera basé sur le FPS, donc on ne voudra pas attendre le prochain évènement.
Evidemment c'est moins économe en temps CPU.

Publié : jeu. 17/juin/2004 23:04
par Backup
mon programme "Fred" les yeux !! tu capture la souris alors quelle n'est pas sur la fenetre !! donc pas d'evenement !! il faut surveille en permanence
ou ce trouve le curseur de souris pour que les yeux suivent le pointeur de souris

pareil une horloge vocale tu recupere en permanence le temps !!

en fait pour pas que ton apli prenne 50% u 10% du temps machine
il suffi de mettre un "delay(1)" apres le repeat de ta boucle principale

c'est selon l'aplication mais tu peut augmenter le delay()
car en fait avec WindowEvent() plus tu met un delay() important
plus tu "rend la main" au system !!! :D
je me ser beaucoup de cette fonction !!
pour faire un jeu 2D ; elle est indispensable
car sinon les sprites se deplaces que si le curseur de souris se trouve sur la fenetre (elle a le focus)

alor qu'avec cette fonction tu gere le multitache !!

Publié : jeu. 17/juin/2004 23:09
par Oliv
Ok, enfait, mon 2ème example reviens au même que avec un delay(1) non ?

Publié : jeu. 17/juin/2004 23:15
par filperj
Non, avec delay(1), le prog attend une millisec, tandis qu'avec waitwindowevent() il attend le prochain évènement, 1 heure s'il le faut :)

Publié : jeu. 17/juin/2004 23:38
par Backup
Filperj a tres bien répondu !! :wink:

voici un exemple
tu decomente la bonne ligne et tu commente l'autre !!
et bouge ta souris tu va voir !! :D

Code : Tout sélectionner

#dobro=1
#Police=1
#Sprite=1
; ***********************************
Resultat = InitSprite()
FontID = LoadFont(#Police, "arial", 18, #PB_Font_Bold )
EcranX = GetSystemMetrics_(#SM_CXSCREEN):;=largeur de l'ecran
EcranY = GetSystemMetrics_(#SM_CYSCREEN):;=hauteur de l'ecran
WindowID = OpenWindow(1, 0, 0, 320, 200,  #PB_Window_SystemMenu|#PB_Window_BorderLess |#PB_Window_ScreenCentered , "hello") 

WindowID = WindowID(1) 
Result = OpenWindowedScreen(WindowID,0,0, 320, 200, 1, 0,0)

CreateSprite(#Sprite, 50, 50 ) 
StartDrawing(SpriteOutput(#Sprite)) 
Box(0, 0, 50, 50 , RGB(255,0,255) )
StopDrawing() 
x=100
y=100

Repeat
    
     event=WaitWindowEvent():; ça ça ne l'est pas !!!
    ;event =WindowEvent() :; ça c'est multitache
    Delay(5)
    x+1
    y+1
    
    
    If x>310
        x=0
        
    EndIf
    If y>199
        y=0
        
    EndIf
    
    
    
    DisplaySprite(#Sprite, x, y) 
    
    
    
    
    
    
    
    
    
    FlipBuffers():; affiche l'ecran
    ClearScreen(0, 0, 0) :;efface l'ecran
    
Until event=#PB_Event_CloseWindow 

Publié : jeu. 17/juin/2004 23:53
par Oliv
Si vous regardez mon 2ème example, j'ai mis un timer :wink:
Sortie.b
OpenWindow(0,120,20,200,200,#PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_TitleBar | #PB_Window_ScreenCentered,"")
SetTimer_(WindowID(),1,1,0)
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
Sortie = 1
Case #WM_Timer
; COMMANDES ICI
EndSelect
Until Sortie = 1
End
et c'est aussi multi-taches, c'est pour ça que je demande si c'est l'équivalent

Edit : Après vérifications sur le jeu que je suis entrain de faire, faire un WindowEvent() avec un delay(1) prend moins d'utilisation CPU que un WaitWindowEvent() avec un timer

Merci

Publié : ven. 18/juin/2004 0:06
par Backup
alors oui avec le timer ça marche !!! :D

je doit avouer que j'ai jamais pense a utiliser ça !!!

bien vu !!

mais j'aime bien ma facon !! :D


reedit :
Après vérifications sur le jeu que je suis entrain de faire, faire un WindowEvent() avec un delay(1) prend moins d'utilisation CPU que un WaitWindowEvent() avec un timer
oui et en plus plus tu augmente de delay()
plus ton jeu est saccade , mais moins tu prend de temp cpu !!

Publié : sam. 19/juin/2004 16:17
par Le Soldat Inconnu
pour comprendre la différence, tu mets un debug windowevent() pour essayer et un autre code avec un debug WaitWindowEvent()

moi, perso, je me sert de windowevent quand j'ai besion de scruté la pos de la souris même si celle-ci est en dehors de la fen, pour faire de l'affichage par exemple