AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Thread Verständnis Frage

Ein Thema von youuu · begonnen am 18. Nov 2010 · letzter Beitrag vom 18. Nov 2010
Antwort Antwort
Seite 1 von 2  1 2      
youuu

Registriert seit: 2. Sep 2008
Ort: Kleve
822 Beiträge
 
Delphi 2010 Professional
 
#1

Thread Verständnis Frage

  Alt 18. Nov 2010, 09:17
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.
Steven
  Mit Zitat antworten Zitat
Benutzerbild von wicht
wicht

Registriert seit: 15. Jan 2006
Ort: Das schöne Enger nahe Bielefeld
809 Beiträge
 
Delphi XE Professional
 
#2

AW: Thread Verständnis Frage

  Alt 18. Nov 2010, 09:25
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.
http://streamwriter.org

"I make hits. Not the public. I tell the DJ’s what to play. Understand?"
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.771 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Thread Verständnis Frage

  Alt 18. Nov 2010, 09:26
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
Klaus
  Mit Zitat antworten Zitat
youuu

Registriert seit: 2. Sep 2008
Ort: Kleve
822 Beiträge
 
Delphi 2010 Professional
 
#4

AW: Thread Verständnis Frage

  Alt 18. Nov 2010, 09:27
Ja da hast du Recht,änder ich gleich, aber das ist leider nicht der auslöser.
Steven
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#5

AW: Thread Verständnis Frage

  Alt 18. Nov 2010, 09:27
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.


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.
$2B or not $2B

Geändert von himitsu (18. Nov 2010 um 09:31 Uhr)
  Mit Zitat antworten Zitat
youuu

Registriert seit: 2. Sep 2008
Ort: Kleve
822 Beiträge
 
Delphi 2010 Professional
 
#6

AW: Thread Verständnis Frage

  Alt 18. Nov 2010, 09:30
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.
Steven
  Mit Zitat antworten Zitat
youuu

Registriert seit: 2. Sep 2008
Ort: Kleve
822 Beiträge
 
Delphi 2010 Professional
 
#7

AW: Thread Verständnis Frage

  Alt 18. Nov 2010, 09:34
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;
Steven
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#8

AW: Thread Verständnis Frage

  Alt 18. Nov 2010, 09:37
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)
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#9

AW: Thread Verständnis Frage

  Alt 18. Nov 2010, 09:38
ShowMessage nutzt intern einen VCL-Dialog und auf die VCL sollst du doch eh nicht innerhalb des Threads direkt zugreifen

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.

Zeig doch mal den Code von den Threads.
Dem würde ich mich anschließen.
$2B or not $2B
  Mit Zitat antworten Zitat
youuu

Registriert seit: 2. Sep 2008
Ort: Kleve
822 Beiträge
 
Delphi 2010 Professional
 
#10

AW: Thread Verständnis Frage

  Alt 18. Nov 2010, 09:47
Hab den Fehler gefunden, ich versuchte in den KindThreads auf eine im Nebenthread erstellte Klasse zu zugreifen, das mochte er anscheinend nicht.
Steven
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:53 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