Autor Beitrag
the-chosen1
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16



BeitragVerfasst: Do 25.02.10 19:32 
Hey Leute ;)

Hab folgendes Problem... Ich will über DownloadURL (über TActionList) verschiedene Dateien rundter laden. Da diese Aber bis zu 5Mb groß sind, friert das Programm für eine beträchtliche Zeit ein :(
Wie kann ich denn das programm so schreiben, das Ich das programm weiter verwenden kann, während er im Hintergrund die Datei herunter läd?


PS: Ich bin mitlerweile wieder ziemlich aus der Übung hab seit über 2 Jahren nicht mehr mit Delphi gearbeitet :?


Moderiert von user profile iconNarses: Topic aus Dateizugriff verschoben am Do 25.02.2010 um 21:19
Boldar
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1555
Erhaltene Danke: 70

Win7 Enterprise 64bit, Win XP SP2
Turbo Delphi
BeitragVerfasst: Do 25.02.10 19:34 
Threads verwenden. Da solltest du hier im Forum einiges finden. Beim DelphiTreff gibt es glaube ich auch ein Tut, und hier vermutlich auch.
elundril
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3747
Erhaltene Danke: 123

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: Do 25.02.10 19:35 
Hallo und :welcome: im DF,

die Lösung die du suchst wäre ein Thread.

lg elundril

//edit: zu langsam :(

_________________
This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
the-chosen1 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16



BeitragVerfasst: Do 25.02.10 21:21 
mmhm werd ich machen

---Moderiert von user profile iconNarses: Beiträge zusammengefasst---

Naja zu früh gefreut :(
Ich bekomm es zwar hin mehrere downloads gleichzeitig zu starten, das programm friert aber dennoch ein :(

Vieleicht hat jemand ein Tip für micht? Bzw. Einen Link, zu einem Forumsbeitrag, der mir weiter helfen könnte :)

Mein Problem jedenfall: Ein thread ist ja kein eigenständiges programm... Folglich ist der thread auch nicht in der Lage, die Datei herunter zu laden :(
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 25.02.10 21:48 
Ohne Code und ohne zu sehen, was du machst, wird man dir schlecht helfen können.
Xentar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: Do 25.02.10 23:01 
user profile iconthe-chosen1 hat folgendes geschrieben Zum zitierten Posting springen:
Mein Problem jedenfall: Ein thread ist ja kein eigenständiges programm... Folglich ist der thread auch nicht in der Lage, die Datei herunter zu laden :(

Ahja.. und der Firefox startet sich selbst mehrmals, wenn ich 3 Dateien gleichzeitig downloade? Na, auf die Erklärung bin ich gespannt..

_________________
PROGRAMMER: A device for converting coffee into software.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 25.02.10 23:09 
user profile iconthe-chosen1 hat folgendes geschrieben Zum zitierten Posting springen:
Mein Problem jedenfall: Ein thread ist ja kein eigenständiges programm... Folglich ist der thread auch nicht in der Lage, die Datei herunter zu laden :(

Hä? Was willst du uns damit sagen? Warum sollte ein Thread keinen Download durchführen können?
the-chosen1 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16



BeitragVerfasst: Do 25.02.10 23:10 
user profile iconXentar hat folgendes geschrieben Zum zitierten Posting springen:
Ahja.. und der Firefox startet sich selbst mehrmals, wenn ich 3 Dateien gleichzeitig downloade? Na, auf die Erklärung bin ich gespannt..

Nee... Vieleicht bin ich einfach zu blöd... Jedenfalls hab ich nach einigen Tutorials versucht ein Thread zu erstellen -> Jedenfalls ist es mir nie gelungen "DownloadURL" zu verwenden...

Womöglich ist es auch unnötig... Falls jemand ein emöglichkeit hat -> Ich möchte im prinzim nur eine Datei im hintergrund runterladen, am besten noch mit fortschrittsanzeige... Jedenfalls dachte ich, das würde über DownloadURL funktionieren :D

---Moderiert von user profile iconNarses: Beiträge zusammengefasst---

user profile iconLuckie hat folgendes geschrieben Zum zitierten Posting springen:
Hä? Was willst du uns damit sagen? Warum sollte ein Thread keinen Download durchführen können?

Sagen wir es anderst... Ich bekomm es ihrgendwie nicht hin :D
Boldar
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1555
Erhaltene Danke: 70

Win7 Enterprise 64bit, Win XP SP2
Turbo Delphi
BeitragVerfasst: Do 25.02.10 23:17 
user profile iconLuckie hat folgendes geschrieben Zum zitierten Posting springen:
Ohne Code und ohne zu sehen, was du machst, wird man dir schlecht helfen können.
Astat
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 75
Erhaltene Danke: 1

Windows 2000
D6, D7, D2007, Lazarus
BeitragVerfasst: Do 25.02.10 23:50 
Hallo the-chosen1....

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
uses
  windows;

function URLDownloadToFile(Caller: IUnknown; URL: PChar; FileName: PChar;
  Reserved: DWORD; StatusCB: IUnknown): HResult; stdcall;
  external  'URLMON.DLL' name 'URLDownloadToFileA';

function lpThreadFunc(ptrData: Pointer): Integer;
begin
  result := URLDownloadToFIle(nil, PChar(ParamStr(1)),
    PChar(ParamStr(2)), 0nil);
end;

var
  dwThreadID: LongWord;
  hThread: LongWord;
begin
  hThread := BeginThread(nil0, lpThreadFunc, nil0 , dwThreadID);
  WaitForSingleObject(hThread, INFINITE);
  CloseHandle(hThread);
end.


lg. Astat
Xentar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: Fr 26.02.10 00:03 
Ist ja schön.. du startest nen Thread, nur um eine Zeile sptäer zu warten, bis er fertig ist.

_________________
PROGRAMMER: A device for converting coffee into software.
Astat
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 75
Erhaltene Danke: 1

Windows 2000
D6, D7, D2007, Lazarus
BeitragVerfasst: Fr 26.02.10 00:14 
Hallo Xentar, hast recht, mein Fehler, anbei der Rest.

ausblenden Delphi-Quelltext
1:
2:
3:
program Project1;

{$APPTYPE CONSOLE}


lg. Astat
Xentar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: Fr 26.02.10 00:27 
Ändert nichts an der Tatsache, dass du wartest, bis der thread fertig ist.

_________________
PROGRAMMER: A device for converting coffee into software.
Astat
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 75
Erhaltene Danke: 1

Windows 2000
D6, D7, D2007, Lazarus
BeitragVerfasst: Fr 26.02.10 00:52 
user profile iconXentar hat folgendes geschrieben Zum zitierten Posting springen:
Ändert nichts an der Tatsache, dass du wartest, bis der thread fertig ist.


Jupp, richtig! aber! :mahn:

Ein Thread ist immer einem bestimmten Prozess zugeordnet und existiert nur innerhalb dieses Prozesses.
Prozess Weg = Thread weg = nix Downlod from URL!!

lg. Astat
elundril
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3747
Erhaltene Danke: 123

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: Fr 26.02.10 00:56 
aber hast du dann nicht das gleiche problem wie ohne thread? du startest deinen thread und sagst deinem hauptthread in dem auch die VCL ist das er auf den 2. Thread warten soll. Demnach ist der VCL-Thread wieder blockiert, was du ja eigentlich vermeiden wolltest weil du ja auf parallelität abzielst.

lg elundril

_________________
This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
Xentar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: Fr 26.02.10 01:05 
user profile iconAstat hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconXentar hat folgendes geschrieben Zum zitierten Posting springen:
Ändert nichts an der Tatsache, dass du wartest, bis der thread fertig ist.

Ein Thread ist immer einem bestimmten Prozess zugeordnet und existiert nur innerhalb dieses Prozesses.
Prozess Weg = Thread weg = nix Downlod from URL!!

Glaub, ich versteh dein Problem langsam, drück dich doch mal klarer aus ;)

Naja, was soll die Anwendung denn machen, während sie wartet? Irgendwas anderes anzeigen?
Oder nichts? Wenn ja, gib ihr halt trotzdem was zu tun.. warte nicht INFINITE, sondern mit ner While Schleife immer ein kleines bisschen, und gib der Anwendung so Zeit, auf Ereignisse zu reagieren (und somit nicht einfriert)

_________________
PROGRAMMER: A device for converting coffee into software.
Astat
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 75
Erhaltene Danke: 1

Windows 2000
D6, D7, D2007, Lazarus
BeitragVerfasst: Fr 26.02.10 01:13 
Hallo, es ging primär darum, wie man URLDownloadToFile in einem Thread aufrufen kann, bzw. wie man
einen Thread dafür verwendet.
Das Codeschnipsel sollte nur dies zeigen, und ist deshalb in einer Consolen Applikation implementiert.

Also, man nehme,

ausblenden Delphi-Quelltext
1:
2:
3:
4:
procedure TForm1.Button1Click(Sender: TObject);
begin
  CloseHandle(BeginThread(nil0, lpThreadFunc, nil0 , dwThreadID));
end;


und schon ist dieses eine Problem beseitigt.

lg. Astat
the-chosen1 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16



BeitragVerfasst: Fr 26.02.10 21:42 
user profile iconAstat hat folgendes geschrieben Zum zitierten Posting springen:
Hallo the-chosen1....

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
uses
  windows;

function URLDownloadToFile(Caller: IUnknown; URL: PChar; FileName: PChar;
  Reserved: DWORD; StatusCB: IUnknown): HResult; stdcall;
  external  'URLMON.DLL' name 'URLDownloadToFileA';

function lpThreadFunc(ptrData: Pointer): Integer;
begin
  result := URLDownloadToFIle(nil, PChar(ParamStr(1)),
    PChar(ParamStr(2)), 0nil);
end;

var
  dwThreadID: LongWord;
  hThread: LongWord;
begin
  hThread := BeginThread(nil0, lpThreadFunc, nil0 , dwThreadID);
  WaitForSingleObject(hThread, INFINITE);
  CloseHandle(hThread);
end.


lg. Astat


Tut mir leid, euch so auf die Nerven zu gehen, aber ihrgendwie hab ich das noch nicht ganz verstanden, ich hab mich hier im Forum schon erkundigt und sehr lange gegoogelt, aber nichts wirkliches gefunden...

Also:
Wenn ich es richtig verstanden habe brauche ich zwei threads: Meinen Hauptthread, den ich brauch, damit mein Programm stabil bleibt, wenn ich eine Operation durchführe. Zudem brauche ich einen Zweiten, der während der Verwendung des Hauptthreads die Datei runterläd. (Hintergrund download)
Also muss ich einen Thread erstellen?
Über File -> New -> Other -> Thread object
(Sry hab nur die englische version)
In den Thread muss jetzt die Operation Reingeschrieben werden?
Allerdings komm ich hier nie Weiter... Ich hab schon versucht in dem Thread ein DownloadURL zu definierten - hab auch schon mit dem INDY HTML tool rumgespielt, komm aber leider nicht weiter :(

Um mit meinem Problem weiter zu gehen... Ich will eine Webseite herunterladen und sie nach bildern Durchsuchen (mit PosEx)... Allerdings ist diese Aktion recht Rechenaufwendig. Da der Download ja keine (kaum) rechenleistung benötigt, könnte ich jetzt doch einfach (theoretisch) einen weiteren Thread bauen, der während die Seite durchsucht wird, beginnt die nächste schon herunter zu laden

:)
Xentar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: Fr 26.02.10 22:01 
Und der Quellcode, mit dem du es probiert hast, lautet wie ... ?

_________________
PROGRAMMER: A device for converting coffee into software.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 26.02.10 22:55 
Ich glaube, wir haben noch nicht genug gebettelt. :?