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.Dobro a écrit :je pense que siEn effet ces deux codes ne renvoient pas au même :
Code:
WaitWindowEvent(100)
Code:
WaitWindowEvent(): Delay(100)
A la conquête du delay...
-
- Messages : 1307
- Inscription : dim. 08/juil./2007 18:32
- Localisation : Toulouse
nous en sommes à la 3ème page, sujet hautement sensible n'est-il pas ?
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).
voyant que tu es inscrit depuis le 29/06/2007, je pensais tout naturellement que tu était là depuis 1 an.Ollivier a écrit :- La première : ça fait 7 ans que j'ai découvert Comtois.
grâce à Dobro et les membres qui m'ont gentilments donné un coup de main.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.
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).
ne te fie pas au date marqué dans CE forumbeauregard a écrit :voyant que tu es inscrit depuis le 29/06/2007, je pensais tout naturellement que tu était là depuis 1 an.
ça fait 3 fois (p'tet mem 4

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 !!

-
- Messages : 1500
- Inscription : jeu. 25/mars/2004 11:23
- Localisation : Sophia Antipolis (Nice)
- Contact :
Essaye avec ce code DoBro :
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
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
/Lio
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
Participez à son extension: ajouter vos programmes et partagez vos codes !
-
- Messages : 1307
- Inscription : dim. 08/juil./2007 18:32
- Localisation : Toulouse
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...beauregard a écrit :ils ont alors vu grandir pbDobro a écrit : depuis plus de 8 ans pour certains !!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
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 ?
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
-
- Messages : 1307
- Inscription : dim. 08/juil./2007 18:32
- Localisation : Toulouse