Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi URLDownloadToFile in Threads? (https://www.delphipraxis.net/19844-urldownloadtofile-threads.html)

Dani 10. Apr 2004 00:50


URLDownloadToFile in Threads?
 
Hi,

Tolle Sache, diese Code-Library :wink:
http://www.delphipraxis.net/internal...downloadtofile

Aber: was mache ich, wenn ich das IBindStatusCallback in einem Thread verwenden will? Wie soll ich im OnProgress Event reagieren, wenn ich gar nicht weiß, zu welchem Thread (es laufen mehrere) das Ereignis gehört?

Gruß,
Dani

himitsu 10. Apr 2004 06:06

Re: URLDownloadToFile in Threads?
 
Du kannst z.B. der Create-Prozedur des Thread's die Label und weitere Objekte übergeben, worin sich der Thread verewigen sollen.

SirThornberry 10. Apr 2004 09:14

Re: URLDownloadToFile in Threads?
 
oder du könntest den Thread "Suspended" starten dann die Labels etc. zuweisen und fortfahren..
Also ungefähr so
Delphi-Quellcode:
TMyThread = class(TThread)
public
  MyLabel1: TLabel;
  MyThreadkennung: String;
  [...];
end;
[...]
var LThread: TMyThread;
begin
  LThread := TMyThread.Create(True);
  LThread.MyLabel1 := Labelxy;
  LThread.MyThreadkennung := 'haupt downloadthread';
  LThread.Resume;
end;

Dani 10. Apr 2004 11:56

Re: URLDownloadToFile in Threads?
 
Hmm ich habe mich wieder unverständlich ausgedrückt, bitte verzeiht :|

Was ich eigentlich meinte ist: Ich muss in der OnProgress Methode auf Eigenschaften des Caller-Threads zugreifen. Habe es vorläufig mal dadurch gelöst, dass ich eine "Owner: TObject" Variable zum Public-Feld des cDownloadStatusCallback hizufügte:

Delphi-Quellcode:
type
  cDownloadStatusCallback = class(TObject,IUnknown,IBindStatusCallback)
  private
    function QueryInterface(const IID: TGUID; out Obj): HResult; stdcall;
    function _AddRef: Integer; stdcall;
    function _Release: Integer; stdcall;
    function OnStartBinding(dwReserved: DWORD; pib: IBinding): HResult; stdcall;
    function GetPriority(out nPriority): HResult; stdcall;
    function OnLowResource(reserved: DWORD): HResult; stdcall;
    function OnProgress(ulProgress, ulProgressMax, ulStatusCode: ULONG; szStatusText: LPCWSTR): HResult; stdcall;
    function OnStopBinding(hresult: HResult; szError: LPCWSTR): HResult; stdcall;
    function GetBindInfo(out grfBINDF: DWORD; var bindinfo: TBindInfo): HResult; stdcall;
    function OnDataAvailable(grfBSCF: DWORD; dwSize: DWORD; formatetc: PFormatEtc; stgmed: PStgMedium): HResult; stdcall;
    function OnObjectAvailable(const iid: TGUID; punk: IUnknown): HResult; stdcall;
  public
    Owner : TObject;
  end;
Und dann im OnProgress Ereignis:

Delphi-Quellcode:
function cDownloadStatusCallback.OnProgress(ulProgress, ulProgressMax, ulStatusCode: ULONG; szStatusText: LPCWSTR): HResult;
var OwnerThread: TDownloadThread;
begin
 OwnerThread := Owner as TDownloadThread;
  case ulStatusCode of
    BINDSTATUS_FINDINGRESOURCE:
    begin
     OwnerThread.StatusString := 'File found...';
    end;

///.....usw.
end;
Bisher kam noch kein Ausnahmefehler, daher glaube ich einfach mal, dass es funktioniert^...

himitsu 10. Apr 2004 16:43

Re: URLDownloadToFile in Threads?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Das ist mal ein Auszug aus 'ner kleinen Unit, die ich mir mal vor 'ner Weile erstellt hab'.
Das Teil ist zwar noch nicht das Beste, aber es läuft.

Da wird dir ja nur als Beispiel dienen können, da ich es speziell für mich ausgelegt hab. Wie du zum Beispiel sehn wirst, weiß ich schon vor dem Download, wie groß eie Datei ist, die geladen wird. Aussrdem geb ich den Dateinamen für den Download nicht direkt an - der wird dort drin erst noch zusammengesetzt...

Aufrufen kann man es z.B. so
Delphi-Quellcode:
DownloadThread_1, DownloadThread_2, DownloadThread_3: TDownloadThread;

DownloadThread_1 := TDownloadThread.Create(Label1, Label2, Label5, Label3, ProgressBar1, 'http://www.fnse.de/', 'Smilies_Update.Hash', 57);
DownloadThread_2 := TDownloadThread.Create(Label7, Label8, Label9, Label10, ProgressBar3, 'http://www.fnse.de/', 'Smilies_Update.Daten', 150000);
Repeat Application.ProcessMessages; Until DownloadThread_1.fertig and DownloadThread_2.fertig;
Sleep(50);
DownloadThread_1.Free;
DownloadThread_2.Free;
Delphi-Quellcode:
// z.B.:
// URL = 'http://www.fnse.de/'
// Dateiliste[0].Datei = '..\Smilies_L01\002.gif'
...
DownloadThread_1 := TDownloadThread.Create(Label1, Label2, Label5, Label3, ProgressBar1, URL, Dateiliste[I_1].Datei, Dateiliste[I_1].Groese);
...


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:44 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-2025 by Thomas Breitkreuz