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

poshu
Messages : 1138
Inscription : sam. 31/juil./2004 22:32

Message par poshu »

Dobro a écrit :
En effet ces deux codes ne renvoient pas au même :

Code:
WaitWindowEvent(100)

Code:
WaitWindowEvent(): Delay(100)
je pense que si :)
Non, non, ça ne revient pas dutout au même: le premier rendra la main au système pendant un MAXIMUM de 100 ms, si aucun événement n'arrive dans la pile du programme (aucune sensation de plantage donc); alors que le delay(100) rendra la main pendant exactement 100 ms, et là, tu peux faire tout ce que tu veux, le programme ne répondra pas.
beauregard
Messages : 1307
Inscription : dim. 08/juil./2007 18:32
Localisation : Toulouse

Message par beauregard »

nous en sommes à la 3ème page, sujet hautement sensible n'est-il pas ?
Ollivier a écrit :- La première : ça fait 7 ans que j'ai découvert Comtois.
voyant que tu es inscrit depuis le 29/06/2007, je pensais tout naturellement que tu était là depuis 1 an.
Ollivier a écrit :Aussi, je viens de faire le transfert de ces deux oeuvres et les tester : Le travail est original et me montre que, toi aussi tu en sais des choses !

Seulement, c'est avec véritable dérangement que je t'apprends que leur exécution me bouffe de la batterie sur 2 machines distinctes. Autrement dit : compatibilité négative avec une machine à puissance limitée.
grâce à Dobro et les membres qui m'ont gentilments donné un coup de main.

Peur basique est à ses débuts un programme de test des sprite3D, donc c'est un code qui forcément mettra en difficulté les anciennes machines. Le eeepc avec ses 8Mo de vram et sa faible résolution va tirer la langue !

Vers l'infini est à ses débuts un programme de test des listes chainées, donc c'est un code qui n'a pas le même but que peur basique. Sur mon vieux PC(amd athlonxp 1700+ et son ati rv100 64vram) vers l'infini tourne sans accroc.

conclusion: sur un eeepc, l'utilisation des sprite3D doit se faire avec parcimonie( et encore, personne n'a eu l'idée de tester vers l'infini avec un eeepc, il est fort possible que cette machine abhorre les sprites3D).
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

beauregard a écrit :voyant que tu es inscrit depuis le 29/06/2007, je pensais tout naturellement que tu était là depuis 1 an.
ne te fie pas au date marqué dans CE forum

ça fait 3 fois (p'tet mem 4 :lol: ) qu'on change de Forum
et moi par exemple, je suis parti puis revenu !


les plus anciens du forums , Comtois,Chris, Oliv, Denis,Le Soldat inconnu
Cederavick,Nico, etc (j'en oublie pas mal) ... (moi) sommes la depuis plus de 8 ans pour certains !! :)
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message par lionel_om »

Essaye avec ce code DoBro :

Code : Tout sélectionner

; Auteur : Chris
; Version de PB : 4
;
; Explication du programme :
; Pour connaître toutes les informations concernant l'objet sous la souris

; Question : Comment pourrais je savoir quel est le gadget présent sous la souris ?


;- Enumérations
Enumeration
  #Window_0
EndEnumeration

Enumeration
  #Btn_Ok
  #String_0
  #IP_0
  #Combo_0
  #List_0
  #Btn_Img_0
  #Progress_0
  #Track_0
  #Btn_Quit
  #Btn_Cancel
EndEnumeration

; Appels de Structures. <-- Je sais pas si on dit ça, mais je me comprends.
CurPos.POINT
R.RECT
Parent.RECT
FP.RECT

;- Procédures
Procedure Open()
  If OpenWindow(#Window_0, 300, 200, 400, 360, "Détection des objets", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget, 0)
    hwnd = WindowID(#Window_0)
    SetWindowPos_(hwnd, #HWND_TOPMOST, WindowX(#Window_0), WindowY(#Window_0), WindowWidth(#Window_0), WindowHeight(#Window_0) + 32, #SWP_SHOWWINDOW)
    If CreateGadgetList(hwnd)
      EditorGadget(#String_0, 5, 5, 385, 320)
      For i = 0 To 22
        AddGadgetItem(#String_0, -1, " ")
      Next
      ButtonGadget(#Btn_Quit, 150, 330, 100, 25, "Quit")
      ProcedureReturn hwnd
    EndIf
  EndIf
EndProcedure

Procedure SetText(Handle, x, y, w, h, hParent, h_hParent, xP, yP, wP, hP, IDWindow, Name$, NameParent$)
  If hParent = 0 : NameParent$ = "Aucun" : EndIf
  SetGadgetItemText(#String_0, 0, "--------- Références de l'objet pointé", 0)
  SetGadgetItemText(#String_0, 2, "Handle de l'objet= " + Str(Handle), 0)
  SetGadgetItemText(#String_0, 3, "Position X = " + Str(x), 0)
  SetGadgetItemText(#String_0, 4, "Position Y = " + Str(y), 0)
  SetGadgetItemText(#String_0, 5, "Largeur = " + Str(w), 0)
  SetGadgetItemText(#String_0, 6, "Hauteur = " + Str(h), 0)
  SetGadgetItemText(#String_0, 7, "ID de l'objet = " + Str(IDWindow), 0)
  SetGadgetItemText(#String_0, 8, "Nom de classe = " + Name$, 0)
  SetGadgetItemText(#String_0, 10, "--------- Références du parent direct", 0)
  SetGadgetItemText(#String_0, 12, "Handle du Parent = " + Str(hParent), 0)
  SetGadgetItemText(#String_0, 13, "Position X du Parent = " + Str(xP), 0)
  SetGadgetItemText(#String_0, 14, "Position Y du Parent = " + Str(yP), 0)
  SetGadgetItemText(#String_0, 15, "Largeur du Parent = " + Str(wP), 0)
  SetGadgetItemText(#String_0, 16, "Hauteur du Parent = " + Str(hP), 0)
  SetGadgetItemText(#String_0, 17, "Nom de classe = " + NameParent$, 0)
  SetGadgetItemText(#String_0, 19, "--------- Références de la première fenêtre", 0)
  SetGadgetItemText(#String_0, 21, "Handle fenêtre Mère = " + Str(h_hParent), 0)
EndProcedure

;- Programme
hwnd = Open()
SetTimer_(hwnd, 1, 50, 0)

Repeat
  GetCursorPos_(CurPos) ; Position du curseur
  ; / Relatif à la Zone survolée
  Handle = WindowFromPoint_(CurPos\x, CurPos\y) ; Handle de la zone survolée
  GetWindowRect_(Handle, R) ; Dimensions de la zone survolée
  hParent = GetParent_(Handle)
  If hParent <> 0 ; Si "Handle" à un parent
    tmp = hParent ; stockage temporaire du handle du parent
    Repeat
      hTemp = GetParent_(tmp) ; Recherche du parent
      If hTemp = 0 ; Si la recherche donne 0, le handle précédent est celui
        h_hParent = tmp ; de la fenêtre mère
        GetWindowRect_(h_hParent, FP)
        Break
      Else
        tmp = hTemp
      EndIf
    Until hTemp = 0
  EndIf
  
  x = R\left : y = R\top : x2 = R\right : y2 = R\bottom : w = x2 - x : h = y2 - y
  xP = FP\left : yP = FP\top : x2P = FP\right : y2P = FP\bottom : wP = x2P - xP : hP = y2P - yP
  x - xP : y - yP
  
  IDWindow = GetWindowLong_(Handle, #GWL_ID)
  Name$ = Space(256)
  GetClassName_(Handle, @Name$, 256)
  NameParent$ = Space(256)
  GetClassName_(hParent, @NameParent$, 256)
  
  
  EventID = WaitWindowEvent(1000)
  ;Delay(1000)
  Select EventID
    Case #WM_TIMER
      SetText(Handle, x, y, w, h, hParent, h_hParent, xP, yP, wP, hP, IDWindow, Name$, NameParent$)
      
    Case #PB_Event_CloseWindow : Quit = 1
    Case #PB_Event_Gadget
      Select EventGadget()
        Case #Btn_Quit : Quit = 1
      EndSelect
  EndSelect
Until Quit = 1 : End
Change au niveau du "WaitWindowEvent()", en commentant/décommentant ce qu'il faut. Tu verras qu'avec le Delay() c'est frezzé (normal) alors qu'en utilisant le paramètre optionnel (nommé, pas pour rien, "TimeOut" dans la doc) que le résultat n'est pas du tout identique !!!

/Lio
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
beauregard
Messages : 1307
Inscription : dim. 08/juil./2007 18:32
Localisation : Toulouse

Message par beauregard »

beauregard a écrit :
Dobro a écrit : depuis plus de 8 ans pour certains !! :)
ils ont alors vu grandir pb :) son premier crie, la reconnaissance des couleurs et des formes... et bientôt un autre grand moment d'émotion: ses premiers pas un peu hésitant dans un monde hostile, la 3D.
lionel_om a écrit :Change au niveau du "WaitWindowEvent()", en commentant/décommentant ce qu'il faut. Tu verras qu'avec le Delay() c'est frezzé (normal) alors qu'en utilisant le paramètre optionnel (nommé, pas pour rien, "TimeOut" dans la doc) que le résultat n'est pas du tout identique !!!/Lio
finalement, non. Ou alors pour de petits jeux. Et puis définitivement non, car après on risque de ne pas comprendre l'origine d'une sérieuse chute de fps si le petit jeu devient grand...
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

Sinon, en ce qui concerne « la conquête du délai », je voulais savoir si l'utilisation d'un Delay(0) était à négliger ou pas.

Je me pose la question car j'ai trouvé une différence de fonctionnement entre deux codes semblables à une ligne près.

Au sein du code suivant, j'ai placé la partie A et la partie B. Ce sont deux codes semblables sauf que la partie A contient un Delay(0) juste après la création de chacun de ses thread.

J'ai pu remarquer une instabilité de fonctionnement dans la partie B, dépourvue de ce Delay(0).

Est-ce le cas sur toutes les machines ?

Code : Tout sélectionner

; Le code se résume à cliquer 2 x 7 fois (7 requête pour chacune des 2 parties de code)
;*********************************************************************************************
; On crée une structure inconnue
;*********************************************************************************************
Structure UNKNOWN ; Dans cette structure inconnue, on sait seulement qu'il y a...
  Void.L     ; Un entier fourre-tout
  ThreadOn.L ; Un autre entier qui contient le nombre de thread en cours
  TitleExt.S ; Extension à rajouter dans le titre des requêtes 
             ; (pour indiquer si c'est la partie A ou la partie B qui est en cours d'exécution)
EndStructure

;*********************************************************************************************
; On déclare la procédure utilisée pour chaque thread à faire fonctionner
;*********************************************************************************************
Declare.L MessReqProc(*U.UNKNOWN)

;*********************************************************************************************
; On démarre les sept threads
;*********************************************************************************************
; Toutes les 50 millisecondes, on vérifie la présence de threads en cours de fonctionnement
; En effet, s'il n'y a plus rien en fonctionnement, on termine la boucle en cours...
;*********************************************************************************************

;_____________________________________________________________________________________________
;¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
; PARTIE A : Un delay(0) a été inséré et ça marche
;_____________________________________________________________________________________________
;¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
  *U.UNKNOWN = AllocateMemory(SizeOf(UNKNOWN) ) ; applique la structure inconnue à un buffer
  *U\TitleExt = "A"  
  For i = 7 To 1 Step -1
    *U\Void = i - 1 ; Utilise le champs Void de la structure inconnue
                    ; pour définir la requête en fonction du thread
    CreateThread(@MessReqProc(), *U) ; Crée le thread
    
    Delay(0) ; Attend un peu ?                                         <<<<<<<<<<<<<   /!\
    
  Next i

  Repeat
  
    Delay(50)
    
  Until *U\ThreadOn <= 0
;_____________________________________________________________________________________________
;¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
; PARTIE B : Sans Delay(0), c'est instable
;_____________________________________________________________________________________________
;¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
  *U.UNKNOWN = AllocateMemory(SizeOf(UNKNOWN) ) ; applique la structure inconnue à un buffer
  *U\TitleExt = "B"    
  For i = 7 To 1 Step -1
    *U\Void = i - 1 ; Utilise le champs Void de la structure inconnue
                    ; pour définir la requête en fonction du thread
    CreateThread(@MessReqProc(), *U) ; Crée le thread
    
    ; Delay(0) ; Attend un peu ?                                         <<<<<<<<<<<<<   /!\
    
  Next i

  Repeat
  
    Delay(50)
    
  Until *U\ThreadOn <= 0
;_____________________________________________________________________________________________
;¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
  
;*********************************************************************************************
; ...Et on quitte
;*********************************************************************************************
  End

;*********************************************************************************************
; Procédure de fonctionnement d'un thread
;*********************************************************************************************

Procedure.L MessReqProc(*U.UNKNOWN)
  *U\ThreadOn + 1 ; On annonce un thread en plus
  MessageRequester("Requêtes (Partie " + *U\TitleExt+ ")", "Mode n°" + Str(*U\Void), *U\Void) ; On passe la main...
                                                                ;...A une instruction native
  ; Une fois la main reprise...
  *U\ThreadOn - 1 ; ...On annonce qu'il y a un thread en moins
EndProcedure

beauregard
Messages : 1307
Inscription : dim. 08/juil./2007 18:32
Localisation : Toulouse

Message par beauregard »

Ollivier a écrit :Est-ce le cas sur toutes les machines ?
heu..., non. Ce code fonctionne normalement sur mon vieux PC avec winxp. Aurai-tu une machine préhistorique ? Dans ce cas, elle doit regretter le bon vieux temps* ! ;)

* A savoir purebasic version 3.94, sur un disque dur préalablement formaté.
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

Ah? Tiens... Attends, je vais rectifier le tir...

[Edit] >> Ah ! Il y a un noeud...
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message par Ollivier »

Houlà ! Je me bouffe mon propre dentier...

Une différence entre la version 4.10 et 4.20 : Le Delay(0) ne sert strictement à rien à partir de la 4.20. Donc ce dernier code est inutile...

Vive la perte de temps...
Répondre