AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Schwierigkeiten mit 7-zip und Events
Thema durchsuchen
Ansicht
Themen-Optionen

Schwierigkeiten mit 7-zip und Events

Ein Thema von a.def · begonnen am 5. Dez 2016 · letzter Beitrag vom 6. Dez 2016
Antwort Antwort
a.def
(Gast)

n/a Beiträge
 
#1

Schwierigkeiten mit 7-zip und Events

  Alt 5. Dez 2016, 14:31
Ich habe vor Kurzem die SevenZIPVCL-Komponente (http://www.yard2usb.de/joomla/index....i-tsevenzipvcl) entdeckt und auch gleich ein Mini-Demo geschrieben.

Ich benutze die Version 0.7.6 und so sieht mein Button der Demo aus
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
 aSevenZip: TSevenZip;
begin
 Caption := 'Compressing ...';

 aSevenZip := TSevenZip.Create(Self);

 try
  // aSevenZip.OnProgress := SevenZipOnProgress;
  // aSevenZip.OnAddfile := SevenZipOnAddFile;

  aSevenZip.AddRootDir := 'E:\7ztest\';
  aSevenZip.SZFileName := ExtractFilePath(Application.ExeName) + 'Test.7z';
  // aSevenZip.Password := '123456';

  aSevenZip.LZMACompressType := LZMA; // LZMA, PPMD
  aSevenZip.LZMACompressStrength := NORMAL; // SAVE, FAST, NORMAL, MAXIMUM, ULTRA
  aSevenZip.AddOptions := []; // AddRecurseDirs, AddSolid, AddStoreOnlyFilename, AddIncludeDriveLetter, AddEncryptFilename

  aSevenZip.Files.Clear;
  aSevenZip.Files.AddString('E:\7ztest\249MB.123');
  aSevenZip.Files.AddString('E:\7ztest\123\456.txt');
  aSevenZip.Files.AddString('E:\7ztest\456');

  // aSevenZip.SevenZipComment := 'Comment!';

  aSevenZip.add;
 finally
  aSevenZip.Free;
 end;

 Caption := 'Done';
end;
Das funktioniert einwandfrei.
Nur sobald ich OnProgress, OnAddfile oder beides verwende, scheint mein Demo-Programm (welches nur diesen Button und eine ProgressBar hat) zu hängen.

Die Event-Prozeduren sehen so aus
Delphi-Quellcode:
procedure TForm1.SevenZipOnProgress(Sender: TObject; Filename: WideString; FilePosArc, FilePosFile: Int64);
begin
 ProgressBar1.Position := FilePosArc;
 Application.ProcessMessages;
end;

procedure TForm1.SevenZipOnAddFile(Sender: TObject; Filename: WideString; Filesize: Int64);
begin
 Caption := Filename;
 ProgressBar1.Position := 0;
 ProgressBar1.Max := Filesize;
end;
Ist das ein Bug? Denn egal was in den Event-Prozeduren steht, es führt immer zum Stillstand der Demo.
Es scheint so, als ob die Demo nur hängt, wenn in den Events irgendwas steht was mit der VCL zu tun hat. Wenn ich dort reinschreibe i:=123; hängt sich nichts auf.
  Mit Zitat antworten Zitat
mensch72

Registriert seit: 6. Feb 2008
838 Beiträge
 
#2

AW: Schwierigkeiten mit 7-zip und Events

  Alt 5. Dez 2016, 14:48
..."Es scheint so, als ob die Demo nur hängt, wenn in den Events irgendwas steht was mit der VCL zu tun hat."...

Wenn man die Callbackquelle innerhalb von 7Zip nicht kennt, gehe man davon aus, das es dort in/durch einen Thread aufgerufen wird.

-> Also hier NIX mit VCL und KEIN Application.ProcessMessages... besser im Event nur irgendetwas einfaches ala PostMessage, Syncronize, CallInMainTread oä.
  Mit Zitat antworten Zitat
a.def
(Gast)

n/a Beiträge
 
#3

AW: Schwierigkeiten mit 7-zip und Events

  Alt 5. Dez 2016, 15:15
..."Es scheint so, als ob die Demo nur hängt, wenn in den Events irgendwas steht was mit der VCL zu tun hat."...

Wenn man die Callbackquelle innerhalb von 7Zip nicht kennt, gehe man davon aus, das es dort in/durch einen Thread aufgerufen wird.

-> Also hier NIX mit VCL und KEIN Application.ProcessMessages... besser im Event nur irgendetwas einfaches ala PostMessage, Syncronize, CallInMainTread oä.
Ich habe das gerade auch mal flott mit TJcl7zCompressArchive getestet. Dort genau dasselbe Problem.

Wie würde das denn im Mainthread mit Postmessage funktionieren?
Ich benutze der Einfachheit halber jetzt die JEDI-Komponenten. Es wird aber dieselbe DLL verwendet.

Folgendes scheint scheinbar nicht zu funktionieren (GUI wird nicht aktualisiert)
Delphi-Quellcode:
const
 WM_UPDATE_PB = WM_USER;

procedure UpdateMessage(Value: Int64);
begin
 PostMessage(Form1.Handle, WM_UPDATE_PB, Value, 0);
end;

procedure TForm1.WMUpdatePB(var msg: TMessage);
begin
 ProgressBar1.Position := msg.WParam;
 Application.ProcessMessages;
end;

procedure TForm1.JclOnProgress(Sender: TObject; const Value, MaxValue: Int64);
begin
 UpdateMessage(Value);
 // ProgressBar1.Position := Value;
 // Application.ProcessMessages;
end;

Geändert von a.def ( 5. Dez 2016 um 15:20 Uhr)
  Mit Zitat antworten Zitat
mensch72

Registriert seit: 6. Feb 2008
838 Beiträge
 
#4

AW: Schwierigkeiten mit 7-zip und Events

  Alt 5. Dez 2016, 16:20
http://docwiki.embarcadero.com/RADSt...andling_Method

es fehlt dir wohl noch der "MessageMap" im Form
Delphi-Quellcode:
protected
   procedure UserMsgProc(var Message: TMessage); message WM_USER;
end;
(und ich würde statt "Application.ProcessMessages;" lieber "ProgressBar1 .Update .Repaint .Invalidate" verwenden wenn es das gibt. Wenn etwas nur mit "ProcessMessages" geht, ist meist das Konzept nicht so wirklich gut)

Geändert von mensch72 ( 5. Dez 2016 um 16:24 Uhr)
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.277 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: Schwierigkeiten mit 7-zip und Events

  Alt 5. Dez 2016, 16:24
Hallo,
wenn intern ein Thread benutzt wird, fehlt vielleicht nur Synchronize beim Upate der GUI im Hauptprogramm.
Heiko
  Mit Zitat antworten Zitat
a.def
(Gast)

n/a Beiträge
 
#6

AW: Schwierigkeiten mit 7-zip und Events

  Alt 5. Dez 2016, 17:23
http://docwiki.embarcadero.com/RADSt...andling_Method

es fehlt dir wohl noch der "MessageMap" im Form
Delphi-Quellcode:
protected
   procedure UserMsgProc(var Message: TMessage); message WM_USER;
end;
(und ich würde statt "Application.ProcessMessages;" lieber "ProgressBar1 .Update .Repaint .Invalidate" verwenden wenn es das gibt. Wenn etwas nur mit "ProcessMessages" geht, ist meist das Konzept nicht so wirklich gut)
In der offiziellen JEDI-Demo ist er auch nicht vorhanden und dort funktioniert das Aktualisieren der GUI auch nicht.

Hallo,
wenn intern ein Thread benutzt wird, fehlt vielleicht nur Synchronize beim Upate der GUI im Hauptprogramm.
Mein Code wird im Hauptthread ausgeführt.

Ich habe mal ein bisschen rumgespielt und den Code im Button in Folgendes gepackt
Delphi-Quellcode:
TThread.CreateAnonymousThread(
 procedure
  begin
  end).Start:
Dann funktioniert es. Aber warum nicht schon mit PostMessage usw.? Damit habe ich es ja auch versucht.

Geändert von a.def ( 5. Dez 2016 um 17:28 Uhr)
  Mit Zitat antworten Zitat
Ghostwalker

Registriert seit: 16. Jun 2003
Ort: Schönwald
1.299 Beiträge
 
Delphi 10.3 Rio
 
#7

AW: Schwierigkeiten mit 7-zip und Events

  Alt 5. Dez 2016, 17:34
Jaja.....nur die DLL, die nutzt sehr wohl Threads.
Uwe
e=mc² or energy = milk * coffee²
  Mit Zitat antworten Zitat
Antwort Antwort


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 01:03 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