Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Gezielt Informationen aus dem Speicher lesen. (https://www.delphipraxis.net/156620-gezielt-informationen-aus-dem-speicher-lesen.html)

hoda 8. Dez 2010 22:17

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:
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;
Wie könnte man das Problem lösen oder was mache ich falsch?

Ich hoffe ich habe den richtigen Rubrik augewählt, wenn nicht Big Sorry!

cookie22 9. Dez 2010 02:55

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.

sx2008 9. Dez 2010 08:14

AW: Gezielt Informationen aus dem Speicher lesen.
 
Du brauchst zunächst eine Klasse, die eine Datei (incl. Name) im Speicher halten kann:
Delphi-Quellcode:
TMemFile=class(TObject)
public
  filename:string;
  MemoryStream:TMemoryStream;
end;
Thread A erzeugt pro Datei ein Objekt dieser Klasse und lädt die Datei in den Memorystream.
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.

hoda 9. Dez 2010 08:46

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

hoda 9. Dez 2010 09:12

AW: Gezielt Informationen aus dem Speicher lesen.
 
@SX2008
Vielen Dank, ich werde es ausprobieren.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:42 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz