![]() |
Multithreading DLL
Hi,
ich habe ein programm mit DLLs.. Ich habe in Delphi eine DLL geschrieben, welche eine Klasse exportiert, bzw eine funktion welche eine neue instanz der Klasse erstellt. Das ganze sieht etwa so aus:
Delphi-Quellcode:
die funktion loadImage lädt ein Bild in den speicher (Speicher wird reserviert mit GetMem) und gibt dann einen Pointer auf den Speicherbereich zurück.
TDLLClass = class
public function loadImage(filename: PChar): Longword; end; function createClass: TDLLClass; begin Result:=TDLLClass.Create; end; exports createDLL; Das ganze klappt wunderbar, allerdings nur solange nur ein Thread gleichzeitig läuft. Wenn ich nun also 2 Threads gleichzeitig laufen lasse welche loadImage aufrufen, schmiert irgendwann (komischerweise nicht sofort, sondern erst nach einiger zeit) das programm ab... Die Zeit nach der es abschmiert ist immer etwa gleich (ca~ nach 20 Bildern). Es liegt 100%ig nicht daran das irgendwo auf gleiche variablen zugegriffen wird, denn: Wenn ich den Code der DLL einfach in das Hauptprogramm kopiere und so den DLL aufruf umgehe, funktioniert es selbst mit 10 Threads fehlerfrei. Auch wenn ich für jeden Thread eine neue klasse der DLL erstelle funktioniert es nicht... es muß also irgendwo an der schnittstelle zwischen Programm/DLL liegen. Hat da jemand eine Idee? Au'revoir, Aya~ |
Re: Multithreading DLL
Nach langer sucherei und tausenden dingen die ich ausprobiert hab, hat Olli mir diesen Tip gegeben:
System.IsMultiThread:=True; einfach in EXE + DLL und fertig, klappt :wall: *Olli knuddel* Aya~ |
Re: Multithreading DLL
Da war dann noch ein Problem.
Aya hat die MM-Funktionen ![]() ![]() Man muß sich das so vorstellen, daß es zwei "Instanzen" des MM gibt. Einmal in der DLL und einmal in der EXE. Beide arbeiten unabhängig voneinander und verwalten ihre Speicherblöcke. Während ein ![]() ![]() ![]() Die beste Methode ist, wenn die DLL ihre eigenen Funktionen mitbringt um Speicher zu allozieren und freizugeben. Dadurch wird die Aufgabe an den "DLL-Buchhalter" delegiert, wenn es denn notwendig ist. Und schwuppdi gibt es keine ungültigen Zeigeroperationen mehr ;) Alternativ kann man die Heap-Manager-Funktionen ala ![]() ![]() ![]() Kann mir vorstellen andere haben auch diesen Denkfehler, denn Aya ist ja nicht gerade Anfänger - daher mein Kommentar! ... Nachtrag: Im Falle von ![]() ![]() ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:34 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz