AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Progress beim komprimieren mit CompressBuf anzeigen

Progress beim komprimieren mit CompressBuf anzeigen

Ein Thema von Zacherl · begonnen am 20. Mai 2005 · letzter Beitrag vom 13. Jul 2005
Antwort Antwort
Seite 1 von 2  1 2   
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#1

Progress beim komprimieren mit CompressBuf anzeigen

  Alt 20. Mai 2005, 18:10
Hallo,
wie kann ich es realisieren, dass:

1. Das Programm beim komprimieren vongrößeren Dateien nicht einfriert.
2. Eine Fortschrittanzeige einbauen

Ich benutze diesen Code:
Delphi-Quellcode:
procedure CompressStream(inpStream, outStream: TStream);
var
  InpBuf, OutBuf: Pointer;
  InpBytes, OutBytes: Integer;
begin
  InpBuf := nil;
  OutBuf := nil;
  try
    GetMem(InpBuf, inpStream.Size);
    inpStream.Position := 0;
    InpBytes := inpStream.Read(InpBuf^, inpStream.Size);
    CompressBuf(InpBuf, InpBytes, OutBuf, OutBytes);
    outStream.Write(OutBuf^, OutBytes);
  finally
    if InpBuf <> nil then FreeMem(InpBuf);
    if OutBuf <> nil then FreeMem(OutBuf);
  end;

procedure DecompressStream(inpStream, outStream: TStream);
var
  InpBuf, OutBuf: Pointer;
  OutBytes, sz: Integer;
begin
  InpBuf := nil;
  OutBuf := nil;
  sz := inpStream.Size - inpStream.Position;
  if sz > 0 then
    try
      GetMem(InpBuf, sz);
      inpStream.Read(InpBuf^, sz);
      DecompressBuf(InpBuf, sz, 0, OutBuf, OutBytes);
      outStream.Write(OutBuf^, OutBytes);
    finally
      if InpBuf <> nil then FreeMem(InpBuf);
      if OutBuf <> nil then FreeMem(OutBuf);
    end;
  outStream.Position := 0;
end;
Florian
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Progress beim komprimieren mit CompressBuf anzeigen

  Alt 20. Mai 2005, 21:08
für ersteres wirst du es in einen thread auslagern müssen. für zweiteres wirst du um eine schätzung der zeit nicht rumkommen....

EDIT: es sei denn, du zerteilst deinen buffer in hundert gleich große teile und dekomprismierst die einzeln. dann wäre das recht einfach zu lösen.
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#3

Re: Progress beim komprimieren mit CompressBuf anzeigen

  Alt 20. Mai 2005, 21:14
Ja, daran hab ich auch schon gedacht!
Nur leider kenne ich mich mit Threads nicht so gut aus. (meine 1. versuche sind alle gescheitert)
Und das Aufteilen des Buffers traue ich mir auch nicht zu.

Und wie kann man das machen, das das Programm nicht weitermacht ohne einzugfrieren, bis der Thread fertig ist?

Kannst du vielleicht Quelltext posten?

Florian
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Progress beim komprimieren mit CompressBuf anzeigen

  Alt 20. Mai 2005, 21:20
da ham wir nen experten namens luckie, der hat da n tut dazu geschrieben:

http://luckie-online.de/Tutorials/

und n working example:

http://luckie-online.de/Delphi/Sonst...Nachricht.html

du müsstest allerdings noch mit pointern arbeiten, wie das geht, weiss ich nicht. habs zumindest nach (einmaliger) lektüre des tuts nicht gescheckt.
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#5

Re: Progress beim komprimieren mit CompressBuf anzeigen

  Alt 21. Mai 2005, 13:25
Danke, ich werd's mir mal ansehen.

Aber wie mache ich das mit dem Aufteilen des Bufs?

Florian
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#6

Re: Progress beim komprimieren mit CompressBuf anzeigen

  Alt 21. Mai 2005, 14:46
na deine compressbuf-funktion fragt dich doch bei den inpbytes, wie viel sie komprimieren soll, oder? (outbuf und outbytes sind dann ja wohl var-parameter, oder?)
ich hab jetzt n bisschen rumprobiert, aber ohne die compressbuf-funktion komm ich nicht weiter.
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#7

Re: Progress beim komprimieren mit CompressBuf anzeigen

  Alt 22. Mai 2005, 11:22
die compressbuf funktion ist bei d7 in der unit zlib enthalten!

Mann müsste praktisch den buf von byte 1 - 100, dann von 100 - 200, usw komprmieren und dann wieder zusammensetzen.

Florian
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#8

Re: Progress beim komprimieren mit CompressBuf anzeigen

  Alt 22. Mai 2005, 11:44
Hallo Florian,

das Komprimieren mit statistischer Kodierung (ZIP) entfaltet seine Vorteile erst bei größeren Blöcken. Außerdem ist ein Progressbar bei kleinen Wartezeiten eher nervig. Sowas macht man erst, wenn richtige Wartezeiten enstehen - deutlich jenseits der 2-Sekunden Grenze. Dann solltest du auch den CompressionStream und nicht CompressBuf() verwenden. Der Stream kennt das Ereignis OnProgress, mit dem du deinen ProgressBar steuern kannst.

Grüße vom marabu
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#9

Re: Progress beim komprimieren mit CompressBuf anzeigen

  Alt 22. Mai 2005, 11:46
Kannst du mir ein Beispiel geben, wie ich den Oberen Code einfach umschreiben kann? (Parameter, etc sollen gleich bleiben, da der Code in einem unfassenden Projekt verankert ist)
Ich hab bis jetzt noch nie mit CompressionStream gearbeitet ...

Florian
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#10

Re: Progress beim komprimieren mit CompressBuf anzeigen

  Alt 22. Mai 2005, 12:23
Auf die Schnelle - kommst du damit zurecht?

Delphi-Quellcode:
procedure TForm1.OnProgress(Sender: TObject);
begin
  with Sender as TCompressionStream do begin
    ProgressBar.Position := Position;
    Application.ProcessMessages;
  end;
end;

procedure CompressStream(inStream, outStream: TStream);
var
  cs: TCompressionStream;
begin
  Form1.ProgressBar.Max := inStream.Size;
  cs := TCompressionStream.Create(clDefault, outStream);
  cs.CopyFrom(inStream, inStream.Size);
  cs.OnProgress := Form1.OnProgress;
  cs.Free;
end;
marabu
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 12:54 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