Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Thread Verständnis Frage (https://www.delphipraxis.net/156048-thread-verstaendnis-frage.html)

youuu 18. Nov 2010 08:17

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:
// 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;
So es läuft auch alles, aber das Problem ist das die kleinen Threads nicht richtig durch laufen werden.
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.

wicht 18. Nov 2010 08:25

AW: Thread Verständnis Frage
 
Delphi-Quellcode:
for o:= 0 to frm_Main.EditMaxKat.Value do
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.

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.

Klaus01 18. Nov 2010 08:26

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

youuu 18. Nov 2010 08:27

AW: Thread Verständnis Frage
 
Ja da hast du Recht,änder ich gleich, aber das ist leider nicht der auslöser.

himitsu 18. Nov 2010 08:27

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:

Zitat von wicht (Beitrag 1062260)
Niemals [add]direkt[/add] auf VCL zugreifen von einem Thread aus.

Mit Synchronize kann man das schon, aber da dieses sich mit dem Hauptthread synchronisiert und somit der enthaltene Code auch im Hauptthread läuft, würde es sich, bei zu häufigem Aufrufen, gegenseitig ausbremsen.

youuu 18. Nov 2010 08:30

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.

youuu 18. Nov 2010 08:34

AW: Thread Verständnis Frage
 
Zitat:

Zitat von himitsu (Beitrag 1062264)
Wieviele Prozessoren/Kerne hast du denn im PC
und wieviele Threads startest du?

2 Dualcore.

Threads soviele wie ich in der schleife starten lasse.

Hab es auch mit einer kleinen Anzahl versucht von 10 KindThreads

Delphi-Quellcode:
  for o:= 0 to 9 do
  Begin
    KatScanThread:= TKatScanThread.Create(o);
    KatScanThread.Start;
  End;
  Sleep(60000); // warte 60 Sekunden Testweise
Brachte auch keinen Erfolg.
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;

Neutral General 18. Nov 2010 08:37

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)

himitsu 18. Nov 2010 08:38

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:

MSDN-Library durchsuchenMessageBox oder eben über Delphi-Referenz durchsuchenTThread.Synchronize

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:

Zitat von Neutral General (Beitrag 1062267)
Zeig doch mal den Code von den Threads.

Dem würde ich mich anschließen.

youuu 18. Nov 2010 08:47

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 07:17 Uhr.
Seite 1 von 2  1 2      

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