AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Thread Terminate Problem

Ein Thema von xman · begonnen am 23. Feb 2005 · letzter Beitrag vom 24. Feb 2005
Antwort Antwort
xman
(Gast)

n/a Beiträge
 
#1

Thread Terminate Problem

  Alt 23. Feb 2005, 12:35
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
  Mit Zitat antworten Zitat
Benutzerbild von Sanchez
Sanchez

Registriert seit: 24. Apr 2003
Ort: Neumarkt Stmk
892 Beiträge
 
Delphi XE6 Enterprise
 
#2

Re: Thread Terminate Problem

  Alt 23. Feb 2005, 13:02
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
Daniel
Testen ist feige!
  Mit Zitat antworten Zitat
xman
(Gast)

n/a Beiträge
 
#3

Re: Thread Terminate Problem

  Alt 23. Feb 2005, 13:19
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.
  Mit Zitat antworten Zitat
xman
(Gast)

n/a Beiträge
 
#4

Re: Thread Terminate Problem

  Alt 24. Feb 2005, 09:27
noch jemand hier?


wäre lieb wenn ihr mir helfen könntet.
  Mit Zitat antworten Zitat
tommie-lie
(Gast)

n/a Beiträge
 
#5

Re: Thread Terminate Problem

  Alt 24. Feb 2005, 09:46
Zitat von xman:
Aber bitte nicht sagen das man Create Thread nicht verwendet! Ich weiß es!
Du verwendest doch gar kein CreateThread, und wenn man weiß, was man tut, kann man es auch benutzen...

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?
  Mit Zitat antworten Zitat
xman
(Gast)

n/a Beiträge
 
#6

Re: Thread Terminate Problem

  Alt 24. Feb 2005, 09:56
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
  Mit Zitat antworten Zitat
xman
(Gast)

n/a Beiträge
 
#7

Re: Thread Terminate Problem

  Alt 24. Feb 2005, 10:02
Noch eine Info:

Wenn ich eine MessageBox in die For Schleife einbaue werden alle Thread richting beendet.
  Mit Zitat antworten Zitat
Lasse2002

Registriert seit: 29. Nov 2004
79 Beiträge
 
RAD-Studio 2009 Pro
 
#8

Re: Thread Terminate Problem

  Alt 24. Feb 2005, 23:34
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.
  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 08: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