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 !!!
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 !!
voici un exemple
tu decomente la bonne ligne et tu commente l'autre !!
et bouge ta souris tu va voir !!
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
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 !!!
je doit avouer que j'ai jamais pense a utiliser ça !!!
bien vu !!
mais j'aime bien ma facon !!
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