Pb rafraichissement

Résolu
cs_mickei Messages postés 15 Date d'inscription vendredi 10 janvier 2003 Statut Membre Dernière intervention 3 octobre 2007 - 2 août 2006 à 13:40
cs_mickei Messages postés 15 Date d'inscription vendredi 10 janvier 2003 Statut Membre Dernière intervention 3 octobre 2007 - 30 août 2006 à 16:26
Bonjour à tous,

Voila je fais un programme qui détecte des couleurs de 6 points pour intéragir en fonction de celles ci.
Pour cela je fais une capture d'écran que je mets dans un picturebox pour ensuite récupérer la valeur RGB du pixel central et ceci pour 6 picturebox en même temps.
Or je dois faire ceci à une fréquence très rapide : 100ms, et au bout d'un moment (qlq minutes), il y a un plantage, la capture ne marche plus, ma fenêtre vb ne se rafraichie plus bref le programme plante complet.

Est ce que vous savez comment je pourrais remédier à ceci?

Merci d'avance.

Micke

12 réponses

Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
30 août 2006 à 16:03
juste qu'il faut libérer le DC obtenu :

Dim hDesktopDc as Long
    hDesktopDc = GetDC ( 0 )
    ...
    ...
    ...
    ReleaseDC 0 , hDesktopDc

Renfield
Admin CodeS-SourceS- MVP Visual Basic
3
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
2 août 2006 à 13:47
Surveille l'occupation mémoire, il y a fort à parier que cela vienne d'une fuite mémoire !

Tu ne doit pas supprimer correctement les DC je pense !
0
FreezerCorp Messages postés 22 Date d'inscription mardi 21 février 2006 Statut Membre Dernière intervention 26 janvier 2007 1
2 août 2006 à 15:38
essaye picturebox.dispose
0
cs_mickei Messages postés 15 Date d'inscription vendredi 10 janvier 2003 Statut Membre Dernière intervention 3 octobre 2007
2 août 2006 à 16:38
effectivvement la mémoire augmente.
Qu'est ce que tu appel les DC?
je ne trouve pas picturebox.dispose
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
2 août 2006 à 19:35
En vb6, tu n'auras pas de dispose : ca ne s'applique quand .NET !

Un DC, c'est un Device Context, c'est un endroit où sont stockées les images. Si tu crée un DC et que tu le vide pas, la mémoire est vite saturée.
Passe nous le bout de code qui permet de faire la capture et qui copie l'image dans le picturebox, le problème vient sûrement de là !
0
cs_mickei Messages postés 15 Date d'inscription vendredi 10 janvier 2003 Statut Membre Dernière intervention 3 octobre 2007
9 août 2006 à 19:44
Dim retAPI      As Long

Picture3.Picture = LoadPicture
 
retAPI = BitBlt(Picture3.hDC, 0, 0, Picture3.ScaleWidth, Picture3.ScaleHeight, GetDC(0), posnour.X - Picture3.ScaleWidth * 0.5, posnour.Y - Picture3.ScaleHeight * 0.5, vbSrcCopy)

Picture3.Refresh

'fait la cible
Picture3.Line (Picture3.ScaleWidth / 2, 0)-(Picture3.ScaleWidth / 2, Picture3.ScaleHeight), vbBlack

Picture3.Line (0, Picture3.ScaleHeight / 2)-(Picture3.ScaleWidth, Picture3.ScaleHeight / 2), vbBlack
0
cs_mickei Messages postés 15 Date d'inscription vendredi 10 janvier 2003 Statut Membre Dernière intervention 3 octobre 2007
30 août 2006 à 14:00
si je ne me trompe, "Picture3.Picture = LoadPicture" doit  normalement vider la mémoire de la picturebox non ?
et c'est BitBlt qui charge la capture d'écran.

j'ai oublié de préciser dans le code :
Public Declare Function BitBlt Lib "gdi32" (ByVal hDCDest As Long, ByVal X As Long, ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hdcSrc As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
30 août 2006 à 14:25
Oups, désolé j'avais zapper ton avant-dernier message !

Donc le loadpicture doit (en théorie) vider le picturebox, MAIS il n'est pas censé le faire. Donc rien ne veut un bon :
Set Picture3.Image = Nothing
Set Picture3.Picture = Nothing

pour être sûr.

Enlève aussi l'autoredraw (ca peut venir de là !!!) s'il est activé. Je sais qu'il est très gourmand en mémoire, et provoque en plus une fuite mémoire si on charge de nombreuses images à intervale régulier !
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
30 août 2006 à 14:30
qu'il est beau, ce   "GetDC(0)
"

faut le contrebalancer avec un ReleaseDC

Renfield
Admin CodeS-SourceS- MVP Visual Basic
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 130
30 août 2006 à 15:24
Oui aussi, c'est vrai
0
cs_mickei Messages postés 15 Date d'inscription vendredi 10 janvier 2003 Statut Membre Dernière intervention 3 octobre 2007
30 août 2006 à 16:00
j'ai essayé avec Set Picture3.Picture = Nothing mais aucun changement et si je vire l'autoredrraw, j'ai plus d'image du tout :(

pour le GetDC(0)  qu'est ce que tu veux dire par contrebalancer ?
0
cs_mickei Messages postés 15 Date d'inscription vendredi 10 janvier 2003 Statut Membre Dernière intervention 3 octobre 2007
30 août 2006 à 16:26
c'est bon j'ai pigé, et ça marche niquel.

Merci bcp
0
Rejoignez-nous