Thema: Delphi auf thread warten

Einzelnen Beitrag anzeigen

hyype

Registriert seit: 5. Nov 2008
97 Beiträge
 
Delphi XE2 Professional
 
#1

auf thread warten

  Alt 18. Mär 2009, 16:09
Hi!
Ich habe folgendes Problem:
Ich habe ein record und ein array of records.
Das record hat 3 Felder:
ein Thread,
ein boolean, der angibt, ob der Thread läuft sowie
ein integer, der sozusagen als Rückgabewert meines Threads verstanden werden kann (ist aber nicht ReturnValue des Threads)
Das array of records geht von 0 bis 15, also max 16 Threads.
Wenn nun 17 Fälle eintreten, die die Erzeugung eines solchen Threads erfordern, muss gewartet werden, bis IRGENDEINER der 16 Threads fertig ist.
Nun habe ich Depp! eine while-Schleife gebaut, die so lange 1 Millisekunde sleept, bis threadcount<16 ist (bzw eine anti-endlosschleifen-bedingung greift, was auch jedesmal passiert ist)
Das bedeutet aber, dass der Mainthread blockiert, was dazu führt, dass die 16 Threads ihr Ergebnis nicht zurückgeben können und somit nicht beendet werden.
Mein nächster Versuch war mit WaitFor, so kann ich aber nur auf einen Thread warten und bekomme eine Exception in dem Moment, wo der Thread, auf den ich warte, beendet ist:
Delphi-Quellcode:
          try
            threadrecfeld[threadid].mythread.WaitFor;
          except
            on e : exception do
              memo1.Lines.Add('wait for: '+e.Message);
          end;
Fehlermeldung ist:
Thread-Fehler: Das Handle ist ungültig (6)

Meine Frage ist nun:
Wie kann ich das, was ich will (auf Beendigung irgendeines Threads warten ohne zu blockieren) realisieren?
Mir fällt als einzige Option ein Semaphore mit 16 "Slots" ein, dann könnt ich waitforsingleobject(SemaphoreHandle, Millisekundenanzahl) machen, aber das möchte ich nicht.
Ich habe in der Hilfe gelesen, dass waitformultipleobjects auch auf Threads anwendbar ist, evtl wartet das ja bis einer der 16 Threads durch ist, aber ich habe nirgends gefunden, wie ich es mit Threads benutze. Ich bräuchte ja mindestens die Handles der Threads, ich habe aber z.z. nur eine threadid, was ein integer ist, den ich selbst vergebe.

Bitte helft mir!
Vielen Dank!
mfg
hyype
  Mit Zitat antworten Zitat