Erreur "espace insuffisant pour traiter cette commande" EoutOfResources

poirelotto Messages postés 3 Date d'inscription vendredi 13 juin 2003 Statut Membre Dernière intervention 20 février 2006 - 17 févr. 2006 à 16:15
DeltaFX Messages postés 449 Date d'inscription lundi 19 avril 2004 Statut Membre Dernière intervention 8 avril 2009 - 20 févr. 2006 à 16:00
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

DeltaFX Messages postés 449 Date d'inscription lundi 19 avril 2004 Statut Membre Dernière intervention 8 avril 2009 2
20 févr. 2006 à 16:00
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.
1
flor003 Messages postés 118 Date d'inscription dimanche 28 septembre 2003 Statut Membre Dernière intervention 19 juin 2007
17 févr. 2006 à 16:51
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++
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
17 févr. 2006 à 22:46
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
0
DeltaFX Messages postés 449 Date d'inscription lundi 19 avril 2004 Statut Membre Dernière intervention 8 avril 2009 2
17 févr. 2006 à 23:06
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.
0

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

Posez votre question
ni69 Messages postés 1418 Date d'inscription samedi 12 juin 2004 Statut Membre Dernière intervention 5 juillet 2010 12
18 févr. 2006 à 12:12
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 !
0
poirelotto Messages postés 3 Date d'inscription vendredi 13 juin 2003 Statut Membre Dernière intervention 20 février 2006
20 févr. 2006 à 00:30
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
0
Cirec Messages postés 3833 Date d'inscription vendredi 23 juillet 2004 Statut Modérateur Dernière intervention 18 septembre 2022 50
20 févr. 2006 à 01:10
Salut,
essaye de liberer la memoire dans le OnClose et pas dans le OnDestroy de la Form

@+
Cirec
0
DeltaFX Messages postés 449 Date d'inscription lundi 19 avril 2004 Statut Membre Dernière intervention 8 avril 2009 2
20 févr. 2006 à 10:26
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 !
0
poirelotto Messages postés 3 Date d'inscription vendredi 13 juin 2003 Statut Membre Dernière intervention 20 février 2006
20 févr. 2006 à 14:46
>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
0
Rejoignez-nous