Autor Beitrag
Adrian
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 314



BeitragVerfasst: 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
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
type
  TMyData = record
    Bilder: Array [1..41of TBitmap;
    Zahl: Integer;
  end;
  PMyData = ^TMyData;

...

  MyData.Bilder[i] := GetFormImage;
  MyData.Zahl := i;

und in der DLL
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 (user profile iconFlamefires 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1207
Erhaltene Danke: 31

Win 10
Delphi 2009 Pro, C++ (Visual Studio)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2684
Erhaltene Danke: 32



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: So 25.07.10 16:11 
user profile icondelfiphan hat folgendes geschrieben Zum zitierten Posting springen:
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."