Entwickler-Ecke
Dateizugriff - Bitmaps via MMF in DLL verwenden
Adrian - Fr 16.07.10 07:11
Titel: Bitmaps via MMF in DLL verwenden
Servus!
Im Programmteil 1 werden via Screenshot Bitmaps erzeugt - bis zu 41 Stück mit jeweils ca. 1,5MB - die dann im Programmteil 2, einer DLL, verarbeitet werden. Aus Geschwindigkeitsgründen möchte ich davon abgehen, zuerst die Bitmaps in Dateien abzulegen und sie danach wieder aufzurufen, denn der Laptop, auf dem das Programm später zum Einsatz kommen wird, ist nicht mehr der Jüngste. Also dachte ich daran, die Bilder in einem Array [1..41] of TBitmap abzulegen, das zu einem record gehört, und diese mit MMF (Memory Mapped Files) von beiden Programmteilen aus zu verwenden.
Erste Versuche in der Art wie im Programmteil 1
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| type TMyData = record Bilder: Array [1..41] of TBitmap; Zahl: Integer; end; PMyData = ^TMyData;
...
MyData.Bilder[i] := GetFormImage; MyData.Zahl := i; |
und in der DLL
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| function ReadFromMMF(Filename: string): TMyData; var Mem: PMyData; begin
...
result.Bilder[1] := Mem.Bilder[1]; result.Zahl := Mem.Zahl; |
schlugen allerdings (ich habs schon erwartet) mit Zugriffsverletzungen fehl.
Ist es überhaupt möglich, Bitmaps per MMF und records abzulegen und für die DLL zugänglich zu machen?
Welche anderen Möglichkeiten könnten erfolgreich sein?
Noch ein Hinweis: Nachdem die Bilder in der DLL verarbeitet wurden, sind sie nicht mehr nötig, können also freigegeben werden.
Gruß,
Adrian
jaenicke - Sa 24.07.10 10:46
Ich hoffe mal dir ist schon klar, dass in dem Array lediglich Referenzen stehen, oder?
Heißt als Lösung: Du erzeugst die MMF, streamst dann die
Daten der Bitmaps hinein und übergibst an die DLL. Diese muss dann wiederum die Daten aus der MMF lesen. Ich selbst benutze auch immer wieder mal MMFs:
http://www.delphi-forum.de/viewtopic.php?t=99933 (einfaches Auslesen)
http://www.delphi-forum.de/viewtopic.php?t=100088 (
Flamefires Variante als Nachfahre von TStream)
http://www.delphi-forum.de/viewtopic.php?p=575428 (Updater mit Datenaustausch zwischen den Prozessen durch MMFs)
Mit dem Öffnen der MMF durch die DLL wird der Referenzcounter erhöht. Das heißt, wenn du das ganze in einem Thread verarbeiten lässt, musst du die MMF im Programm nicht geöffnet lassen.
Flamefire - Sa 24.07.10 14:13
Hm. Wenn die DLL von dem Programm geladen ist, das die BMPs erzeugt, müsste es trotzdem gehn, oder?
Ansonsten wirklich den Inhalt in ne MMF streamen und in der DLL auslesen.
jaenicke - So 25.07.10 10:05
Nein, das geht nicht, denn der Speichermanager der DLL ist nicht der des Hauptprogramms. ;-)
Das könnte man zwar theoretisch umbiegen, aber ist unnötig kompliziert und anfällig.
BenBE - So 25.07.10 11:25
Und warum übergibt man nicht einfach nen Pointer an die DLL, von Wo sie das gestreamte Bitmap laden kann? TBitmap kann man auch aus nem MemoryStream laden.
delfiphan - So 25.07.10 11:38
Einfach Bitmap.Handle der DLL geben, dort wieder ein TBitmap erzeugen und dort dem Bitmap.Handle zuweisen, fertig.
(PS: MMF macht keinen Sinn wenn die beiden Codeteile im gleichen Prozess laufen. Die haben ja sowieso Zugriff auf den gleichen Address Space)
Martok - So 25.07.10 15:11
delfiphan hat folgendes geschrieben : |
| Einfach Bitmap.Handle der DLL geben, dort wieder ein TBitmap erzeugen und dort dem Bitmap.Handle zuweisen, fertig. |
Aufpassen: Palette nicht vergessen, falls denn eine verwendet wurde.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!