2011-01-13 3 views
1

J'ai un problème de mémoire avec un algorithme que j'utilise pour "Aplatir" une page dans un document PDF.CreateDibSection sur le disque au lieu de la mémoire physique

HBITMAP hbmp = CreateDibSection(...); 
ThirdPartyBmpManipulation(hbmp, "C:\\file.pdf", 0); //renders page 0 in file.pdf 
void * hdib = ConvertBitmap(hbmp); //copy a Dib Section to a Dib 
DeleteObject(hbmp); //frees the HBitmap while the Dib is now in memory 

Le problème est que j'ai un bitmap vraiment grand et dans certains cas, je ne peux pas garder le HBitmap en mémoire pendant que je le DIB à allouer être copiés.

Donc, c'est long, mais puis-je en quelque sorte allouer la section Dib sur le disque et avoir encore un HBITMAP pour cela? (utilisez la même poignée pour ma fonction ConvertBitmap)

+0

Cela semble être une bonne question. Je serais intéressé à connaître la réponse. Mais pourquoi utilisez-vous toujours l'ancienne API Windows? C'est vraiment vieux. Pourquoi ne pas utiliser GDI +? – Rafid

+0

@Promather GDI + est juste une enveloppe autour de GDI qui le rend vraiment lent ;-) –

+0

Hmmm .... Je ne suis pas d'accord avec vous David. GDI + est censé être une chose complètement nouvelle qu'avec Windows Vista et 7 a commencé à utiliser l'accélération graphique. Ai-je raison, ou mélange-t-on les choses? Quoi qu'il en soit, même si elle est plus lente, elle peut avoir une meilleure structure qui facilite la lecture/écriture de bitmaps à partir du disque dur. – Rafid

Répondre

1

Quel est le mode de défaillance? Vous dites "mémoire physique": Windows utilise la mémoire virtuelle, il va faire une page sur le disque, vous n'avez pas besoin de vous inquiéter de manquer de mémoire physique au-delà du coup de performance. Si vous manquez d'espace d'adressage, l'utilisation du disque peut ne pas être en mesure de vous aider.

Toutefois, CreateDIBSection peut prendre un HANDLE à un mappage de fichier (créé avec CreateFileMapping). Si les fonctions internes de la fonction et les fonctions HBITMAP associées sont suffisamment intelligentes, il peut être possible d'éviter d'épuiser votre espace d'adressage en exploitant cette capacité. S'ils sont «intelligents», ils utiliseront MapViewOfFile pour mapper des «fenêtres» relativement petites du fichier, selon les besoins, dans l'espace d'adressage de votre processus.

+0

Je voulais dire l'espace d'adressage, je pense. Je pensais que CreateFileMapping a provoqué le programme à réserver autant d'espace dans la mémoire que le fichier de sa lecture? Voulez-vous dire que CreateFileMapping ne comptera pas dans la limite de 2 Go de win32? –

+0

CreateFileMapping par lui-même ne fait rien à l'espace d'adressage de votre processus, MapViewOfFile [Ex] le fait. Il est possible de mapper des parties d'un fichier dans votre espace d'adressage à la fois. Si 'CreateDIBSection' et les amis sont assez intelligents pour faire cela quand on leur donne un HANDLE à un mapping, vous pourrez peut-être éviter ce problème. Encore une fois, aucune garantie, je ne connais pas les fonctions internes de ces fonctions, je sais seulement que, étant donné les interfaces, il est possible qu'ils puissent fonctionner comme ça. –

+0

Je suppose que le fait que vous ayez accepté cela signifie que cela a fonctionné? –

Questions connexes