![]() |
Thread Verständnis Frage
Guten Morgen,
also ich starte einen Thread neben dem Hauptthread und im NebenThread starte ich weitere kleine Threads. Beispiel:
Delphi-Quellcode:
So es läuft auch alles, aber das Problem ist das die kleinen Threads nicht richtig durch laufen werden.
// NebenThread
for o:= 0 to frm_Main.EditMaxKat.Value do Begin KatScanThread:= TKatScanThread.Create(o); // kleine Baby Thread im Nebenthread KatScanThread.Start; // <--- Testweise Sleep(1000) End; Erst wenn ich ein sleep einfüge, dann laufen sie solange bis das sleep fertig und brechen wieder ab. Jedoch wäre dann die ganze Geschwindigkeit die ich raus holen möchte wieder futch. |
AW: Thread Verständnis Frage
Delphi-Quellcode:
Das darf so aber nicht in dem Thread stehen, sofern frm_Main ein Formular ist.. Gib die "Value" dem Thread im Konstruktor mit, oder setze das nach Create und vor Start als Property des Threads. Niemals auf VCL zugreifen von einem Thread aus.
for o:= 0 to frm_Main.EditMaxKat.Value do
Zu deinem Problem kann ich leider nichts weiter sagen... Meinst du denn, dass es Sinn macht, dass ein Thread andere Threads erstellt und sich dann direkt beendet? Dann können die anderen Threads ja gleich im Hauptthread erstellt werden. |
AW: Thread Verständnis Frage
Guten Morgen,
terminiert Dein Nebenthread gleich nachdem die Kindthreads erstellt wurden. Wenn ja, solltest Du in einer Schleife (im Nebenthread) prüfen ob alle Kindthreads abgearbeitet wurden und dann erst den Nebenthtread beenden. Grüße Klaus |
AW: Thread Verständnis Frage
Ja da hast du Recht,änder ich gleich, aber das ist leider nicht der auslöser.
|
AW: Thread Verständnis Frage
Wieviele Prozessoren/Kerne hast du denn im PC
und wieviele Threads startest du? Es können zur selben Zeit nur maximal genausoviele Threads mit voller Leistung laufen, wie CPU-Kerne vorhanden sind. Bei mehr muß Windows hin und herschalten und das verbaucht erstmal ein klein bissl zusätzliche Verwaltungszeit und insgesammt können alle Threads (auch die der anderen Programme eingerechnet) auch nur maximal mit 100%*Kerne arbeiten. Zitat:
|
AW: Thread Verständnis Frage
Das vermutete ich auch erst, aber ich hab die schleife laufen lassen von 0 bis 999 und in keinem durchlauf kam eine Rückmeldung via Showmessage aus die KindThreads, als wenn Sie nicht anfangen würden.
Nach einen kleinen sleep, bekam ich allerdings eine Rückmeldung von den KindThreads, wärend des durchlaufs die allerdings nach dem Sleep direkt wieder abgebrochen wurden, ohne das sich der NebenThread Terminiert hatte, da er ja noch durchlief. |
AW: Thread Verständnis Frage
Zitat:
Threads soviele wie ich in der schleife starten lasse. Hab es auch mit einer kleinen Anzahl versucht von 10 KindThreads
Delphi-Quellcode:
Brachte auch keinen Erfolg.
for o:= 0 to 9 do
Begin KatScanThread:= TKatScanThread.Create(o); KatScanThread.Start; End; Sleep(60000); // warte 60 Sekunden Testweise Das heißt der NebenThread wurde noch nicht terminated, aber dennoch liefen die kleinen Threads nicht durch(kein Showmessage bei KindThread aufgerufen). So sieht der Konstruktor vom KindThread aus
Delphi-Quellcode:
constructor TKatScanThread.Create(o: Integer);
Begin Fo:= o; inherited create(true); FreeOnTerminate := True End; |
AW: Thread Verständnis Frage
Hast du mal einen Thread debuggt? Ich schätze dass die abstürzen bevor die Message angezeigt werden kann. Du solltest kein ShowMessage in einem Thread benutzen. Also manchmal funktioniert es (meine ich) aber das ist wahrscheinlich eher Glück. Zeig doch mal den Code von den Threads. (Die Execute-Methode)
|
AW: Thread Verständnis Frage
ShowMessage nutzt intern einen VCL-Dialog und auf die VCL sollst du doch eh nicht innerhalb des Threads direkt zugreifen :warn:
![]() ![]() Was genau machst du denn in den Threads? PS: wenn man den Hauptthread schlafen legt und dann z.B. über Synchronize auf die VCL zugreift, dann muß das natürlich erst warten, bis der Hauptthread wieder läuft, bzw. bis dieser die aktellen Befehle fertig abgearbeitet hat und so wieder Zeit für die Nachrichtenverarbeitung bekommt. Zitat:
|
AW: Thread Verständnis Frage
Hab den Fehler gefunden, ich versuchte in den KindThreads auf eine im Nebenthread erstellte Klasse zu zugreifen, das mochte er anscheinend nicht.
|
AW: Thread Verständnis Frage
Delphi-Quellcode:
mochte er nicht.
NebenThread.Klasse.SourceKat:= GetSource(NebenThread.Klasse.slkat[Fo]+'-'+IntToStr(i));
Wie kann ich das besser lösen? Die Klasse im Konstruktor den KindThreads mitgeben? Ok, nun klappt es sobald ich die Klasse mit gebe im konstruktor. Allerdings habe ich nun trotzdem ein weiteres Problem, wie kann ich nach Beendigung der sehen, wann alle Threads fertig sind? Mit OnTerminate eine Methode bauen die im Nebenthread solange läuft bis alle gestarteten Threads zuende sind? |
AW: Thread Verständnis Frage
Ich löse das, indem ich eine globale Variable habe, die mir die Anzahl der gerade laufenden Threads anzeigt. Der Thread erhöht diese im Constructor und erniedrigt sie im Destructor. Mit TCriticalSection den Zugriff absichern (oder InterlockedIncrement / InterlockedDecrement). Oder wie gesagt das OnTerminate-Ereignis ausnutzen (wird im Kontext des VLC-Threads ausgeführt).
|
AW: Thread Verständnis Frage
.. Du könntest die Threads auch in ein TObjectList (OwnsObject = true) stecken.
Die Anzahl der Threads kannst Du dann mit TObejctList.count abfragen, denn die Threads fliegen dann wenn sie terminieren automatisch aus der TObjectList. Grüße Klaus |
AW: Thread Verständnis Frage
@Klause01
bist Du sicher ... ich kann mir nicht vorstellen daß die Threads sich bei Terminierung aus der Objektliste entfernen.
Delphi-Quellcode:
Var
o:TObjectList<TButton>; procedure TForm1.Button1Click(Sender: TObject); var b:TButton; begin o:=TObjectList<TButton>.Create; o.OwnsObjects := true; o.Add(TButton.Create(self)); o.Add(TButton.Create(self)); b := o[0]; b.Free; Caption := IntToStr(o.Count); // knallt natürlich o[0].Parent := self; end; |
AW: Thread Verständnis Frage
Zitat:
OwnsObject gibt ja nur die Objekte/Instanzen frei wenn die Liste freigegeben wird. Danke. Grüße Klaus |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:41 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