Page 1 sur 1
[RESOLU] Capture d'ecran qui foire au bout d'un moment
Publié : sam. 08/déc./2007 16:40
par Mwoua
Salut à tous !
Voici un code qui crée une capture partielle de l'écran, et l'affiche dans une fenêtre, ceci tous les 10 millisecondes.
Mais, bizarre de chez bizarre (en tout cas pour moi

), le prgm prend de plus en plus de ram et de ressources proc' au cours du temps, et va même jusqu'à planter en n'effectuant pas le "startdrawing"
J'ai essayé de mettre un ReleaseDC_(), mais ça change rien.
Je pige pas. Une idée ?
Code : Tout sélectionner
LargCapture=300
HautCapture=300
#window =0
Mouse.POINT
OpenWindow ( #window ,LargCapture/2,HautCapture/2,LargCapture,HautCapture, "")
StickyWindow(#window,1)
Repeat
event=WindowEvent()
BitBlt_(GetDC_ ( WindowID (#window)),0,0,LargCapture,HautCapture,GetDC_(GetDesktopWindow_()),0,0,#SRCCOPY)
StartDrawing (WindowOutput(#window))
GetCursorPos_(Mouse)
xM=Mouse\x
yM=Mouse\y
Box(xM-2, yM-2, 6, 2 ,#Blue)
Box(xM-2, yM+2, 6, 2 ,#Blue)
Box(xM-2, yM, 2, 2 ,#Blue)
Box(xM+2, yM, 2, 2 ,#Blue)
StopDrawing()
Delay(10)
Until event=#PB_Event_CloseWindow
Publié : dim. 09/déc./2007 20:04
par RV
Salut,
J'ai essayé ton code et chez moi aussi ça plante!
Même en passant par un Timer ou un Thread, idem...un moment donné ça plante!
Je pense que le problème vient du fait que tu copies une partie d'écran puis tu dessines dedans et enfin tu l'affiches et tout ça 100 fois par seconde!
Tu en demandes pas un peu de trop la?

Publié : dim. 09/déc./2007 22:19
par lionel_om
Moi ca ne plante pas.
Publié : dim. 09/déc./2007 22:25
par RV
Même en le laissant tourner un moment?
Car pour moi ça fait comme Mwoua, le prog utilise de plus en plus de RAM jusqu'à planter!

Publié : dim. 09/déc./2007 22:29
par lionel_om
RV a écrit :Même en le laissant tourner un moment?
Car pour moi ça fait comme Mwoua, le prog utilise de plus en plus de RAM jusqu'à planter!

Oui c'ets sûr que le mémoire n'ets pas libérée donc ca va planter au bout de ... longtemps.
Il faut utiliser un FreeDC après chaque GetDC. Don c deux et passer par des variables pour mémoriser les DC.
Publié : dim. 09/déc./2007 22:35
par RV
FreeDC?
Connais pas! PureBasic non plus!

Publié : dim. 09/déc./2007 22:59
par lionel_om
RV a écrit :FreeDC?
Connais pas! PureBasic non plus!

Pardon, je parlais bien évidemment de "ReleaseDC_()".
Publié : dim. 09/déc./2007 23:10
par RV
J'ai fais comme tu le disais,
Code : Tout sélectionner
LargCapture=300
HautCapture=300
#window =0
Mouse.POINT
win=OpenWindow ( #window ,LargCapture/2,HautCapture/2,LargCapture,HautCapture, "")
StickyWindow(#window,1)
Repeat
event=WindowEvent()
dc1=GetDC_( WindowID (#window))
dc2=GetDC_(GetDesktopWindow_())
BitBlt_(dc1,0,0,LargCapture,HautCapture,dc2,0,0,#SRCCOPY)
ReleaseDC_(win,dc1)
ReleaseDC_(win,dc2)
StartDrawing (WindowOutput(#window))
GetCursorPos_(Mouse)
xM=Mouse\x
yM=Mouse\y
Box(xM-2, yM-2, 6, 2 ,#Blue)
Box(xM-2, yM+2, 6, 2 ,#Blue)
Box(xM-2, yM, 2, 2 ,#Blue)
Box(xM+2, yM, 2, 2 ,#Blue)
StopDrawing()
Delay(10)
Until event=#PB_Event_CloseWindow
Et effectivement avec ReleasDC_() le prog libère la mémoire!

Publié : dim. 09/déc./2007 23:13
par lionel_om
Par contre on est pas obligé d'obtenir/libérer le DC "GetDC_( WindowID (#window))" à chaque boucle

Publié : dim. 09/déc./2007 23:26
par RV
C'est vrai!
Bah c'est Mwoua qui va être content!
Code : Tout sélectionner
LargCapture=300
HautCapture=300
#window =0
Mouse.POINT
win=OpenWindow ( #window ,LargCapture/2,HautCapture/2,LargCapture,HautCapture, "")
StickyWindow(#window,1)
dc1=GetDC_( WindowID (#window))
Repeat
event=WindowEvent()
dc2=GetDC_(GetDesktopWindow_())
BitBlt_(dc1,0,0,LargCapture,HautCapture,dc2,0,0,#SRCCOPY)
ReleaseDC_(win,dc2)
StartDrawing (WindowOutput(#window))
GetCursorPos_(Mouse)
xM=Mouse\x
yM=Mouse\y
Box(xM-2, yM-2, 6, 2 ,#Blue)
Box(xM-2, yM+2, 6, 2 ,#Blue)
Box(xM-2, yM, 2, 2 ,#Blue)
Box(xM+2, yM, 2, 2 ,#Blue)
StopDrawing()
Delay(10)
Until event=#PB_Event_CloseWindow
ReleaseDC_(win,dc1)
End
Publié : lun. 10/déc./2007 10:47
par Mwoua
RV a écrit :Bah c'est Mwoua qui va être content!
C'est clair !
Super merci à vous deux !
Par contre, c'est bizarre : j'avais aussi pensé que le problème pouvait venir de cette non-libération de mémoire, et j'avais essayé de mettre un ReleaseDC_(), mais de cette façon :
et en fait, le
GetDC_(GetDesktopWindow_()) varie !

Du coup, je libérais un DC qui n'étais pas forcément le bon

. Il faut donc l'enregistrer dans une variable, ici
dc2 :
Encore Merci, en tout cas !

Publié : lun. 10/déc./2007 12:45
par lionel_om
Bah quand tu fais un GetDC_(), tu alloues une nouvelle zone mémoire. Ce n'ets pas juste un simple Get, comme GetGadgetState ou autre...
Lio
Publié : lun. 10/déc./2007 17:39
par Mwoua
Oui, c'est ce que j'ai compris avec (beaucoup) de retard
