Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Array of Threads ??? (https://www.delphipraxis.net/38534-array-threads.html)

lume96 20. Jan 2005 15:57


Array of Threads ???
 
Hallo,


Ich bin bei meinem ersten Prog mit Threads angelangt und stoße auf ein paar Probleme.

Mein Programm soll sich in bestimmten Zeitabständen in ein POP3-Postfach einloggen und die Mails runterladen. Das Ganze passiert in einem Thread, denn ich habe vor, mehrere Postfächer zeitgleich bearbeiten zu können.

Mein erstes Problem liegt darin, dass ich vorab nicht weiß, wie viele Threads im Programm laufen werden (der User soll neue POP3-Postfach-Profile erstellen können). Ich weiß daher nicht, wie ich mein(e) Thread(s) deklarieren soll?

Als Beispiel: wenn’s immer 4 wären, würde ich

Delphi-Quellcode:
  MyThread : array[1..4] of TMyThread;
deklarieren.

Soll ich einfach eine maximale mögliche Anzahl festlegen (hatte ich sowieso vor) und mein Array dementsprechend auslegen?

Was kostet es mich (welche Nachteile hat es), wenn ich z.B. sage :
Delphi-Quellcode:
     MyThread : array[1..50] of TMyThread;
Im Endeffekt aber nur, z.B. zwei Instanzen wirklich benutze :
Delphi-Quellcode:
 
MyThread[1] := TMyThread.Create(true);
MyThread[2] := TMyThread.Create(true);
Da jeder Thread seine eigene ProgressBar und eigenen Label haben soll, bezieht sich die gleiche Frage ebenfalls auf’n array of TLabel und array of TProgressbar.

Wäre für Eure Ratschläge echt dankbar.

Tschüss,
Lutz

alcaeus 20. Jan 2005 15:59

Re: Array of Threads ???
 
Hallo Lutz,

du könntest mit einem dynamischen Array arbeiten:
Delphi-Quellcode:
var MyThreads = array of TMyThread
Bevor du einen Thread hinzufügst:
Delphi-Quellcode:
SetLength(MyThreads, Length(MyThreads)+1);
Beim Löschen musst du dann den richtigen Platz wieder leermachen.

Greetz
alcaeus

lume96 20. Jan 2005 16:36

Re: Array of Threads ???
 
Hi,

erst mal vielen Dank für die schnelle Antwort.

Hab's kurz probiert und neue Threads hinzufügen klappt schon ganz gut.

Zitat:

Zitat von alcaeus
Beim Löschen musst du dann den richtigen Platz wieder leermachen.

Könntest Du mir das kurz erklären, bitte ?

Ich habe vor, in meiner Threadklasse ein Event zu implantieren der das Hauptprogramm informiert, dass der Thread fertig ist. In den Eventhandler des Hauptprogramms soll dann ein
Delphi-Quellcode:
MyThread[x].free;
rein.
Weiss nocht nicht, ob das so geht und wenn, wie, aber das finde ich bestimmt noch raus.
Wie auch immer, gegeben ich hab anfangs 2 Threads und der Erste ist fertig; führe also ein MyThread[1].Free; aus. Wie lösche ich dann den 'richtigen' Platz und was passiert wenn ich dann 'nen neuen Thread hinzufüge ? Wird der dann MyThread[3], auch wenn es den MyThread[1] nicht mehr gibt. Ich blick da nicht so ganz durch :? :oops:

Wäre super, wenn mir da jemand auf die Sprünge helfen könnte.
Tschüss,
Lutz

Jan 20. Jan 2005 16:42

Re: Array of Threads ???
 
Was er damit meint ist, dass du wissen muss an welcher Stelle in dem array du welchen thread abgelegt hast.
Wenn dein array also 4 Elemente hat, und du verlängerst deinen array mit setlength um eine Stelle und fügst einen neuen thread hinzu, dann befindet sich der neue thread in deinem array an der Stelle 4 also threadarray[4]. Wenn du den thread dann nachher wieder löschen willst, dann musst du natürlich wissen wo Du den abgelegt hast. Also musst Du Dir zu dem thread irgendwo die '4' ablegen.
Wenn du den array an der stelle x freigibst, und dann einen neuen thread hinzufügst, dann musst du trotzdem den array erstmal verlängern um einen weiteren thread hinzufügen zu können. Der neue thread wäre dann aber nicht an der stelle wo der alte gelöscht wurde, sondern jetzt an letzter stelle des arrays.
Du kannst allerdings nach dem Löschen eines threads in einer Schleife alle weiteren threads eins nach unten rücken, so dass der letzte Platz im array wieder frei wird.
Gruß
Jan

SirThornberry 20. Jan 2005 16:45

Re: Array of Threads ???
 
ich würde anstelle des Arrays da "TList" verwenden. Da gibts die Methoden "Add" und "Delete" die das anlegen und löschen übernehmen. mit "IndexOf" kann man dann auch feststellen an welcher Stelle der Thread in der Liste ist um diesen zu löschen.

lume96 20. Jan 2005 16:55

Re: Array of Threads ???
 
Ok,

Erst mal Danke für die Antworten/Vorschläge.

Ich werde die verschiedenen Lösungen mal durchprobieren und melde mich zurück, wenn ich Probleme habe.

Tschüss,
Lutz

Muetze1 20. Jan 2005 22:53

Re: Array of Threads ???
 
Moin!

Ich würde bei SirThomberry's Vorschlag noch ein wenig weiter treiben: Nutze die TObjectList aus der Unit Contnrs - diese ist nix weiter als TList, aber du kannst direkt Klassenoperatoren drauf anwenden, da er mit TObject hantiert.

MfG
Muetze1

lume96 21. Jan 2005 13:32

Re: Array of Threads ???
 
Moin,

@Muetze1: Danke für die Info. Hab es auch so gelöst (war bei einer Suche nach TList in der DP auf die TObjectList gestossen) und es scheint ganz gut zu laufen.

Kann, während das Prog läuft, Threads hinzufügen und wieder löschen, jeder Thread hat seine eigene ProgressBar und seinen eigenen CancelBtn auf dem Mainform und als klappt. :bounce2:

Ist fast schon beängstigend. Da das mein erstes Projekt mit Threads ist, hatte ich mit ordenlich Problemen gerechnet. Na ja, die kommen vielleicht noch.


Noch mal Danke an alle.
Tschüss,
Lutz


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