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

Sujets variés concernant le développement en PureBasic
Oliv
Messages : 2117
Inscription : mer. 21/janv./2004 18:39

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

Message 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
Aranoth
Messages : 293
Inscription : sam. 24/janv./2004 12:00
Localisation : Toulouse (31)
Contact :

Message 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^^
Débutant en programmation, notament en C++ ?
Vous souhaitez apprendre ?
filperj
Messages : 395
Inscription : jeu. 22/janv./2004 1:13

Message 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.
Le chaos l'emporte toujours sur l'ordre
parcequ'il est mieux organisé.
(Ly Tin Wheedle)
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message 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 !!
Oliv
Messages : 2117
Inscription : mer. 21/janv./2004 18:39

Message par Oliv »

Ok, enfait, mon 2ème example reviens au même que avec un delay(1) non ?
filperj
Messages : 395
Inscription : jeu. 22/janv./2004 1:13

Message 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 :)
Le chaos l'emporte toujours sur l'ordre
parcequ'il est mieux organisé.
(Ly Tin Wheedle)
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message 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 
Dernière modification par Backup le ven. 18/juin/2004 0:05, modifié 2 fois.
Oliv
Messages : 2117
Inscription : mer. 21/janv./2004 18:39

Message 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
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message 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 !!
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Message 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
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Répondre