Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2266 connectés 

  FORUM HardWare.fr
  Programmation
  Divers

  Bug Mémoire - ocx

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Bug Mémoire - ocx

n°1874407
JM12345
Posté le 17-04-2009 à 15:24:37  profilanswer
 

Bonjour,
 
J'ai un bug qui apparait lors de l'exécution d'un programme codé en delphi et c++.
La compilation se déroule bien, l'exécution au départ également.
Dans ce programme, il y a la possibilité d'ouvrir des pages contenant beaucoup de paramètres.
 
Lors de l'ouverture d'un trop grand nombre de pages, le programme bug et le message suivant apparaît :
 
"Canvas does not allow drawing" ainsi que parfois "System out of ressources"
 
 
Le processus ne prend pas trop de mémoire, même lors de l'ouverture des différentes pages (110 Mo).
 
Le code à aussi l'air bon : Rien n'apparaît lors de l'exécution "pas à pas" mise à part que sur la dernière page ouverte avant le bug, les paramètres apparaissent "grisés".
Aucune fuite mémoire n'a été détectée (testé avec plusieurs logiciels)
 
Je me demande donc bien pourquoi la mémoire est elle saturée ???
 
Une mémoire est-elle fixée lors de l'enregistrement du fichier ocx avec Regsvr32 ?
Comment windows gère les objets graphiques associés au contrôles OLE ?
 
Merci d'avance pour vos réponses.
 
JM

mood
Publicité
Posté le 17-04-2009 à 15:24:37  profilanswer
 

n°1874444
olivthill
Posté le 17-04-2009 à 16:31:36  profilanswer
 

La quantité de mémoire disponible n'est pas le seul critère qui limite les applications. Il y en a d'autres. Par exemple, dans le cas des graphiques, il y a des limites au nombre de DC (display context), pen, brush, bitmap, font, etc. bref tous les objets du GDI. Dans les programmes bien faits, ces ressources du GDI sont libérées dès que possible, et il y a un test lors de la création d'un objet GDI qui échoue. Dans les programmes écrits pour êre compatibles avec Windows 16-bit (les programmes au format NE), le nombre des resources du GDI n'est pas très grand. Peut-être que l'OCX en question est dans ce cas. Pour les programmes au format Windows 32-bit (programme PE), le nombre des resources du GDI est très élevé, mais il se peut malgré tout que l'une des limitations soit atteinte dans certains cas.

n°1874510
JM12345
Posté le 17-04-2009 à 17:59:35  profilanswer
 

Merci d'abord pour ta réponse rapide.
 
Mon fichier ocx est écrit en C++.
En fait je ne sais pas à quoi sert exactement l'ocx ?
 
Les ocx génèrent ils forcement des objets du GDI ?
 
Ya t'il une fonction qui puisse permettre de connaître le nombre de DC maximum qu'on puisse utiliser pour savoir ce qui fait que le bug arrive ?
 
Je voudrais pas forcement corriger le problème mais savoir exactement pourquoi il y a ce bug.
 
Merci
 

n°1874548
olivthill
Posté le 17-04-2009 à 18:36:47  profilanswer
 

Quand je vois le message "Canvas does not allow drawing", et notamment le mot "drawing", je pense à une limitation concernant l'affichage, et non pas à un problème concernant l'OCX car l'OCX est juste un encapsulage d'un exécutable, et cela ne concerne pas l'affichage.
 
Il existe plusieurs moyens pour faire des affichages sous Windows. Le moyen le plus courant et le plus ancien est par l'utilisation du GDI. Comme l'OCX est une techique qui n'est pas très récente, j'ai supposé que votre OCX utilisait le GDI.
 
Pour avoir plus d'informations sur le GDI, voir l'article de Wikipedia, et notamment la version en anglais http://en.wikipedia.org/wiki/Graphics_Device_Interface , qui contient plus d'informations que la version en français. En voici un extrait :

Citation :

