Laden...

Anzeige ProgressBar

Erstellt von BerndFfm vor 18 Jahren Letzter Beitrag vor 18 Jahren 4.434 Views
BerndFfm Themenstarter:in
3.825 Beiträge seit 2006
vor 18 Jahren
Anzeige ProgressBar

Ich starte einen Datenimport durch Klick auf einen Button. Den Fortschritt zeige ich mit einer ProgressBar an.
Beim Import wird die ProgressBar durch den Befehl ProgressBar1.Refresh(); aktualisiert.

Wenn ich nun auf das Fenster klicke oder es mal im Hintergrund war wird es nicht mehr aktualisiert und das Fenster bekommt den Zusatz "(Keine Rückmeldung)".

Wie kann ich bewirken, dass die ProgressBar auch nach Mausklicks aktualisiert wird ?

Wie kann ich bewirken dass ich den Vorgang durch Klick auf einen Button abbrechen kann ?

Wenn ich vor dem Import die Dateien leere mit einem SQL-Befehl dann dauert dass eine Weile. Kann ich in dieser Zeit auch was anzeigen bzw. Abbrechen ermöglichen ?

Fragen über Fragen 😉

Grüße Bernd

Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3

4.221 Beiträge seit 2005
vor 18 Jahren

Last in einen Thread auslagern....

Vorsicht Zugriffe auf das UI dann marshallen

Boardsuche: Thread / Invoke / InvokeRequired

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

BerndFfm Themenstarter:in
3.825 Beiträge seit 2006
vor 18 Jahren

Das hab ich befürchtet, das man da was mit Threads machen muss.

😉

Dann werde ich mich mal damit beschäftigen.

Danke für die Infos und einen schönen Tag noch,

Bernd

Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3

BerndFfm Themenstarter:in
3.825 Beiträge seit 2006
vor 18 Jahren

Bei der Suche nach den genannten Suchworten hab ich festgestellt dass wohl jeder mal dieses Problem hat 😉

Ich habe 3 Beispiele zu BackgroundWorker gefunden, die werde ich mir mal anschauen und dann probieren ob ich das damit hinkriege :

http://www.stim.de/index.php?id=185

http://msdn2.microsoft.com/de-de/waw3xexc.aspx

http://msdn2.microsoft.com/de-de/ms229675(de-de,VS.80).aspx

Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3

BerndFfm Themenstarter:in
3.825 Beiträge seit 2006
vor 18 Jahren

Für meine Anforderung habe ich eine einfache Lösung gefunden :

Application.DoEvents();

in der Hauptschleife genügt, da ein einzelner Import recht schnell geht. Es können nur einige Tausend bis Millionen Datensätze sein.
ProgressBar und Abbruch-Button funktionieren wunderbar.

Die BackgroundWorker hab ich mit trotzdem angesehen weil ich sie für andere Sachen brauchen werde.

Grüße Bernd

Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3

563 Beiträge seit 2004
vor 18 Jahren

Hallo BerndFfm

Original von BerndFfm
Für meine Anforderung habe ich eine einfache Lösung gefunden :

Application.DoEvents(); Es gibt soviele Threads hier über Invoke/BeginInvoke/InvokeRequired, jedoch wird trotzdem immer wieder DoEvents() verwendet. Sorry, klingt jetzt vieleicht hart, aber das ist eine schlechte Lösung.

in der Hauptschleife genügt, da ein einzelner Import recht schnell geht. Es können nur einige Tausend bis Millionen Datensätze sein. Du widersprichst dich 😉 eine Million halte ich für eine recht grosse Zahl =)

Die BackgroundWorker hab ich mit trotzdem angesehen weil ich sie für andere Sachen brauchen werde. Den Sinn dieser Klasse habe ich noch nicht erkannt. Was diese Klasse kann, kann man ebenso einfach mit Threads lösen und braucht dazu noch weniger Code.

Gruss,
.unreal

BerndFfm Themenstarter:in
3.825 Beiträge seit 2006
vor 18 Jahren

Hi Unreal,

in meinem Fall dauert der Import eines Datensatzes nur einen Bruchteil einer Sekunde, die Applikation kann also schnell genug auf alle Ereignisse reagieren.
Der gesamte Import dauert natürlich länger, das können schon einige Stunden sein.

BackgroundWorker sind wohl einfacher zu implementieren als Threads, obwohl sie ja fast das gleiche tun.

Und man kann sie im Designer aus der Toolbox auf die Applikation ziehen 😉
Das scheint wohl wichtig zu sein.

Es gibt noch genügend Anwendungen wo die Vorgänge länger dauern oder parallel ablaufen sollen und ich mich dann doch mit Threads beschäftigen muss, z.B. Emailversand an 100 Leute gleichzeitig (Newsletter), umfangreiche Datenbankabfragen oder Dateien kopieren.

Grüße Bernd

Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3

L
82 Beiträge seit 2005
vor 18 Jahren

Wenn ich das jetzt richtig gsehen habe ist das für VS05 gibt es da auch was für VS03???

S
84 Beiträge seit 2005
vor 18 Jahren

@.unreal

da ich auch viel mit threads arbeite war ich dem neuen backgroundworker gegenüber auch kritisch. ich hab ihn mir dann mal angesehen und muss sagen das er sehr gut funktioniert! wenn man ihn per drag and drop auf das formular zieht hat man kaum schreib arbeit. nur dowork implementieren und reportprogress aufrufen. die funktion für das progress updaten is threadsicher und es wird kein invoke beöntigt, also ein thread für anfäner! ich finds gut, benutze aber weiterhin herkömmliche threads!

BerndFfm Themenstarter:in
3.825 Beiträge seit 2006
vor 18 Jahren

lowrider : BackgoundWorker gibt es erst in VS 2005.

Threads und Application.DoEvents() gibt es natürlich schon in VS 2003.

Grüße Bernd

Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3

563 Beiträge seit 2004
vor 18 Jahren

wenn man ihn per drag and drop auf das formular zieht hat man kaum schreib arbeit. nur dowork implementieren und reportprogress aufrufen.

Mir gefällt dieses Drag&Drop programmieren einfach nicht 🙂 Einen Thread zu starten sind 2 Zeilen code, geht mindestens so fix 😉. Das ist und bleibt geschmackssache.

Trotzdem wäre Backgroundworker sicher eine viel bessere Lösung als Application.DoEvents().

Gruss,
.unreal