Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Problem mit Threads (https://www.delphipraxis.net/32708-problem-mit-threads.html)

Nightshade 27. Okt 2004 14:48


Problem mit Threads
 
Bei folgender Procedure in einen Thread bekomme ich eine AV, wenn ich den Thread mit Resume starte.
Führe ich ihn per Execute aus funktioniert alles.

Delphi-Quellcode:
type
  TCalulateCheckSum = class(TThread)
  private
    { Private-Deklarationen }
  protected
    sha1 : TlbSHA1;
    SHA1Digest : TSHA1Digest;
    procedure UpdateListItem1;
    procedure UpdateListItem2;
    procedure Execute; override;
  public
    ListItem : TListItem;
    Checksum : string;
    Filename : string;
  end;

implementation

uses unit2;

procedure TCalulateCheckSum.Execute;
begin
  { Thread-Code hier einfügen }
  Synchronize(UpdateListItem1);
  sha1 := TLBSha1.Create(nil);
  sha1.HashFile(Filename);
  sha1.GetDigest(SHA1Digest);
  checksum := BufferToHex(SHA1Digest, SizeOf(SHA1Digest));
  sha1.Free;
  Synchronize(UpdateListItem2);
end;

Aufruf :

Delphi-Quellcode:
procedure TForm2.ListViewCheck;
var t : integer;
   CheckSum : TCalulateCheckSum;
begin
  if Checksumrunning then exit;

  for t := 0 to pred(ListView2.Items.Count) do begin
     if ListView2.Items[t].SubItems[1] = 'to be hashed...' then begin
      Checksumrunning := true;
      Checksum := TCalulateCheckSum.Create(true);
      Checksum.ListItem := ListView2.Items[t];
      Checksum.Filename := ListView2.Items[t].Caption;
      CheckSum.FreeOnTerminate := true;
      Checksum.resume;         //  <<--  wenn ich hier execute schreibe funzt alles.
      exit;
    end;
  end;
end;
Jemand ne Idee woran das liegen könnte ?

Luckie 27. Okt 2004 14:50

Re: Problem mit Threads
 
Zeig mal die Synchronize Methode.

Nightshade 27. Okt 2004 14:53

Re: Problem mit Threads
 
Delphi-Quellcode:
procedure TCalulateCheckSum.UpdateListItem1;
begin
  ListItem.SubItems[1] := 'Hashing...';
  ListItem.Update;
end;

procedure TCalulateCheckSum.UpdateListItem2;
begin
  ListItem.SubItems[1] := checksum;
  Form2.Checksumrunning := false;
  Form2.Timer1.Enabled := true;
end;

Nightshade 27. Okt 2004 16:15

Re: Problem mit Threads
 
OK, Fehler gefunden...

Es lag an der SHA1 Komponente, die war irgendwie fehlerhaft.
Ich habe es mit einer anderen SHA1-Unit versucht, und dann gings.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:14 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