![]() |
Mehrere Threads nacheinander ausführen
Hallo,
ich steh irgendwie auf'm Schlauch. Habe jetzt den ganzen Tag hier etliche Beiträge bzgl. Threads durchgelesen, konnte mein Problem aber immernoch nicht lösten :( Ich möchte mehrere Threads NACHEINANDER ausführen. D.h. erst wenn der erste Thread fertig ist, soll der 2. Thread ausgeführt werden... usw. Wenn ich mit MeinThread.WaitFor arbeite, klappt das auch, aber während ein Thread ausgeführt wird, ist meine Anwendung eingefroren. Das darf aber nicht sein, da der Thread ständig etwas ins Caption eines Labels schreibt. Wenn ich WaitForSingleObject(MeinThread,IFINITE) nutze, dann wird mein Thread nicht ausgeführt und meine Anwendung hängt bis ins unendliche. Kann mir jmd. kurz den Code dafür geben, damit es klappt? Ich habe einen dynamischen Thread-Array. Über eine for-Schleife führe ich "Resume" für einen Thread nach dem anderen aus. Aber da nicht alle Threads gleichzeitig ausgeführt werden sollen, was ja so passieren würde, soll er erst warten, bis der eine Thread zu ende ist, bevor er mit der for-Schleife weiterfährt und somit dann den nächsten Thread startet. Gruß Sascha |
Re: Mehrere Threads nacheinander ausführen
du kannst dafür das OnTerminate des Thread nutzen bzw. kannst du ja innerhalb des Threads auch selbst ein Event auslösen in dem du dann den nächsten Thread startest.
|
Re: Mehrere Threads nacheinander ausführen
Hi,
SirThornberry hat absolut recht, dann müßtest Du Die eine procedure Schreiben die Du dem OnTerminate des Threads zuweist, dann kannst Du in dieser Procedure den nächsten Thread starten. Was mich allerdings wundert : Du willst mehere Threads verwenden, diese aber nur hintereinander ausführen ? Und das Hauptprogramm wartet solange ? Der Sinn/Vorteil von Threads ist doch, das diese parallel im Hintergrund arbeiten können ! Ich kann ja noch nachvollziehen das Thread 2 erst starten darf, wenn Thread 1 zu Ende ist, weil Thread 2 z.b. Daten von Thread 1 benötigt. Aber warum im Hauptprogramm auf die Threads warten ? So wie Du das bis jetzt beschrieben hast, werden Dir die Threads null Vorteil bringen. Gruß Data |
Re: Mehrere Threads nacheinander ausführen
Hm, dann muss ich einiges umschreiben. Mal gucken ob das klappt. Danke.
Warum ich die nacheinander aufrufen will? Ich habe eine sehr rechenintensive Suche, die ich gerne in einen Thread auslagern möchte, damit die Hauptanwendung noch reagieren kann. Die Threads kann ich nicht gleichzeitig ausführen, weil es dann elendig langsam werden würde, da die Festplatte hier der Flaschenhals ist. Ich kann ja nicht gleichzeitig c:\, d:\ und e:\ nach Dateien suchen. Da wird der Lesekopf ja total verrückt :D EDIT: Hab jetzt einfach die Aufrufe der Threads in einen eigenen Thread gepackt, und schon klappt es, dass die Hauptanwendung weiterhin reagiert :) EDIT2: Das klappt doch nicht. Da führt er immer nur einen Thread aus und die anderen beachtet er gar nicht :( |
Re: Mehrere Threads nacheinander ausführen
Das kann doch einfach nicht angehen :(
Delphi-Quellcode:
Wenn SearchThread eine Länge von 2 hat, d.h. es gibt 2 Threads, dann führt er nur einen richtig aus.
for i := 0 to Length(SearchThread) - 1 do begin
SearchThread[i].Resume; SearchThread[i].WaitFor; SearchThread[i].Free; end; Den ersten führt er aus (rückwärts, d.h. er fängt mit dem letzten an, hat wohl was mit der Compiler-Optimierung zu tun), warte brav bis er zu ende ist und gibt ihn frei. Danach führt er den zweiten aus, aber beendet ihn sofort ohne den Code von Execute auszuführen :( |
Re: Mehrere Threads nacheinander ausführen
Kleiner Denkfehler!
Er führt schon den ersten aus und gibt den dann frei. Danach gibt es aber keinen zweiten mehr in der Liste... Lasse die Schleife einfach mal rückwärts laufen. Gruß Hawkeye |
Re: Mehrere Threads nacheinander ausführen
Danke für den Tipp, aber leider funktionert es auch nicht. Er führt trotzdem nur den 2. Thread aus. Oder bei Dreien nur den dritten.
|
Re: Mehrere Threads nacheinander ausführen
wenn du ein Array von Thread hast dann so:
Delphi-Quellcode:
Ist ungetestet sollte aber die Vorgehensweise verdeutlichen...
//Thread erstellen
for i := 0 to length(ThreadArray) - 1 do begin ThreadArray[i] := TThread.Create(True); ThreadArray[i].OnTerminate := ThreadTerminateProc; end; fCurrThreadIndex := 0; ThreadArray[fCurrThreadIndex].Resume; [...] procedure TForm1.ThreadTerminateProc(Sender: TObject); begin inc(fCurrThreadIndex); if fCurrThreadIndex < Length(ThreadArray) then ThreadArray[fCurrThreadIndex].Resume; end; |
Re: Mehrere Threads nacheinander ausführen
Danke, aber das klappt auch nicht.
Ich geb es auf :( Das kann doch einfach nicht wahr sein, egal was ich mache, er fürt nur einen Thread aus und die anderen beendet er sofort. |
Re: Mehrere Threads nacheinander ausführen
Dann zeig uns mal Deinen aktuellen Source.
Eigentlich hat SirThornberry schon alles richtig erklärt. Gruß Data |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:13 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz