Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - nach Thread-Ende Programm fortsetzen
colaka - Sa 21.05.11 20:30
Titel: nach Thread-Ende Programm fortsetzen
Hallo,
ich habe den Download einer Datei in einen Thread ausgelagert. Anschließend muß die Datei natürlich weiter verarbeitet werden. Doch woher weiß mein Programm, wann der Thread beendet ist? Oder soll ich alle Sekunde prüfen, ob die Datei schon vollständig heruntergeladen ist?
Danke Ebi
MDX - Sa 21.05.11 21:06
Gib doch einfach nach dem Downloadbefehl im Thread den Verweis auf die Funktion/Procedure an, die die Datei weiterverarbeitet?
Gausi - Sa 21.05.11 21:10
Eine Möglichkeit: Schick am Ende des Downloads vom Thread aus eine passende Message an dein Hauptprogramm/-Fenster und reagiere entsprechend darauf.
Oder: mach die Weiterverarbeitung auch in dem Thread.
Oder, wenn du TThread verwendest und in der Weiterverarbeitung Zugriffe auf die VCL nötig sind: Rufe die Weiterverarbeitungsmethode mit Synchronize auf.
colaka - So 22.05.11 06:25
Hallo,
im Hauptprogramm habe ich eine Schleife, die einen Download nach dem anderen aufruft. Die müsste ich anhalten, bis der erste Download abgearbeitet ist. Leider weiß ich nicht, wie ich das machen könnte.
Dazu habe ich noch eine Verständnisfrage:
Würde es zeitlich gesehen eigentlich etwas bringen, wenn ich während der Verarbeitung der ersten heruntergeladenen Datei gleich die nächste Herunterladen würde? Weil das Herunterladen in einem Thread durchgeführt wird, könnte man das ja wahrscheinlich so machen.
Danke Ebi
jaenicke - So 22.05.11 10:12
colaka hat folgendes geschrieben : |
| im Hauptprogramm habe ich eine Schleife, die einen Download nach dem anderen aufruft. Die müsste ich anhalten, bis der erste Download abgearbeitet ist. |
Dann kannst du dir den Thread auch sparen...
Erstens macht es durchaus Sinn eine begrenzte Anzahl Downloads parallel zu machen, insbesondere bei relativ kleinen Dateien, zweitens solltest du bei Verwendung von Threads dein Konzept auch darauf abstimmen.
Entweder du reagierst einfach im Programm auf die Abarbeitung des Threads, eben durch eine der genannten Benachrichtigungen oder du implementierst einen Threadpool. Sowas gibt es aber natürlich auch schon fertig. :mrgreen:
http://www.delphipraxis.net/93835-workerthread-der-diener-im-hintergrund.html
http://www.delphipraxis.net/156768-threadpool-1-0-9-fuer-delphi-2010-xe.html
Delphi-Laie - So 22.05.11 10:13
colaka hat folgendes geschrieben : |
Hallo,
im Hauptprogramm habe ich eine Schleife, die einen Download nach dem anderen aufruft. Die müsste ich anhalten, bis der erste Download abgearbeitet ist. Leider weiß ich nicht, wie ich das machen könnte. |
Das dürfte (n.m.W.) auch unmöglich sein, und falls doch, ist es äußerst unelegant - so, wie das sog. Polling, was ständig abfragt, ob irgendein (neuer) Zustand eingetreten ist.
colaka hat folgendes geschrieben : |
| Würde es zeitlich gesehen eigentlich etwas bringen, wenn ich während der Verarbeitung der ersten heruntergeladenen Datei gleich die nächste Herunterladen würde? Weil das Herunterladen in einem Thread durchgeführt wird, könnte man das ja wahrscheinlich so machen. |
Paralleles Herunterladen bringt nur dann etwas, wenn das Herunterladen der ersten Datei nicht mit vollem Datensatz erfolgt und sich dieser mit mehr als einem Download steigern ließe. Ansonsten ist es Parallelarbeit, die eher bremsend wirkt. Für jeden Download ein eigener Thread wäre naheliegend und ratsam.
jaenicke - So 22.05.11 10:20
Delphi-Laie hat folgendes geschrieben : |
| Das dürfte (n.m.W.) auch unmöglich sein, und falls doch, ist es äußerst unelegant - so, wie das sog. Polling, was ständig abfragt, ob irgendein (neuer) Zustand eingetreten ist. |
Nein, das stimmt nicht. Das geht sogar sehr einfach. Dafür hat ein TThread die Methode WaitFor, die wartet bis er beendet wurde. Für die Abarbeitung nacheinander macht das aber mehr Sinn dem Thread die Liste zu übergeben oder nacheinander die Dateien zu übergeben.
Eine andere Möglichkeit besteht (damit die GUI noch reagiert) mittels CreateEvent ein Ereignis zu erzeugen und dann mittels MsgWaitForMultipleObjects darauf zu warten. Das hat den Vorteil, dass man auch gleichzeitig auf einen Abbruch reagieren kann.
colaka - So 22.05.11 10:33
Hallo,
ich glaube, Ihr habt meine Frage nicht ganz verstanden.
Ich will nicht gleichzeitig 2 Dateien herunterladen, sondern während der Verarbeitung der ersten heruntergeladenen Datei gleich die nächste herunterladen. Insgesamt muß ich 15 Dateien herunterladen, und das Verarbeiten (Aktualisieren der Artikelpreise und -verfügbarkeiten) dauert viel länger als das Herunterladen.
jaenicke - So 22.05.11 10:55
Dann kannst du ja z.B. Events benutzen. Du erzeugst zwei Events, eines als Benachrichtigung für den Thread und eines für die Benachrichtigung des Hauptthreads.
Also so als Gerüst:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23:
| // Hauptthread: EventA := CreateEvent EventB := CreateEvent CancelEvent := CreateEvent Thread erzeugen for i := 0 to ... begin Thread.FileName := ... SetEvent(EventA) if i > 0 then ProcessLastFile; MsgWaitForMultipleObjects(EventB, CancelEvent) ResetEvent(EventB) end;
// Thread: procedure Execute begin WaitForMultipleObjects(EventA, CancelEvent) ResetEvent(EventA) DownloadFile(FFileName) SetEvent(EventB) end; |
Auf diese Weise kannst du mit SetEvent(CancelEvent) das ganze auch abbrechen, falls gewünscht.
Regan - So 22.05.11 11:06
Doch, wir haben dich schon verstanden. Allerdings ist das, was du machen möchtest, nicht gerade sehr performant:
Viel besser ist Gausis Vorschlag:
Dazu musst du wie
jaenicke es schon beschrieben hat, so viele Threads erstellen, wie du Dateien hast. Am Ende musst du aber wieder deinem Hauptprogramm mitteilen, dass du fertig bist (gestrichelte Linie).
*in diesen Sequendiagrammen werden nur zur Veranschaulichung synchrone Nachrichten verwendet.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!