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

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? 8O

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? 8O

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

Publié : dim. 09/déc./2007 22:59
par lionel_om
RV a écrit :FreeDC?

Connais pas! PureBasic non plus! 8O
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! :)

:wink:

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 :wink:

Publié : dim. 09/déc./2007 23:26
par RV
C'est vrai! :)

Bah c'est Mwoua qui va être content! :D :wink:

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! :D :wink:
C'est clair ! :P :P :P

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 :

Code : Tout sélectionner

ReleaseDC_(#window,GetDC_(GetDesktopWindow_()))
et en fait, le GetDC_(GetDesktopWindow_()) varie ! 8O Du coup, je libérais un DC qui n'étais pas forcément le bon :x . Il faut donc l'enregistrer dans une variable, ici dc2 :

Code : Tout sélectionner

dc2=GetDC_(GetDesktopWindow_())
Encore Merci, en tout cas ! 8)

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 :?