![]() |
Re: Frage zum Buffer eines Streams
Zitat:
Edit: Wer ruft den die Read-Methode auf? Wahrscheinlich wäre es noch sinnvoll eine savetoFile etc. Methode zu implementieren. |
Re: Frage zum Buffer eines Streams
@sirius:
Hm allerdings ist meins etwas unverständlich oder? Blickst du da durch? zu deinem edit: beides wäre brauchbar: ein Read und ein SavetoFile. Aber wenn du das Read hast, ist das Savetofile doch vom selben Prinzip oder? Und jap du hast recht, die Abstrakte Lösung ist wirklich knackig kurz und besser :) //edit: die READ methode brauche ich später im "externen Programm"...oder wie meinst du die frage? |
Re: Frage zum Buffer eines Streams
Ich würde das in mehreren Schritten angehen:
1. Speichern der Änderungen in einer separaten Struktur:
Delphi-Quellcode:
Wenn man einen weiteren Wert der Größe N an Stelle P speichert, und es existiert ein 'Saved Item' S an der Position P-N, dann kann man S erweitern (siPos += N). Existiert ein saved Item an der Stelle S.siPos = P+N, dann kann man S wieder erweitern (siPos -= N, siSize += N).
TSavedItem = Record
siPos, siSize : Cardinal; siData : Pointer; End; 2. Sicherstellen, das bei einem READ auf dem Stream die unveränderten und veränderten (Saved Item Liste) korrekt zurückgeliefert werden. 3. Speichern der Saved Item Liste in einem Stream, allerdings würde ich hier die Liste im Speicher, und nur die siData-Teile auslagern. Dies dürfte sehr komplex werden, wenn es optimal performant werden soll. Eigentlich handelt es sich um einen Stream, der mit Transaktionen arbeitet. Es gibt so eine Komponente schon, ich meine, ich hätte sie bei Torry gesehen... |
Re: Frage zum Buffer eines Streams
Zitat:
Achja und: Zitat:
|
Re: Frage zum Buffer eines Streams
Zitat:
Zitat:
Zitat:
Also, wie in einen Buffer schreiben?
Delphi-Quellcode:
procedure xyz.read(var buffer);
var buf:pointer; begin buf:=@buffer; filestream.read(buf^,10); buf:=pointer(cardinal(buf)+10); filestream.seek(100,sofromcurrent); filestream.read(buf^,3); buf:=pointer(cardinal(buf)+3); ... end; |
Re: Frage zum Buffer eines Streams
Liste der Anhänge anzeigen (Anzahl: 1)
Hey@all und Hi Sirius!
Ich hab die Änderungen mal eingebaut. Muss sagen, bis jetzt haben alle meine Tests funktioniert. Wenn du magst, kannst du (natürlich auch gerne alle anderen) mal testen, obs noch Bugs gibt. Falls dies okay ist, fehlen natürlich noch eine optimierte Version von SaveToFile. Wie würdet ihr die angehen, ohne Read und CopyFrom zu benutzten...und ohne die Performence zu zerstören? Grüße Alleinherrscher //edit: noch einen Fehler entdeckt, bei CopyFrom wenn man eine Datei als Filestream eingeladen hat, verändert, dann den gesamtem Stream kopiert sind die änderungen weg...ich werd mich mal dranbegeben... |
Re: Frage zum Buffer eines Streams
1. Den Filestream musst du noch im Destructor freigeben
2. Die (meine) Funktion setsize funktioniert so nicht mehr. Besonders in dem Fall, wenn die Größe verkleinert wird. Denn dann kannst du ja Teile aus dem FStream löschen bzw. den Filestream kürzen. 3. Wolltest du nicht kleine Dateien statt in den FileStream erstmal in FStream laden? 4. in seek musst du evtl noch mySize anpassen (Wenn myPosition>mysize) Zu edit (Denk daran, dass du auch bei der Anwendung von copyFrom Fehler machen kannst (ich vergesse meistens die Position zu verändern) zu2:
Delphi-Quellcode:
procedure TBufferstream.SetSize(Newsize:longint);
begin if Newsize<mysize then begin //Speicher freigeben (ist allerdings nicht notwendig) if Filestream.size<newsize then Filestream.size:=newsize; //evtl, oder du lässt die Datei bestehen //und hier jetzt für jeden Part in FStream, schauen ob er gekürzt werden kann end; mysize:=newsize; end; |
Re: Frage zum Buffer eines Streams
Okay, das werde ich sofort ändern, danke!
//edit zu deinem Punkt drei: Ja, aber ich glaube so ist es einfacher, weil wir nicht noch zusätzlich die Fälle unterscheiden müssen , ob der Stream jetzt "bearbeitet werden darf" oder nicht... arg: Deutsche Sprache ist zu beschränkt ;) Noch ne grundsätzliche verständnisfrage zu den Pointern (die Deklaration vom Buffer): Ich lese ja im Augenblick in der READ function erst den Filestream mit Filestream.read(buf^,count); Will ich jetzt an einer bestimmten Position ein Datenpacket aus dem MemoryStream einsetzten, wie geht das? Ich hab es ja im Augenblick so gelöst:
Delphi-Quellcode:
Aber scheinbar funktioniert dies nicht sauber?!BufStart:=cardinal(buf); if FileStream<>nil then begin FileStream.Seek(MyPosition,soFromBeginning); NumberOfReadByte:=Filestream.Read(buf^,count); end; //und dann um das Paket irgendwie in die Mitte vom Buffer zu setzen: buf:=pointer(BufStart+(Start-ReadStart)); //... FMemory.position:=MyPart.FindAtPosition-offset; FMemory.Read(buf^,len); Grüße |
Re: Frage zum Buffer eines Streams
Oh ja, da scheint mir noch folgende Zeile zu fehlen:
Delphi-Quellcode:
Und an der Zeile ist auch noch was komsich:
if FileStream<>nil then
begin FileStream.Seek(MyPosition,soFromBeginning); NumberOfReadByte:=Filestream.Read(buf^,count); buf:=pointer(cardinal(buf)+NumberOfReadByte); //<--- die hier end;
Delphi-Quellcode:
Was ist wenn ein Block aus FMemory über die Länge von Filestream hinausgeht?
result:=NumberOfReadByte
Was ist wenn von außen die erwartete Größe (=mySize) ungleich NumberOfReadByte ist? (Dann gibt übrigens copyfrom irgendsoein EReadError.) |
Re: Frage zum Buffer eines Streams
OMG, ja das is ja ein Dummer Fehler, ich war bis jetzt immer davon ausgegangen, dass mein Filestream länger ist, als alles andere... Aber man kann ja auch daten HINTER den Filestream schreiben...dummdummdumm... sorry! :wall:
Aber wenn ichs so mache, wie du oben getextet hast:
Delphi-Quellcode:
Dann würden doch bei einem weiteren Read vorgang die Daten an das ENDE von Buffer weitergeschrieben, richtig? Gibt es keine Möglichkeit (so ähnlich wie beim Stream selbst), mitten in den Buffer nochmal was reinzuschreiben bzw einlesen zu lassen?
if FileStream<>nil then
begin FileStream.Seek(MyPosition,soFromBeginning); NumberOfReadByte:=Filestream.Read(buf^,count); buf:=pointer(cardinal(buf)+NumberOfReadByte); //<--- die hier end; Ach, sonst muss ich es eben etwas umschreiben...ich schau mal, danke erstmal! Das is noch ne Menge Arbeit, merke ich grade... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:50 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