AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Frage zum Buffer eines Streams

Ein Thema von alleinherrscher · begonnen am 26. Jul 2007 · letzter Beitrag vom 2. Aug 2007
Antwort Antwort
Seite 4 von 4   « Erste     234   
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#31

Re: Frage zum Buffer eines Streams

  Alt 30. Jul 2007, 14:17
Zitat von alleinherrscher:
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?
Schon wieder vergessen, dass die einzelnen Blöcke ja auch den Filestream "überschreiben" können.
Dann ist die Zeile natürlich Quark.

Dann dürfte doch alles funktionieren (wenn die Rechnung mit Start und ReadStart stimmt). Du kannst problemlos überschreiben.

Buf (bzw. buffer) zeigen doch nur auf ein Stück Hauptspeicher. Und dort schreibst du rein ohne dich für den Inhalt oder für die Speicherreservierung zu kümmern. Der Inhalt ist dir eh wurscht und die Speicherreserveirung muss bei allen Streams die aufrufende Funktion machen.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Benutzerbild von alleinherrscher
alleinherrscher

Registriert seit: 8. Jul 2004
Ort: Aachen
797 Beiträge
 
Delphi XE2 Professional
 
#32

Re: Frage zum Buffer eines Streams

  Alt 30. Jul 2007, 16:37
Okay, fehler in der Positionsberechnung von ReadStart behoben. Also bei mir läufts jetzt ganz gut...

SaveToFile ist allerdings noch buggy...

//edit: wieder ein paar Fehler bzgl. Setsize gefunden...
Angehängte Dateien
Dateityp: pas buffersirius_518.pas (7,4 KB, 9x aufgerufen)
„Software wird schneller langsamer als Hardware schneller wird. “ (Niklaus Wirth, 1995)

Mein Netzwerktool: Lan.FS
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#33

Re: Frage zum Buffer eines Streams

  Alt 30. Jul 2007, 17:00
Die Klasse TBufferStream sollte so konstruiert sein, dass man ein beliebiges TStream-Objekt übergibt (anstelle eine Dateinamen).
Wie man's richtig macht kann man z.B. in der Unit JclStreams der JCL nachschauen.
Andreas
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#34

Re: Frage zum Buffer eines Streams

  Alt 2. Aug 2007, 06:55
Erstmal muss ich sagen: Echt nette Komponente.

Ein paar Sachen fallen mir auf:

Wieso swapt ihr eigentlich selber FMemory auf die Platte? Kann man das nicht auch Windows überlassen? Ich meine, das Windows das bessere Memory management hat, oder irre ich mich? Ich halte das auch für eine Performancebremse, denn entweder habt ihr ALLES im RAM, oder ALLES auf der Platte...

Ich hab den Code nur überflogen, aber mir fällt da eine kleine Schwachstelle auf:
Wenn ich mehrmals an die gleiche Stelle etwas schreibe, dann hängt ihr trotzdem immer einen 'aPart' an die PartsInfo-Liste an. Das ist überflüssig. Das ist mit der (zugegebenermaßen ziemlich einfach wie genialen) Methode mit dem einen FMemory - Stream nicht optimal lösbar. Wenn man jedoch davon ausgeht, das in dem Stream nicht sonderlich viel überschrieben wird, ist das nicht so wild.

Die Routine GetTempName ist blöd, nehmt lieber die WinAPI-Version
Delphi-Quellcode:
Function TempPath: String;
Var
  i: integer;

Begin
  SetLength(Result, MAX_PATH);
  i := GetTempPath(Length(Result), PChar(Result));
  SetLength(Result, i);
  IncludeTrailingPathDelimiter(Result);
End;

Function TempFilename: String;
Begin
  SetLength(Result, MAX_PATH + 1);
  GetTempFileName(PChar(TempPath), 'CSI', 0, PChar(result));
End;
In der SaveToFile-Methode steckt ein Denkfehler:
Delphi-Quellcode:
...
   if i>=PartsInfo.Count-1 then //alle Elemente in FMemory sind Sortiert hinterheinander
       if (FMemory is TMemoryStream) then // => FMemory ist bereits fertiger Stream! DENKFEHLER!!!
          TMemoryStream(FMemory).SaveToFile(Filename)
...
Also: Ich schreibe an Pos:1 und Pos:100 jeweils ein Byte (z.B. A und B). Dann steht in PartsInfo (Pos:1, Size:1, FindAtPosition:0) sowie (Pos:100, Size:1, FindAtPosition:1) und der FMemory-Stream enthält 'AB'. Das ist aber nicht der fertige Stream, oder irre ich mich?

Ihr könntet die einzelnen Parts aus Partinfo jeweils mit
Delphi-Quellcode:
  FMemory.Seek (FindAtPositon, soFromBeginning);
  stDestStream.Seek (PositionInStream, soFromBeginning);
  stDestStream.CopyFrom (FMemory, Length);
in den Ziel-Stream schreiben

Na ja, und dann wären da noch ein paar kosmetische Kleinigkeiten: aPart ist ein *schlechter* Bezeichner für einen Datentypen. Auch würde ich daraus eine Klasse machen.

Ansonsten: Echt Cool.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 4 von 4   « Erste     234   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:03 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