Form aktualisieren aus einem Thread in einer anderen Klasse

11/10/2007 - 14:45 von Jens Bottenschein | Report spam
Hallo NG,

ich bastele gerade einen Download-Manager, der mehrere Dateien verarbeitet -
das löse ich über Threads. Und zwar wird für jeden Download eine Klasse
"DownloadFile" erstellt, in der ein eigener Thread gestartet wird.
Funktioniert auch soweit ganz gut, d.h. die Dateien werden im Hintergrund
"gedownloadet".

Nun möchte ich aber den Fortschritt des/der Downloads (geladene Bytes) in
meinem Formular anzeigen. Dazu rufe ich aus der Routine der Klasse
"DownloadFile", die den Download verarbeitet, die Routine "UpdateProgress"
in der Klasse Form1 auf:

Form1.UpdateProgress(BytesRead)

Laut Debugger wird das Steuerelement (Label) auch mit dem entsprechenden
Wert befüllt, nur wird das Label im Formular nicht aktualisiert. Habe es
schon mit Me.Refresh() und Me.Update() versucht. Der angezeigte Inhalt des
Labels àndert sich aber nicht. Wie bringe ich das Formular sich neu
aufzubauen und mir den Wert auch wirklich anzuzeigen?

Dann habe ich dem Formular noch ein NotifyIcon hinzugefügt, da ich die
Anwendung beim Minimieren aus der Taskleiste verbannen will. Nun wird für
jeden Download-Thread, der in den einzelnen Instanzen der Klasse
"DownloadFile" erzeugt wird, ein eigenes Tray-Icon angezeigt. Mir scheint,
als wenn für jeden Thread eine komplett neue Instanz der Anwendung erzeugt
wird. Kann das sein? Wenn ja, wie könnte man ein solches "Multi-Threading"
sonst umsetzen?

Gruß
Jens
 

Lesen sie die antworten

#1 Peter Bucher [MVP]
11/10/2007 - 16:34 | Warnen spam
Hoi Jens

ich bastele gerade einen Download-Manager, der mehrere Dateien
verarbeitet - das löse ich über Threads. Und zwar wird für jeden Download
eine Klasse "DownloadFile" erstellt, in der ein eigener Thread gestartet
wird. Funktioniert auch soweit ganz gut, d.h. die Dateien werden im
Hintergrund "gedownloadet".


Von welchem Typ erbt deine Klasse "DownloadFile"?

Nun möchte ich aber den Fortschritt des/der Downloads (geladene Bytes) in
meinem Formular anzeigen. Dazu rufe ich aus der Routine der Klasse
"DownloadFile", die den Download verarbeitet, die Routine "UpdateProgress"
in der Klasse Form1 auf:

Form1.UpdateProgress(BytesRead)


Das versteh ich jetzt nicht ganz.
Du schreibst hier, das du eine Methode deines "DownloadFile" Objektes
aufrufst, greifst hier im Code
aber auf die Form1.XXX zu, wieso das?

Am besten gibst du uns noch mehr Details und ein wenig relevanten Code dazu.
Den Status von einem Prozess, der in einem eigenen Thread làuft, kann
elegant mithilfe von Events
rübergereicht werden.
Ein Beispiel für eine solche Implementierung wàre die "BackGroundWorker"
Klasse.
Einfach mal mit dem Reflector (bald gibts ja den Sourcecode :-), anschauen.

Gruss, Peter Bucher
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community
http://www.aspnetzone.de/blogs/peterbucher/ - Auf den Spuren von .NET

Ähnliche fragen