Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Threads in Listbox verwalten (https://www.delphipraxis.net/181994-threads-listbox-verwalten.html)

MarLe 23. Sep 2014 14:53

Delphi-Version: XE2

Threads in Listbox verwalten
 
Hallo zusammen,

wie verwalte ich mehrere Threads über eine Listbox?

... so starte ich (vereinfacht dargestellt):
Code:
var
  xThread: TMyThread;
 
procedure TForm1.ButtonStartClick(Sender: TObject);
begin
  xThread := TMyThread.Create;
  xThread.FreeOnTerminate := True;

  inc(iTNr);
  xThread.Nr := iTNr;
  xThread.Id := xThread.ThreadID;  //nur zur Thread Unterscheidung
  xThread.Start;

  ListBox1.Items.AddObject('Thread ' + IntToStr(iTNr), xThread);
  ...
... das Stoppen ausgewählter Threads haut noch nicht hin ?!?
Code:
procedure TForm1.ButtonStopClick(Sender: TObject);
begin

  if ListBox1.ItemIndex > -1 then
  begin

    xThread.Terminate;  //stoppt nur den letzten!!!

    ListBox1.Items.Delete(ListBox1.ItemIndex);
    ...
Wie komme ich da an das hinterlegte Objekt? (hab da was von Casten gelesen, kann es aber in der Syntax nicht umsetzen)

Gruß MarLe

DeddyH 23. Sep 2014 15:04

AW: Threads in Listbox verwalten
 
Wenn Du das Objekt mit
Delphi-Quellcode:
ListBox1.Items.AddObject('Thread ' + IntToStr(iTNr), xThread);
in der ListBox hinterlegst, müsstest Du mit
Delphi-Quellcode:
(ListBox1.Items.Objects[ListBox1.ItemIndex] as TMyThread)
wieder herankommen.

baumina 23. Sep 2014 15:09

AW: Threads in Listbox verwalten
 
Mit casten meinst du wahrscheinlich so:

Delphi-Quellcode:
  xThread := TMyThread(ListBox1.Items.Objects[ListBox1.ItemIndex]);
  xThread.Terminate;

MarLe 23. Sep 2014 15:22

AW: Threads in Listbox verwalten
 
Funzt Danke, so habe ich es jetzt stehen:
Code:
(ListBox1.Items.Objects[ListBox1.ItemIndex] as TMyThread).Terminate;
Was mich jetzt wundert dass er damit auch gleich den Eintrag aus der ListBox nimmt?!?

Gruß MarLe

Sir Rufo 23. Sep 2014 15:26

AW: Threads in Listbox verwalten
 
Am besten ist es natürlich so etwas nicht mit einer ListBox zu verwalten.

Dafür schafft man sich einen Kontext, der auch länger als das Formular lebt und verwaltet die Threads dort. Wenn man das jetzt in einer ListBox anzeigen möchte, nun einfach machen ... aber direkt damit koppeln ist immer der Anfang vom Ende ;)

baumina 23. Sep 2014 15:28

AW: Threads in Listbox verwalten
 
Zitat:

Zitat von MarLe (Beitrag 1273518)
Was mich jetzt wundert dass er damit auch gleich den Eintrag aus der ListBox nimmt?!?

Das liegt ganz bestimmt an dieser Zeile :-D
Delphi-Quellcode:
ListBox1.Items.Delete(ListBox1.ItemIndex);

MarLe 23. Sep 2014 15:50

AW: Threads in Listbox verwalten
 
Zitat:

Das liegt ganz bestimmt an dieser Zeile
ListBox1.Items.Delete(ListBox1.ItemIndex);
Stimmt, das hatte ich doppelt drin!

Zitat:

Am besten ist es natürlich so etwas nicht mit einer ListBox zu verwalten.
Ok, das habe ich mir schon gedacht dass es da was Besseres gibt.
Ich will mich ja steigern, der nächste Versuch wäre die Verwaltung über eine ObjectList.
Da gibt es ja eine alte und eine neue mit Generics, typsicher habe ich gelesen.
Hast du da vielleicht ein Anschauungsbeispiel wie man das richtig macht.
Ich will eigentlich nur x-Threads starten, aber gezielt einzelene wieder stoppen.
Mir geht's jetzt mehr ums Verständnis wie man das sauber macht.

Gruß MarLe


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