Autor Beitrag
colaka
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 200
Erhaltene Danke: 4

Win XP, W7
Delphi 2005 Prof.
BeitragVerfasst: Sa 21.05.11 20:30 
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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 595
Erhaltene Danke: 4

Windows 8.1, Linux Debian 8, Android Lollipop
Delphi, PHP, Java (Android)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8553
Erhaltene Danke: 479

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: 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.

_________________
We are, we were and will not be.
colaka Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 200
Erhaltene Danke: 4

Win XP, W7
Delphi 2005 Prof.
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19338
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 22.05.11 10:12 
user profile iconcolaka hat folgendes geschrieben Zum zitierten Posting springen:
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:
www.delphipraxis.net...-im-hintergrund.html
www.delphipraxis.net...-delphi-2010-xe.html
Delphi-Laie
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1600
Erhaltene Danke: 232


Delphi 2 - RAD-Studio 10.1 Berlin
BeitragVerfasst: So 22.05.11 10:13 
user profile iconcolaka hat folgendes geschrieben Zum zitierten Posting springen:
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.

user profile iconcolaka hat folgendes geschrieben Zum zitierten Posting springen:
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.


Zuletzt bearbeitet von Delphi-Laie am So 22.05.11 10:26, insgesamt 1-mal bearbeitet
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19338
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 22.05.11 10:20 
user profile iconDelphi-Laie hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 200
Erhaltene Danke: 4

Win XP, W7
Delphi 2005 Prof.
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19338
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 2157
Erhaltene Danke: 72


Java (Eclipse), Python (Sublimetext 3)
BeitragVerfasst: So 22.05.11 11:06 
Doch, wir haben dich schon verstanden. Allerdings ist das, was du machen möchtest, nicht gerade sehr performant:
deinvorschlag
Viel besser ist Gausis Vorschlag:
gausi2
Dazu musst du wie user profile iconjaenicke 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.
Einloggen, um Attachments anzusehen!