Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi auf thread warten (https://www.delphipraxis.net/131083-auf-thread-warten.html)

hyype 18. Mär 2009 15:09


auf thread warten
 
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

sirius 18. Mär 2009 15:43

Re: auf thread warten
 
Hier musst du ein Ereignis auslösen.

Benutzt du TThread? Dan gehe über onterminate.

hyype 18. Mär 2009 16:02

Re: auf thread warten
 
ich benutze eine eigene von tthread abgeleitete klasse
was meinst du mit "über onterminate" gehen?

ich habe eine integer-variable namens threadcount, die kann die werte von 0 bis 16 annehmen
im constructor des threads wird threadcount um 1 erhöht, im destructor um 1 gesenkt.
wenn ich nun einen thread generieren will, threadcount aber bereits 16 ist, muss ich warten, bis threadcount < 16 ist
dieses warten darf aber den mainthread nicht blockieren, wie es sleep tut
bin gerade dabei, mit MsgWaitForMultipleObjects rumzuexperimentieren, weil es eigentlich genau das ist, was ich brauche

ein weiteres problem sehe ich noch, nämlich wenn der thread in der execute methode hängenbleibt und somit nie beendet wird. dann könnte es sein, dass ich irgendwann 16 tote threads habe und dadurch keinen neuen thread generieren kann....

edit:
kann es sein, dass WaitForMultipleObjects (bzw MsgWaitForMultipleObjects, was aber einfach nicht funktionieren will) auch blockieren??

hyype 19. Mär 2009 09:11

Re: auf thread warten
 
Ich habe nun einen weiteren Thread anderer Art erzeugt, der in der execute Methode eine Whileschleife hat, die threadcount prüft und entweder rausgeht oder 100ms sleept. Auf diesen Thread kann ich dann im Hauptthread mit waitfor warten, allerdings muss der Befehl waitfor in einen try except block, da er immer eine exception wirft (meiner recherche nach ein seit d6 bekannter und von borland/codegear/qualitycentral (wie auch immer sie heißen) ignorierter bug...)
Wenn jemandem eine bessere Lösung einfällt, zögere er nicht, sie hier mitzuteilen! ;)

TheReaper 19. Mär 2009 09:44

Re: auf thread warten
 
Wenn ich das richtig verstanden habe, willst du maximal 16 threads erzeugen und wenn mehr kommen, dann sollen die neuen warten. Für sowas gibt es Semaphoren. Beschreibung gibt es hier. :wink:


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:06 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