![]() |
URLDownloadToFile in Threads?
Hi,
Tolle Sache, diese Code-Library :wink: ![]() 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 |
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.
|
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; |
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:
Und dann im OnProgress Ereignis:
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;
Delphi-Quellcode:
Bisher kam noch kein Ausnahmefehler, daher glaube ich einfach mal, dass es funktioniert^...
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; |
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