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 |
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 |
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. |
Re: Thread Terminate Problem
noch jemand hier?
wäre lieb wenn ihr mir helfen könntet. |
Re: Thread Terminate Problem
Zitat:
Zitat:
|
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 |
Re: Thread Terminate Problem
Noch eine Info:
Wenn ich eine MessageBox in die For Schleife einbaue werden alle Thread richting beendet. |
Re: Thread Terminate Problem
Delphi-Quellcode:
Das geht schief...
dateiname:=s.strings[n];
tEncrypt := TEncryptionThread.Create(true); tEncrypt.Suspended:=True; //... tEncrypt.Resume; 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