| Autor |
Beitrag |
maxk
      
Beiträge: 1696
Erhaltene Danke: 1
Win XP, Debian Lenny
Delphi 6 Personal
|
Verfasst: Mi 18.06.03 06:51
Hi,
ich versuche mit folgendem Code 100 Threads zu erstellen:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| var Threads:array[1..100] of TCalcThread; a:integer; begin repeat for a:=1 to 100 do if Threads[a]=nil then Threads[a]:=TCalcThread.CreateThread(a); until (Application.Terminated) or (ButtonAbbrechenClicked); end; | Der Windows Task-Manager zeigt aber nur 5 Threads an. Sind alle 5 Threads beendet, wird die Schleife verlassen (auch wenn keine der Bedingugen erfüllt ist). Gibt es so eine Art MaxThread Schalter oder eine andere Erkärung?
maxk
_________________ Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.
Zuletzt bearbeitet von maxk am Mi 18.06.03 20:57, insgesamt 1-mal bearbeitet
|
|
mars
      
Beiträge: 238
Debian Woody, Win 2000, Win XP
D7 Ent, Kylix 3
|
Verfasst: Mi 18.06.03 08:37
Ich weiss nicht, ob es eine Beschränkung gibt, aber ich mal irgendwo gelesen, dass Borland für heutige Rechner (oder warens ältere?) höchstens 16 empfiehlt. Darüber sei Schluss.
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 18.06.03 09:56
Nur mal so als Denkanstoß: 100 Threads starten, ist gleichbedeutend mit dem Start von 100 Singlethread Programmen, wie Notepad oder Paint. Denkl mal drüber nach. 
|
|
AndyB
      
Beiträge: 1173
Erhaltene Danke: 14
RAD Studio XE2
|
Verfasst: Mi 18.06.03 12:49
| Luckie hat folgendes geschrieben: | Nur mal so als Denkanstoß: 100 Threads starten, ist gleichbedeutend mit dem Start von 100 Singlethread Programmen, wie Notepad oder Paint.  |
Nicht ganz, denn für einen Prozess kommt noch etwas mehr Overhead dazu. Aber das Prinzip stimmt.
_________________ Ist Zeit wirklich Geld?
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 18.06.03 13:34
Auf die Details wollte ich jetzt nicht eingehen. Ich wollte ihm nur mal deutlich machen, was er da überhaupt vor hat.
|
|
maxk 
      
Beiträge: 1696
Erhaltene Danke: 1
Win XP, Debian Lenny
Delphi 6 Personal
|
Verfasst: Mi 18.06.03 18:26
Starte ich die Threads 150 Mal, so sehe ich im Taskmanager 7 Threads. Ist das hilfreich?
_________________ Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 18.06.03 18:30
Dann würde ich mal behaupten, er wurde auch nur 7 mal gestartet. Ansonsten kuck mal auf deine Signatur.
|
|
maxk 
      
Beiträge: 1696
Erhaltene Danke: 1
Win XP, Debian Lenny
Delphi 6 Personal
|
Verfasst: Mi 18.06.03 18:38
_________________ Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.
|
|
AndyB
      
Beiträge: 1173
Erhaltene Danke: 14
RAD Studio XE2
|
Verfasst: Mi 18.06.03 18:41
Den obige Code hast du hier direkt im Forum programmiert. Denn so wie der aussieht, funktioniert er in keinem Fall, da er schon beim Syntax Check hängenbleibt.
_________________ Ist Zeit wirklich Geld?
|
|
maxk 
      
Beiträge: 1696
Erhaltene Danke: 1
Win XP, Debian Lenny
Delphi 6 Personal
|
Verfasst: Mi 18.06.03 18:51
Warscheinlich spielst du auf TCalcThread.CreateThread an. TCalcThread ist selbstgecoded (class TThread, was auch nicht richtig funktioniert).
_________________ Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.
|
|
AndyB
      
Beiträge: 1173
Erhaltene Danke: 14
RAD Studio XE2
|
Verfasst: Mi 18.06.03 18:56
Weniger. Denn das ist möglich. Jedoch meckert der Compiler bei "Treads", da dort das "h" fehlt.
Also bitte den original Code posten, denn mit "frei erfundenem" Code lässt sich ein Fehler recht schwer finden.
_________________ Ist Zeit wirklich Geld?
|
|
maxk 
      
Beiträge: 1696
Erhaltene Danke: 1
Win XP, Debian Lenny
Delphi 6 Personal
|
Verfasst: Mi 18.06.03 21:00
Entschuldigung für die Anspielung
Den Code habe ich mit der Hand abgetippt (weiß der Teufel warum). Den Fehler habe ich korrigiert.
Das nächste Mal kopiere ich den Code 
_________________ Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.
|
|
AndyB
      
Beiträge: 1173
Erhaltene Danke: 14
RAD Studio XE2
|
Verfasst: Mi 18.06.03 21:45
Was macht den CreateThread genau? Setzt es den ACreateSuspended Parameter von Create auf True oder etwa in einer Abhängigkeit von etwas?
Wie rufst du den Vorfahr-Create-Konstruktor auf? Etwa mit inherited Create? Hast du da auch einen eigenen Create-Konstruktor erstellt?
_________________ Ist Zeit wirklich Geld?
|
|
maxk 
      
Beiträge: 1696
Erhaltene Danke: 1
Win XP, Debian Lenny
Delphi 6 Personal
|
Verfasst: Do 19.06.03 18:37
Ich erstelle mit inherited Create(True);, mache ein paar Variablenzuweisungen à la Nr:=a; und FreeOnTerminate:=True und setze schließlich Suspended:=False;
_________________ Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.
|
|
AndyB
      
Beiträge: 1173
Erhaltene Danke: 14
RAD Studio XE2
|
Verfasst: Do 19.06.03 22:07
Ich habe mir dein Codebeispiel gerade noch einmal angeschaut. Du verwendest da ein statisches Array, das auf dem Stack liegt. Dieses musst du im Gegensatz zu dynamischen Arrays vorher initialisieren. Denn so wie es da oben steht, enthalten die Elemente des Arrays die Daten, die zufällig auf dem Stack liegen. Und diese zufälligen Werte sind nicht unbeding nil, womit deine if Threads[a] = nil Abfrage sehr häufig scheitert und kein Thread erstellt wird.
Was bei deinem Code fehlt ist folgendes:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| var Threads:array[1..100] of TCalcThread; a:integer; begin FillChar(Threads, SizeOf(Threads), 0); repeat for a:=1 to 100 do if Threads[a]=nil then Threads[a]:=TCalcThread.CreateThread(a); until (Application.Terminated) or (ButtonAbbrechenClicked); end; |
Wie greift eigentlich TCalcThread auf Threads[] zu um es wieder auf nil zu setzen. Den Index a hat TCalcThread ja, aber auf das lokale Array kann es nie zugreifen.
_________________ Ist Zeit wirklich Geld?
|
|
maxk 
      
Beiträge: 1696
Erhaltene Danke: 1
Win XP, Debian Lenny
Delphi 6 Personal
|
Verfasst: Fr 20.06.03 09:47
Danke, ich werdes es versuchen, wenn ich wieder zu Hause bin...
Das nil erfolgt automatisch durch FreeOnTerminate:=True. Bin aber wie gesagt noch nicht dazu gekommen, es auszutesten 
_________________ Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.
|
|
AndyB
      
Beiträge: 1173
Erhaltene Danke: 14
RAD Studio XE2
|
Verfasst: Fr 20.06.03 19:52
FreeOnTerminate := True verändert noch lange nicht den Eintrag im Threads-Array. Das musst du schon im Destruktor des Threads machen. Nur hat der keinen Zugriff auf das Array, weil der Index alleine nicht ausreicht um auf ein lokales Array zuzugreifen.
_________________ Ist Zeit wirklich Geld?
|
|
maxk 
      
Beiträge: 1696
Erhaltene Danke: 1
Win XP, Debian Lenny
Delphi 6 Personal
|
Verfasst: Sa 21.06.03 10:07
| AndyB hat folgendes geschrieben: | | weil der Index alleine nicht ausreicht um auf ein lokales Array zuzugreifen. |
Den Index brauche ich, um auf Dateien zuzugreifen, welche im Format Calc_0,Calc_1,usw. vorliegen. Das mit dem FreeOnTerminate wusste ich aber nicht. Wäre es möglich im Destructor zu schreiben: Delphi-Quelltext 1: 2:
| inherited Destroy; Self:=nil; | Trotzdem erklärt das aber alles nicht, warum nicht 100 Threads erstellt werden...
_________________ Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.
|
|
AndyB
      
Beiträge: 1173
Erhaltene Danke: 14
RAD Studio XE2
|
Verfasst: Sa 21.06.03 10:17
_________________ Ist Zeit wirklich Geld?
|
|
maxk 
      
Beiträge: 1696
Erhaltene Danke: 1
Win XP, Debian Lenny
Delphi 6 Personal
|
Verfasst: So 22.06.03 15:50
Danke, ich werde es probieren, wenn mein Delphi-Notebook aus der Reperatur zurück ist.
maxk
_________________ Ein Computer wird das tun, was Du programmierst - nicht das, was Du willst.
|
|