The total available GDI [objects] varies from one version of Windows to the next. Windows 95, 98 and Millenium had a limit of 1,200 total handles, while Windows XP and Vista have a limit of 10,000 objects, and Windows 2000 has a limit of 16,384 objects. [8][9]
 
Earlier versions of Windows such as Windows 3.1 and Windows 98 included a Resource Meter program to allow the user to monitor how much of the total system GDI resources were in use. Later versions such as Windows 2000 and Windows XP can report GDI object usage for each program in the Task Manager, but they cannot tell the user the total GDI capacity available.


n°1875065
JM12345
Posté le 20-04-2009 à 10:52:40  profilanswer
 

Merci.
 
Après vérification, C'est exactement ça !!!
 
En suivant le nombre d'objets GDI dans le gestionnaire des tâches, je remarque que mon application bug lorsque le nombre atteint 10000 !!!
 
Je cherche donc maintenant si il y a un moyen d'augmenter la limite du nombre d'objets GDI car sur le site de Microsoft c'est marqué : "par default 10000"
 
Merci encore !
 
JM

n°1875070
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 20-04-2009 à 10:59:09  profilanswer
 

10000 objets GDI ? [:mlc]
au lieu de traiter le symptôme (augmenter le nombre d'objets), faudrait voir à essayer de traiter la cause, et vérifier dans le source si tous les objets sont bien libérés, parce qu'il y a certainement un sérieux souci de fuite mémoire là


---------------
J'ai un string dans l'array (Paris Hilton)
n°1875096
JM12345
Posté le 20-04-2009 à 11:18:00  profilanswer
 

Comme je l'ai dit auparavant, il n'y a aucune fuite mémoire : cela a été testé avec plusieurs logiciels (tel purify) et de plus en suivant le processus la mémoire n'augmente pas.  
 
Le nombre d'objets GDI augmente en fonction que les parametres sont insérés dans les pages ouvertes.
 
A chaque paramètre, 2 objets en + sont créé  et au bout d'un moment ça sature.
 
Ma question reste donc : ya t'il un moyen d'augment la limite par défaut de 10000?

n°1875131
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 20-04-2009 à 11:35:38  profilanswer
 

JM12345 a écrit :

Comme je l'ai dit auparavant, il n'y a aucune fuite mémoire : cela a été testé avec plusieurs logiciels (tel purify) et de plus en suivant le processus la mémoire n'augmente pas.

 

Le nombre d'objets GDI augmente en fonction que les parametres sont insérés dans les pages ouvertes.

 

A chaque paramètre, 2 objets en + sont créé  et au bout d'un moment ça sature.

 

Ma question reste donc : ya t'il un moyen d'augment la limite par défaut de 10000?


Oui, cette limite peut être modifiée dans le registre via la clé :
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\GDIProcessHandleQuota

 

Mais je maintiens que c'est une solution bancale... 10000 objets GDI, c'est énorme pour une application. Quant à purify, no comment... Il m'a laissé passer des fuites de mémoire énormes, c'est le Norton Antivirus des anti-leaks...
Revérifie donc ton code toi même, et assure toi que chaque fonction Createxxx (avec xxx = "Pen", "Context", etc...) possède bien son DeleteObject() associé. Et si vraiment c'est OK, alors vois si tu peux repenser l'architecture de ton appli.


Message édité par Harkonnen le 20-04-2009 à 11:36:35

---------------
J'ai un string dans l'array (Paris Hilton)

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Divers

  Bug Mémoire - ocx

 

Sujets relatifs
Allocation très grande taille mémoireLibération de la mémoire sous Excel 2002
[Resolu] Gestion de la mémoireApache2 Consommation Mémoire, Ressources, Temps Execution
Probleme mémoire / Ogre3Dvariable memoire partagée entre plusieurs instances d'une DLL
Bug de lecture vidéo sous IE Vistapool mémoire maximum pour 3ds
comment recuperer la memoire et cpu utiliser par un processaide programmation jeu de mémoire
Plus de sujets relatifs à : Bug Mémoire - ocx


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR