Announcement

Collapse
No announcement yet.

Beendeter Thread erneut aufrufen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Beendeter Thread erneut aufrufen

    Hallo, <br>
    wie kann ich einen von TThread abgeleiteten Thread nochmal aufrufen??.<br><br>
    In meiner Anwendung soll ein Pool von Threads angelegt werden. Die Zeiger auf die Threadinstanzen halte ich in einer TList. Ist ein Thread frei wird ein Semaphore-Object zurückgegeben. Anschliessend wird aus der TList der freie Thread gesucht. Dieser soll dann mit neuen Parametern wieder gestartet werden. <br>
    Helmut

  • #2
    Hi

    Ähm, das geht nicht, es sei denn der Thread wirde nicht beendet sondern mit Suspend gestoppt. Mit Resume läuft er dann weiter. Es gäbe nun die Möglichkeit das der Thread nach Erledigung seiner Aufgabe auf die nächste Aufgabe wartet. Z.b.

    <pre>

    procedure TMyThread.Execute;
    begin
    while not Terminated do
    begin
    DoSomeThing;
    SetEvent(EventFinish);
    WaitForSingleObject(.., EventNewJob);
    end;
    end;

    <pre>

    Ich weiß nicht fürwas Du einen Thread-pool benötigst, in den meisten Fällen ist ein solcher aber Schwachsinnig. Besonders wenn die APP auf Single-Pozessoren Rechnern läuft. Das Gesammt-Laufzeitverhalten mit vielen Threads wird drastisch reduziert. Werden z.B. 10 Thread's angelegt um 10 dateien zu kopieren, dann dauert das extrem länger als im mainthread nacheinander die 10 dateien zu kopieren. Ist auch logisch da durch die Thread das Dateihandling mehr geblockt werden muss und im Prozessor cache/speicher jedesmal beim Threadwechsel die daten verloren gehen.

    Gruß hage

    Comment


    • #3
      Zunächst mal, deine Ide ist gut und habe ich bereits umgesetzt.
      Die APP wird auf einer Mehrprocessormaschine laufen. Weiterhin werden die Daten in unregelmässigen Abständen auf den eigenen FTP-Server gesendet, dadurch gibt es lange Leerlaufzeiten, in diesen Zeiten haben die Threads viel Rechenleistung zur Aufarbeitung der gesendeten Daten. <br>
      Dies nur zum Hintergrund. Vielen Dank auch.<br>
      Helmu

      Comment


      • #4
        Es gäbe noch die Möglichkeit über Pipes zu arbeiten. Jeder einzelne Pipe kann verschiedene Aufgaben erledigen, dessen Ausführung unterliegt aber dem jeweilige Thread. D.h. ein großer Pool von Pipes= Job's wird angelegt, dann die entsprechende Anzahl von Threads, sobald ein Thread fertig ist holt er sich den nächsten Pipe aus dem Pool und springt diesen einfach an. Die Anwendung startet nur noch die Threads, und erzeugt die einzelnen Pipes jenachdem wie sie kommen und legt sie im Pool ab. Ein Pipe ist eine Funktion.

        Gruß Hagen

        PS: mehr weiß ich aber auch nicht über Pipes, ist schwer was zu finden

        Comment

        Working...
        X