Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Thread Terminate Problem (https://www.delphipraxis.net/40931-thread-terminate-problem.html)

xman 23. Feb 2005 11:35


Thread Terminate Problem
 
Hallo zusammen.


Ich habe ein kleines Thread Problem und ich hoffe der Thread Experte Luckie und auch alle Anderen mir weiterhelfen können.


Folgende Situation:

Delphi-Quellcode:
//Create Thread
  dateiname:=s.strings[n];
  tEncrypt := TEncryptionThread.Create(true);
  tEncrypt.Priority := tpNormal;
  tEncrypt.FreeOnTerminate := true;
  tEncrypt.fInFileName := dateiname;
  tEncrypt.fPassphrase := g_key;
  tEncrypt.execute;

Delphi-Quellcode:
//execute proc
procedure TEncryptionThread.execute;
var
  DCPCipher: TDCP_blowfish;
  source, dest: TFileStream;
  temp:string;
begin
  temp:='_tmp';
  RenameFile(fInFileName,fInFileName+temp);
  dest := TFileStream.Create(fInFileName, fmCreate);
  fInFileName:=fInFileName+temp;
  source := TFileStream.Create(fInFileName, fmOpenRead);
  DCPCipher := TDCP_blowfish.Create(nil);
  DCPCipher.InitStr(fPassphrase, TDCP_sha512);
  DCPCipher.EncryptStream(source, dest, source.size);
  DCPCipher.Burn;
  dest.Free;
  source.Free;
  DeleteFile(fInFileName);
  FreeAndNil(DCPCipher);
  tEncrypt.Terminate;
end;

Das sind die beiden Prozeduren um die es geht.

Ich möchte das der Thread sich nach seiner Abarbeitung beendet.
Ich versuche das durch tEncrypt.terminate doch leider beendet sich der Thread nicht, zumindest steigt die Threadanzahl im Taskmanager immer weiter an. Oder ist das normal?

WaitForSingleObject kann ich eigentlich ausschließen da der Thread mehrere Minuten laufen kann, oder habe ich die Funktion falsch verstanden?


Wäre super wenn ihr mir kurz unter die Arme greifen könntet.



Aber bitte nicht sagen das man Create Thread nicht verwendet! Ich weiß es!

Danke
mfg xman

Sanchez 23. Feb 2005 12:02

Re: Thread Terminate Problem
 
Hallo,
Im Normalfall beendet sich der Thread, sobald die Methode Execute verlassen wird.
Allerdings wird normalerweiße der Thread mit Thread.Resume gestartet, wenn er "Suspended" erzeugt wurde.
Eventuell liegts daran.

grüße, daniel

xman 23. Feb 2005 12:19

Re: Thread Terminate Problem
 
Erstmal danke für die schnelle Antwort!


Ich habe jetzt folgendes versucht:


Delphi-Quellcode:
  dateiname:=s.strings[n];
  tEncrypt := TEncryptionThread.Create(true);
  tEncrypt.Suspended:=True;
  tEncrypt.OnFertig:=ThreadFertig;
  tEncrypt.Priority := tpNormal;
  tEncrypt.FreeOnTerminate := true;
  tEncrypt.fInFileName := dateiname;
  memo1.lines.add('thread:' +dateiname);
  tEncrypt.fPassphrase := g_key;
  tEncrypt.Resume;
Delphi-Quellcode:
procedure TEncryptionThread.execute;
var
  DCPCipher: TDCP_blowfish;
  source, dest: TFileStream;
  temp:string;
begin
  temp:='_tmp';
  RenameFile(fInFileName,fInFileName+temp);
  dest := TFileStream.Create(fInFileName, fmCreate);
  fInFileName:=fInFileName+temp;
  source := TFileStream.Create(fInFileName, fmOpenRead);
  DCPCipher := TDCP_blowfish.Create(nil);
  DCPCipher.InitStr(fPassphrase, TDCP_sha512);
  DCPCipher.EncryptStream(source, dest, source.size);
  DCPCipher.Burn;
  dest.Free;
  source.Free;
  DeleteFile(fInFileName);
  FreeAndNil(DCPCipher);
  if Assigned(OnFertig) then OnFertig(Self);
end;

Delphi-Quellcode:
procedure TfrmMain.ThreadFertig(Sender: TObject);
begin
tEncrypt.terminate;
if tEncrypt.Terminated then begin
  inc(x);
  ppercent:=Trunc(x/pmax*100);
  ProgressBar.Position:=ppercent;
  Application.ProcessMessages;
end;

end;


Das scheint so zu funktionieren, nur habe ich jetzt ein anders Problem...
Der letzte Thread wird nicht gestartet. Also wenn ich 12 Threads create läuft er beim 12 Thread nicht mehr in "ThreadFertig" if terminated rein.

xman 24. Feb 2005 08:27

Re: Thread Terminate Problem
 
noch jemand hier?


wäre lieb wenn ihr mir helfen könntet.

tommie-lie 24. Feb 2005 08:46

Re: Thread Terminate Problem
 
Zitat:

Zitat von xman
Aber bitte nicht sagen das man Create Thread nicht verwendet! Ich weiß es!

:gruebel: Du verwendest doch gar kein CreateThread, und wenn man weiß, was man tut, kann man es auch benutzen...

Zitat:

Zitat von xman
Der letzte Thread wird nicht gestartet. Also wenn ich 12 Threads create läuft er beim 12 Thread nicht mehr in "ThreadFertig" if terminated rein.

Wie erzeugst du denn die Threads? Startest du wirklich 12, oder gehlt die letzte Schleifeniteration? Wird denn beim 12. Thread nochtEncrypt.Terminate aufgerufen, oder wird das gesamte OnFertig-Event nicht bearbeitet? Ist es überhaupt für den 12. Thread korrekt zugewiesen?

xman 24. Feb 2005 08:56

Re: Thread Terminate Problem
 
createn tue ich in einer for schleife:

Delphi-Quellcode:
for n:=0 to s.count-1 do begin
  dateiname:=s.strings[n];
  tEncrypt := TEncryptionThread.Create(true);
  tEncrypt.OnFertig:=ThreadFertig;
  tEncrypt.Priority := tpNormal;
  tEncrypt.fInFileName := dateiname;
  memo1.lines.add('thread:' +dateiname);
  tEncrypt.fPassphrase := g_key;
  tEncrypt.Resume;
end;

und es werden definitiv auf 12 thread created.

Die execute Prozedure wird aber nur 11 mal aufgerufen. Kann es sein das Resume nur dann execute aufruft wenn min. noch ein weiterer Thread beseteht o.Ä.?

Das ist meine Vermutung anders könnte ich es mir nicht erklären.

Vielleicht habt ihr ja noch eine andere Idee.


danke im Voraus

xman 24. Feb 2005 09:02

Re: Thread Terminate Problem
 
Noch eine Info:

Wenn ich eine MessageBox in die For Schleife einbaue werden alle Thread richting beendet.

Lasse2002 24. Feb 2005 22:34

Re: Thread Terminate Problem
 
Delphi-Quellcode:
dateiname:=s.strings[n];
  tEncrypt := TEncryptionThread.Create(true);
  tEncrypt.Suspended:=True;
//...
  tEncrypt.Resume;
Das geht schief...
Du rufst Suspend 2mal auf (1. mal bei Create mit true als Parameter), dann mußt du auch resume 2mal aufrufen, damit der Thread ausgeführt wird.

Übrigens soll Suspend laut Windows API nicht zur Thread-Synchronisation verwendet werden.


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