![]() |
Gezielt Informationen aus dem Speicher lesen.
Hallo Delhi Gurus,
nach langer Zeit, wollte ich mich wieder an neue Herausforderungen in Delphi wagen. Nur wie es immer ist, bin ich an einem Punkt angekommen, wo ich nicht weiter weiß. Ich hoffe Ihr könnt mir, mit eurem Rat und guten Hinweisen, etwas unter die Arme greifen. Die Herausforderung: Ein Dienst soll zwei Threads beinhalten, indem die eine Thread Dateien aus einem XYZ Verzeichnis einliest und das gelesene im Hauptspeicher ablegt. Der zweite Thread soll von der abgelegten Stelle im Hauptspeicher die Daten lesen, manipulieren und extern wieder physikalisch abspeichern oder versenden. Wieso mit zweit Threads? Ich will, dass die beiden Verarbeitungen unabhängig voneinander ablaufen. Der A-Thread liest permanent die Dateien in den Hauptspeicher und gibt es dann frei zu Weiterverarbeitung. Der andere B-Thread liest dann die übergegebenen Informationen aus dem Hauptspeicher und modifiziert es entsprechend. Die Übergabe der Informationen soll anhand von Pointern erfolgen, die die Adresse des Hauptspeichers enthalten. Soweit die Theorie Den Dienst und die Threads kann ich erstellen. Dazu habe ich, aus dem Forum reichlich Dokus bzw. Informationen gelesen. Das Ablegen der Daten, habe ich über TMemoryStream gelöst. Ich bin mir nicht sicher, ob dass der richtige Weg ist! Ich habe verzweifelt versucht, per Zeiger den Speicherbereich auszulesen. Nur leider funktioniert es nicht . Ich habe eine MemStream Objekt erstellt und lade mit LoadFromFile die Datei X hoch. Anschließend, ordne ich den Zeiger per myPointer := @MyMemStream zu. Wenn ich jetzt in zweiten Thread darauf zugreifen will bekomme ich Fehler.
Code:
Wie könnte man das Problem lösen oder was mache ich falsch?
A - Thread (myPointer : TPointer);
MemStream : TMemoryStream; Begin MemStream := TMemoryStream.create; myPointer := Nil; MemStream.LoadFromfile(MyFile) IF MemStream.Size > 0 then begin myPointer := @MemStream End; MemStream.Free; B – Thread (NewPointer:TPointer); NewMemStream : TMemoryStream; Begin NewMemStream := TMemoryStream.create; NewMemStream.readbuffer(TMemoryStream(NewPointer^), TMemoryStream(NewPointer^).Size); … End; Ich hoffe ich habe den richtigen Rubrik augewählt, wenn nicht Big Sorry! |
AW: Gezielt Informationen aus dem Speicher lesen.
wenn du in thread a den stream schon wieder freigibst, dann ist er unter umständen ja schon überschrieben wenn thread b drauf zugreift.
|
AW: Gezielt Informationen aus dem Speicher lesen.
Du brauchst zunächst eine Klasse, die eine Datei (incl. Name) im Speicher halten kann:
Delphi-Quellcode:
Thread A erzeugt pro Datei ein Objekt dieser Klasse und lädt die Datei in den Memorystream.
TMemFile=class(TObject)
public filename:string; MemoryStream:TMemoryStream; end; Dann schiebt der Thread A das Objekt in die Queue Q. Diese Queue muss threadsicher gemacht werden. Thread B liest nun aus Q und manipuliert die Daten im Memorystream. Anschliesend gibt er das übernommene TMemFile-Objekt frei. Threads und Queues gehören einfach zusammen. Somit gibt es keine Übergabe von Pointern über den Hauptspeicher. |
AW: Gezielt Informationen aus dem Speicher lesen.
Die Befürchtung habe ich auch. Gibt es Alternativen? Evtl. direkt den Speicher schreiben. Ich hoffe ich muss jetzt nicht Assemblieren :-D
|
AW: Gezielt Informationen aus dem Speicher lesen.
@SX2008
Vielen Dank, ich werde es ausprobieren. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:12 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