Hi,
ich habe ein mehr oder weniger verzwicktes problem.. zur erklärung muß ich ein wenig weiter ausholen
(Der Code an sich ist alles nur auf das minimalste beschränkt.. also nicht wundern wenn irgendwo ein Create oder ähnliches fehlt)
Ich schreibe ein programm welches eine Bild-sequenz darstellen soll.
Der user bekommt eine Zeitleiste angezeigt, und wenn er durch diese durchscrollt wird das entsprechende bild geladen + angezeigt.
Aus performance gründen Cache ich alle Bilder in einem Array of TBild (TBild ist ein Array mit Höhe * Breite * 4 of Byte) in einem extra Thread vor, was auch prima klappt.
Der Thread macht nichts anderes als die Bilder zu laden und in den Cache-Array zu schreiben.
Es kann nun aber auch vorkommen, das 2 oder mehr Cache-Threads gleichzeitig laufen, sprich die Sequenz an mehreren stellen gleichzeitig gecacht wird. Auch das funktioniert dank Synchronize/CritialSection wunderbar..
Und nun zu dem Problem:
Um x-beliebig viele Bildformate zu unterstützen habe ich die funktion für's laden in DLLs ausgelagert. Und nachdem eine DLL ja leider nur Integer's etc zurückgeben kann, und keine Bitmaps oder Dynamische Arrays, erstelle ich in der DLL eine Klasse welche vom Hauptprogramm verwendet werden kann:
Delphi-Quelltext
1: 2: 3: 4:
| TDLLClass = class Image: TBild; procedure loadImage(Filename: PChar); end; |
die procedure loadImage lädt also das Bild und schreibt es in "Image". Der aufruf im Thread sieht dann etwa so aus:
Delphi-Quelltext
1: 2:
| DLLClass.loadImage('...'); Cache.Add(Frame, DLLClass.Image); |
und das klappt ebenfalls wunderbar, allerdings nur solange es nur ein Thread ist...
Kommt jetzt ein zweiter Thread hinzu, überschneiden sich logischerweise die zugriffe auf die "Image"-Variable in der TDLLClass...
Und das ist die stelle wo ich ein wenig hänge grad... klar, ich könnte die Variable auch mit Synchronize/CriticalSections schützen, allerdings geht in dem Moment der sinn der Threads verloren, weil immer nur einer gleichzeitig auf die Image-Variable zugreifen könnte = nur ein Thread etwas cachen könnte..
Hat jemand eine Idee wie ich das problem lösen könnte?
Oder weiß jemand eine andere möglichkeit das Image was loadImage lädt aus der DLL in das Hauptprogramm zu bekommen?
Au'revoir,
Aya~
PS: Die DLL muß kompatibel zu VC++ bleiben!