![]() |
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.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:57 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 by Thomas Breitkreuz