Laden...

Progressbar aktualisiert sich nicht

Erstellt von smilingbandit vor 16 Jahren Letzter Beitrag vor 16 Jahren 5.211 Views
S
smilingbandit Themenstarter:in
151 Beiträge seit 2007
vor 16 Jahren
Progressbar aktualisiert sich nicht

Hallo zusammen,

Ich wollte für eine meiner Schleifen eine ProgressBar erstellen (bei Programmstart).

Da natürlich das Hauptform der Anwendung noch nicht existiert, hab ich einfach ein neues entworfen und eine Progressbar reingebaut. Da ich nicht schon wieder über Eventhandler arbeiten wollte, hab ichs einfach auf public gesetzt (ich weiss, ist nicht ganz sauber, aber in dem Fall hoffentlich nicht gravierend).

Bevor die Schleife läuft wird das kleine Form angezeigt, Titeltext und Maximum für die Progressbar gesetzt.

Meine Schleife führt Performstep() durch, aber wenn die Schleife dann läuft passiert mir dem Balken gar nichts. Muss ichs doch über Eventhandler machen, oder liegts an was anderem?

S
8.746 Beiträge seit 2005
vor 16 Jahren
2.223 Beiträge seit 2005
vor 16 Jahren

Hallo smilingbandit,

zu diesem Problem empfehle ich
[FAQ] Warum blockiert mein GUI?

und möglicherweise
[FAQ] Controls von Thread aktualisieren lassen (Control.Invoke)

mfg

S
smilingbandit Themenstarter:in
151 Beiträge seit 2007
vor 16 Jahren

Naja, die neue Form wird ja aus dem eigentlichen GUI Thread erzeugt, es wird nur noch nicht dargestellt. Oder wolltest du mich auf die Events hinweisen und dass ichs doch damit lösen muss?

2.223 Beiträge seit 2005
vor 16 Jahren

du solltest Dir die einzelnen FAQ beiträge schon richtig durchlesen

explarisch eine Problembeschreibung:

Zitat:
Wenn ich eine Windows-Forms-Anwendung laufen lasse und aus irgendwelchen Gründen in eine andere Anwendung wechsle, bekomme ich keine aktuelle Darstellung mehr.

Die Anwendung läuft und macht ihren Job (432 Dateien bearbeiten), aber ich bekomme keine Info wie weit die Anwendung ist - die Progressbar bewegt sich nicht, selbst wenn ich nicht auf eine andere Anwendung umgeschaltet habe.

Das GUI ist blockiert, das Fenster lässt sich auch nicht bedienen, also nicht verschieben, nicht maximieren oder minimieren. Beim Versuch das Fenster zu schließen kommt ein Dialog "Das Programm reagiert nicht" mit der Möglichkeit das Programm "Sofort beenden" zu können.

Diese Effekte treten immer dann auf, wenn langlaufende Aktionen (Aktionen, die länger als 1/10s laufen oder laufen können) im GUI-Thread ausgeführt werden.

Die Lösung

Diese langlaufenden Aktionen, die länger als 1/10s brauchen, müssen in einen extra (Arbeits-)Thread ausgelagert werden. Dazu kann man einen extra Thread starten, auf den ThreadPool zurückgreifen oder einen BackgroundWorker verwenden.

mfg

S
smilingbandit Themenstarter:in
151 Beiträge seit 2007
vor 16 Jahren

ah Entschuldigung, ist mir grade beim Rauchen auch wie Schuppen von den Augen gefallen 🙂

Dann wirds schwierig mit nachträglich implementieren glaub ich..Danke jedenfalls!

S
8.746 Beiträge seit 2005
vor 16 Jahren

Als Quick-Hack kannst du natürlich ein Application.DoEvents() in die Schleife basteln. Damit das aber nicht zu unschönen Effekten führt, sollte das Fenster modal und (zumindest für die Dauer der Aktion) nicht schliessbar sein.

Gibt aber keinen Grund, das nicht mit dem BackgroundWorker zu erledigen.

S
smilingbandit Themenstarter:in
151 Beiträge seit 2007
vor 16 Jahren

Naja...Zeitdruck 😉 Da müsste ich schon das neue Form vom BackgroundWorker bearbeiten lassen, sonst muss ich ziemlich viel umbauen (und mich vor allem tiefer ins Threading einarbeiten). Ist das überhaupt sinnvoll?

49.485 Beiträge seit 2005
vor 16 Jahren

Hallo smilingbandit,

(und mich vor allem tiefer ins Threading einarbeiten). Ist das überhaupt sinnvoll?

ja, auf jeden Fall!

herbivore