AGB  ·  Datenschutz  ·  Impressum  







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

auf thread warten

Ein Thema von hyype · begonnen am 18. Mär 2009 · letzter Beitrag vom 19. Mär 2009
Antwort Antwort
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
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: auf thread warten

  Alt 18. Mär 2009, 16:43
Hier musst du ein Ereignis auslösen.

Benutzt du TThread? Dan gehe über onterminate.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
hyype

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

Re: auf thread warten

  Alt 18. Mär 2009, 17:02
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??
  Mit Zitat antworten Zitat
hyype

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

Re: auf thread warten

  Alt 19. Mär 2009, 10:11
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!
  Mit Zitat antworten Zitat
TheReaper

Registriert seit: 27. Feb 2003
Ort: chemnitz
90 Beiträge
 
Delphi 2005 Personal
 
#5

Re: auf thread warten

  Alt 19. Mär 2009, 10:44
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.
  Mit Zitat antworten Zitat
Antwort Antwort


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 05:09 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