Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Bestimmten Thread beende (https://www.delphipraxis.net/123818-bestimmten-thread-beende.html)

delphinia 9. Nov 2008 14:14


Bestimmten Thread beende
 
Hallo ihr lieben,
mein Problem, ist das wenn ich einen Thread Beende per Teminate es sich immer um den zu letzt gestartenden handelt nicht um den, den ich will.!


Wie kann ich einen von vielen bestimmten beenden?

Starten tu ich nen Thrad so

Delphi-Quellcode:
 
if bookliste.Selected <> nil then
  begin
    user := Tpop3.Create(true);
    user.Priority := tpNormal;
    user.FIndex := bookliste.Selected.Index;
    user.FreeOnTerminate := True;
    user.OnTerminate := OnTerminate;
    user.Resume;
  end;
Beende so
Delphi-Quellcode:
 

ButtonClick
user.Terminate;

Thread


Delphi-Quellcode:
type
  Tuser = class(TThread)
  private
    { Private-Deklarationen }
  protected
    procedure Execute; override;
  public
    FIndex: Integer;
    S: string;
    procedure Ausgabe;
  end;



procedure Tuser.Execute;
begin
User_info.id := FIndex; // BENÖTIGT UM FÜR JEDEN PROCED BESTIMMTE USER DATEN ZU BENUTZEN

    for i := 1 to Counter do
    begin
      if Terminated then
      begin
        Synchronize(Ausgabe);
        Exit;
      end;
   Do_other();
     end;
   
  Synchronize(Ausgabe);
end;

Das heisst also es können 2 oder X viele Threads laufen je nachdem....
Beim Start und erstellen eines Threads ziehe ich dann die UserDaten heran.
In der Form markiert man einen EIntrag X dieser ist gleich eines Datensatzen der INDEX wird übergeben an den Thread und vor Thredsstart die entsprechenden Daten ausgelesen und dann verarbeitet aber das ja auch egal :-)

BUG 9. Nov 2008 14:22

Re: Bestimmten Thread beende
 
Du könntest die Thread-Objekte beim Erstellen in eine Liste (z.B. TList) eintragen und bei OnTerminate wieder austragen.

MfG,
Bug

delphinia 9. Nov 2008 14:24

Re: Bestimmten Thread beende
 
:wiejetzt: Wäre lieb, wenn Du mir mehr Input dazu geben tätest....
D A N KE

DeddyH 9. Nov 2008 14:32

Re: Bestimmten Thread beende
 
Schau Dir mal alzaimars Workerthread an. Von jbg gibt es da auch noch was, hab aber im Moment den Namen nicht im Kopf.

BUG 9. Nov 2008 15:22

Re: Bestimmten Thread beende
 
Delphi-Quellcode:
var List: TList; // irgendwo create aufrufen nicht vergessen
// ...
if bookliste.Selected <> nil then
  begin
    user := Tpop3.Create(true);
    user.Priority := tpNormal;
    user.FIndex := bookliste.Selected.Index;
    user.FreeOnTerminate := True;
    user.OnTerminate := OnTerminate;
    List.add(user);
    user.Resume;
  end;

// in OnTerminate
List.remove(sender);

// das Beenden von einem der Threads
(List[{Index}] as TThread).terminate;

// beim Beenden des Programms
List.free;
Welchen Index du beim Beenden des Threads angibst, hängt davon ab welchen Thread du beenden willst.

Ich hoffe das hilft dir und ich mich nicht zu verworren ausgedrückt habe :mrgreen:

MfG,
Bug

delphinia 9. Nov 2008 18:51

Re: Bestimmten Thread beende
 
Hey @BUG der Code ist verständlich.
Doch ein Fehler gibt es


Delphi-Quellcode:
(List[1] as TThread).terminate;
Operator ist auf diesen Operandentyp nicht anwendbar

BUG 9. Nov 2008 18:57

Re: Bestimmten Thread beende
 
Zitat:

Zitat von delphinia
Delphi-Quellcode:
(List[1] as TThread).terminate;
Operator ist auf diesen Operandentyp nicht anwendbar

Ops, das kommt davon wenn man nicht ausprobiert was man postet :wall:
Delphi-Quellcode:
TThread(List[{Index}]).terminate;
Das müsste jetzt zumindest kompilieren.

MfG,
Bug

delphinia 9. Nov 2008 20:29

Re: Bestimmten Thread beende
 
Ok, das funktioniert.

Soweit alles ok.
Allerdings gibt es ein neues Problem.

Wenn ich sagen wir 5 Threads habe.
Davon beendet sich der erste und der 3. Verutschen alle Threads ja um eine bzw zwei Pisitionen in der TList nach oben.
Das heisst, ich weiss nicht mehr welcher Thread wo ist.

Denn ich nahm an, dass wenn ich eine ListBox habe In der stehen meine Namen. Doppeklicke ich auf einen, läuft der Thread los. klicke ich wieder auf einen der Namen beendet sich der entsprechende Thread und nahm an, das der Index der NamesListe = der TList ist. DAs ist nicht so. Wie bzw. Woher erfahre ich denn nun, welcher Threaad zu welchem EIntrag in meiner ListBox gehört.


Suchte mir schon nen Wolf bei Google aber da ist niee so das was mir hilft, bzw mit dem Beispiel hier passt

DeddyH 9. Nov 2008 20:32

Re: Bestimmten Thread beende
 
Du wirst die Listbox ja wahrscheinlich selbst befüllen. Wenn Du nun statt Listbox.Items.Add() Listbox.Items.AddObject() verwendest, kannst Du den Thread als Objekt übergeben.


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