Erreur "espace insuffisant pour traiter cette commande" EoutOfResources

Signaler
Messages postés
3
Date d'inscription
vendredi 13 juin 2003
Statut
Membre
Dernière intervention
20 février 2006
-
Messages postés
449
Date d'inscription
lundi 19 avril 2004
Statut
Membre
Dernière intervention
8 avril 2009
-
Bonjour a tous,

une petite colle du vendredi soir pour ne pas s'ennuyer ce week end :
le message d'erreur "espace insuffisant pour traiter cette commande"

J'ai une erreur assez difficile a reproduire (mais reproductible) que je ne comprends absolument pas:
alors j essaie de faire simple :
-je cree une form, avec un Tbitmap de 4000*4000 environs (ici ca passe sur mon pc, mais sur d autres ordis on a le message d erreur)
-je detruis la form
-je la recree et donc je recree le tbitmap, puis je le redimensionne width := 4000 et heigth := 4000 par exemple

eh bien c est en faisant le width ou le height (ca change de temps en temps) que ca explose...

Debut de reponse: (ben j ai cherche quand meme)
ce message est celui de l exception EoutOf Resources et l aide nous dit qu elle est levee quand il n'y a plus de handle windows a allouer... ca m aide pas bcp.

Merci a tous, parce que j' ai vraiment besoin d aide sur ce coup la...

je vais essayer de reproduire ca sur un code simple pour pouvoir le poster.

++

9 réponses

Messages postés
449
Date d'inscription
lundi 19 avril 2004
Statut
Membre
Dernière intervention
8 avril 2009
2
Effectivement le doublebuffered ne sert a rien pour un bmp non affiché.

Donc t'es entrain de me dire que cette superimage n'est jamais affichée ? C'est quoi, de la photogrammétrie (par réseau neural ), du SIG, de l'extraction de primitive,de la photocomposition, tu te sers du bestiau comme HeighField pour un générateur de paysage 3D.... ????

Tu le geres en 24bit, en 32bit ? (c'est batard le 24bit, ca fait 3octets, berk....)
force le en pf32bit.

A priori, si t'as pas besoin d'afficher l'image, alors le format bitmap en interne n'est pas le plus approprié pour travailler dessus.

Avis au pros du delphi, mais je verrai bien un truc du genre

1- je charge mon bitmap depuis son fichier
2- je recopie dans byte array 4000*(4000*3 ou 4 selon pf24bit ou pf32bit) (ou tout autre structure appropriée pour stocker ce genre d'info) le bitmap à coup de scanline
3- je purge le bitmap (myBmp.free)

4 to N : je bricole ma pseudo image, comme un byte array

N+1 et si il faut un bitmap en sortie, ben on le recrée à l'inverse du 2.
Messages postés
118
Date d'inscription
dimanche 28 septembre 2003
Statut
Membre
Dernière intervention
19 juin 2007

salut !

Moi je dis respect, ce genre d'erreur ça mérite le respect.
Utilises tu les stream? Tu recrée ton form mais as tu pensé à libérer
la mémoire de ton bitmap? la procedure pour les Tbitmap pour libérer la mémoire est
freeImage.
monbitmap.freeImage;

a++
Messages postés
3825
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
1 février 2021
38
Salut,

As-tu vraiment besoin d'une image de cette taille 4000 X 4000 = 16 millions de pixels


Et ça t'étonne que l'espace soit insuffisant pour traiter cette commande

@+
Cirec
Messages postés
449
Date d'inscription
lundi 19 avril 2004
Statut
Membre
Dernière intervention
8 avril 2009
2
4000*4000 c'est pas la mort, 16e6 point 3 octet par point = 48 Mo, c'est la taille des images que me sort mon scanner, donc....

Mais c'est clair que si y a pas de bitmap.free, ca va coaguler la becane assez vite.
Messages postés
1418
Date d'inscription
samedi 12 juin 2004
Statut
Membre
Dernière intervention
5 juillet 2010
13
Essaye d'arranger le problème en augmentant la mémoire maximale pouvant être allouée au programme dans les options du projet : onglet "Lieur" / "Taille de la mémoire" (pile maximum)
Il faut bien évidement également penser à libérer les ressources quand elles ne sont plus nécessaires !

@+

Nico { http://www.ni69.new.fr/ }






N'oubliez pas de cliquer sur Réponse Acceptée lorsque la réponse vous convient !
Messages postés
3
Date d'inscription
vendredi 13 juin 2003
Statut
Membre
Dernière intervention
20 février 2006

flor, merci du conseil, je fais pas un freeimage explicite mais bien un Free dans le formdestroy..

cirec, oui j ai besoin de cette taille, et comme dit deltaFX, c pas la mort. Donc, oui, ca m'etonne que la memoire soit insuffisante pour stocle 48Mo sur un ordi avec 1Go+ de RAM

DeltaFX, merci pour le soutient, et les Free sont là...

TomoNico, seule solution que j ai pas essaye encore, je posterai si ca marche ...

merci a tous pour toutes les idees en tout cas.
y en a une aue j ai essaye avec une tres tres legere amelioration en terme de RAM (ce qui ne resoud rien a mon probleme) c'est la methode Dormant de Tbitmap... enfin...

A suivre
Messages postés
3825
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
1 février 2021
38
Salut,
essaye de liberer la memoire dans le OnClose et pas dans le OnDestroy de la Form

@+
Cirec
Messages postés
449
Date d'inscription
lundi 19 avril 2004
Statut
Membre
Dernière intervention
8 avril 2009
2
Mais quel usage stu d'un tel bitmap? Il est chargé en image de fond ?? Paske 4000*4000 c'est de toute façon hors ecran ( amoins de jouer avec 4 ATI XT1900 en crossfire, et encore)

Si c'est pour faire un appli de retouche d'image, y a comme astuce de restreindre le bitmap a ce que tu peux voir à l'ecran, pour les opération d'affichage, mais appliquer les traitements a toute l'image (donc en fait on voit jamais le gros bitmap, mais une copie retaillée / resizée qui tient dans l'ecran, et à chaque opération sur le gros bmp, tu remets a jour l'image visible, a coup de scanline & bitblt truc-machin).

Ta form est bien en doublebuffered, au fait ?

gnh !
Messages postés
3
Date d'inscription
vendredi 13 juin 2003
Statut
Membre
Dernière intervention
20 février 2006

>cirec
j ai fait les deux. ca change rien vu que je flush les msgs avant de recreer une autre form. donc je passe dans le form destroy de suite.

>deltaFX
ah ! un tel bimap! effectivement, les dimensions de cette image ne correspondent pas a lecran :p et ne sert donc pas a etre affiche en tant que "gros bitmap". A vrai dire, mon affichage est grosso-modo ce que tu decris. eh oui je ne fais pas un Paint version X, ni un PacMan.. Pour la curiosite, disons qu il s agit plutot de donnees dont la convertion en couleur est tres lente (tres calculatoire) et donc ne doit etre faite qu une seule fois.
Encore une fois, 4000*4000 c vraiment pas la mort quand on a 1Go de RAM.
Quand au DoubleBuffered, j ai essaye avec et sans. Et je pense bien que ca ne change pas grand chose sur un bitmap qui n est pas affiche. Si?


apparemment, ca va un peu mieux depuis que j ai mis tous les free dans le destroy et que je force a passer immediatement dans le destroy :
{
maform.release;
appli.processmsgs; //flush => destroy effectif
maform := tbmp.create;
}

Maintenant, ca ne me parait pas tres optimise comme solution :=S

++
merci a tutti