Autor Beitrag
inselberg
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 458



BeitragVerfasst: Mo 20.09.04 15:23 
Hi,

hab ein kleines Problem.
Eine liste mit mehrere 10.000 einträgen, wird durch 50Threads abgearbeitet. Sind nun 50 aktiv wird keine weitere mehr erzeugt (create schlägt fehl).

wenn dies geschieht soll gewartet werden.
Nutz ich hierzu sleep + Processmessages passiert nichts bzw das programm hängt.

Jmd ne idee wie ich warten.

danke.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
try
  TMyThread.Create(fn,false);
  wait:=false;
  inc(i);
 except
  wait:=true;
 end;

if wait then ... // hier liegt mein problem


Moderiert von user profile iconChristian S.: Code- durch Delphi-Tags ersetzt.

_________________
hans bist du das ?
.Chef
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1112



BeitragVerfasst: Mo 20.09.04 15:42 
inselberg hat folgendes geschrieben:
50 Threads

:shock:

Genau lässt sich das Problem aus deinem Codeschnipsel nicht erschließen, da musst schon meher herzeigen.

Aber wieso brauchst du eigentlich 50(!) Threads? Das ist erstens jenseits von Gut und Böse und zweitens auch nicht schneller als ein Thread zum Abarbeiten, wenn du eh warten musst, bis alles fertig ist. Und auf einen Thread lässt sichs viel einfacher warten (mit Terminated oder Assigned zum Beipsiel) als auf 50. Nochmal :shock:

Gruß,
Jörg

_________________
Die Antworten auf die 5 häufigsten Fragen:
1. Copy(), Pos(), Length() --- 2. DoubleBuffered:=True; --- 3. Application.ProcessMessages bzw. TThread --- 4. ShellExecute() --- 5. Keine Vergleiche von Real-Typen mit "="!
inselberg Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 458



BeitragVerfasst: Mo 20.09.04 15:56 
ich erstelle checksummen von dateien.

Zitat:
...wenn du eh warten musst...

ich muss ja nur dann warten wenn ich mein limit von threads erreicht habe.

_________________
hans bist du das ?
.Chef
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1112



BeitragVerfasst: Mo 20.09.04 16:12 
Mehr Code ist das jetzt aber nicht. ;-)

Für einen Thread könnte es so aussehen:
ausblenden Delphi-Quelltext
1:
2:
3:
repeat
  Application.ProcessMessages
until not Assigned(EinThread);

FreeAndNil im OnTerminate nicht vergessen!

Das Ganze machst du jetzt irgendwie für 50.

_________________
Die Antworten auf die 5 häufigsten Fragen:
1. Copy(), Pos(), Length() --- 2. DoubleBuffered:=True; --- 3. Application.ProcessMessages bzw. TThread --- 4. ShellExecute() --- 5. Keine Vergleiche von Real-Typen mit "="!
inselberg Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 458



BeitragVerfasst: Mo 20.09.04 16:28 
hehe das mit dem assigned würde nicht gehen da ich ja keine var zuweise ...
hab das problem jetzt aber anders gelöst in dem sich die threads (nicht 50 *g*) ihre daten selber holen...

ist ja auch irgendwie logischer ;)

danke trotzdem

_________________
hans bist du das ?
Lossy eX
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1048
Erhaltene Danke: 4



BeitragVerfasst: Mo 20.09.04 17:40 
Zum Thema Threads, Synchronisation etc kannst du dir auch mal mein Tutorial anschauen. Darin dürftest du noch das ein oder andere Wissenswerte finden. Ein Boolean ist nämlich für die Synchronistation nicht unbedingt gut geeignet. Es gibt besseres. ;-)

Multithreading Tutorial

_________________
Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 20.09.04 19:29 
Oder mein Threading Tutorial: tutorials/luckie-online.de als PDF und mit Demo Programmen, die das gesagte demonstrieren.