Autor |
Beitrag |
Adrian
      
Beiträge: 314
|
Verfasst: Fr 16.07.10 08:11
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
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Sa 24.07.10 11: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:
www.delphi-forum.de/viewtopic.php?t=99933 (einfaches Auslesen)
www.delphi-forum.de/viewtopic.php?t=100088 ( Flamefires Variante als Nachfahre von TStream)
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
      
Beiträge: 1207
Erhaltene Danke: 31
Win 10
Delphi 2009 Pro, C++ (Visual Studio)
|
Verfasst: Sa 24.07.10 15: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
      
Beiträge: 19315
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: So 25.07.10 11: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
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: So 25.07.10 12: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.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
delfiphan
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: So 25.07.10 12: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
      
Beiträge: 3661
Erhaltene Danke: 604
Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
|
Verfasst: So 25.07.10 16: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.
_________________ "The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
|
|
|