[RESOLU] Capture d'ecran qui foire au bout d'un moment

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Mwoua
Messages : 44
Inscription : lun. 24/oct./2005 10:28

[RESOLU] Capture d'ecran qui foire au bout d'un moment

Message 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
Dernière modification par Mwoua le lun. 10/déc./2007 10:48, modifié 1 fois.
RV
Messages : 209
Inscription : sam. 18/nov./2006 15:16

Message 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? :)
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message par lionel_om »

Moi ca ne plante pas.
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
RV
Messages : 209
Inscription : sam. 18/nov./2006 15:16

Message 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! :?
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message 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.
Dernière modification par lionel_om le dim. 09/déc./2007 23:00, modifié 2 fois.
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
RV
Messages : 209
Inscription : sam. 18/nov./2006 15:16

Message par RV »

FreeDC?

Connais pas! PureBasic non plus! 8O
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message par lionel_om »

RV a écrit :FreeDC?

Connais pas! PureBasic non plus! 8O
Pardon, je parlais bien évidemment de "ReleaseDC_()".
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
RV
Messages : 209
Inscription : sam. 18/nov./2006 15:16

Message 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:
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message par lionel_om »

Par contre on est pas obligé d'obtenir/libérer le DC "GetDC_( WindowID (#window))" à chaque boucle :wink:
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
RV
Messages : 209
Inscription : sam. 18/nov./2006 15:16

Message 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
Mwoua
Messages : 44
Inscription : lun. 24/oct./2005 10:28

Message 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)
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message 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
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
Mwoua
Messages : 44
Inscription : lun. 24/oct./2005 10:28

Message par Mwoua »

Oui, c'est ce que j'ai compris avec (beaucoup) de retard :?
Répondre