Laden...

Waitbar anzeigen (extra Form), Threading

Erstellt von DevHB vor 13 Jahren Letzter Beitrag vor 13 Jahren 3.189 Views
D
DevHB Themenstarter:in
211 Beiträge seit 2006
vor 13 Jahren
Waitbar anzeigen (extra Form), Threading

Hi,

ich habe mir eine "Waitbar" gebastelt.
Es besteht z.Z. aus einem UserControl, der eigentlichen Laufleiste, und einer Form die angezeigt werden soll.
Das UserCtl hat einen Timer, den ich benötige um einen Laufbalken darzustellen.
Ein Interface bietet mir die Methoden Start und Stop.
Die Form implementiert das Interface auch und reicht die Aktionen an das UserCtl durch.

Im aktuellen Szenario habe ich einen Handler, der mir einen Pool von Aktionen über ein Anwendungsframework ausführt.
Ungefähr so:


foreach (IAction action in this.Actions)
{
   if (this.ComplexActions.ContainsKey(action))
   {
       waitBarControl1.Start();
   }
   
   // eigentliche BusinessAction
   handler.ExecuteAction(action);

   if (waitBarControl1.IsBusy)
   {
        waitBarControl1.Stop();
    }
}

Ich kann identifizieren, dass eine Action kommt, die lange dauert. Dann soll die Waitbar erscheinen.

  1. Versuch war das Start() über nen Thread zu machen, da lief kam aber kein Laufbalken.

  2. Versuch war der Backgroundworker, aber ähnliches Phänomen.

Ich habe mir ein paar Forenposts und Artikel durchgelesen, stehe aber irgendwie auf dem Schlauch, wen oder was ich hier invoken soll/muss.
Alle Versuche schlugen bis jetzt fehl.

Kann jmd Licht in Dunkel bringen?

Vielen Dank.

(Ich befinde mich noch im Framework 2.0.)

Gruß

DevHB

Gelöschter Account
vor 13 Jahren

Guggst du hier

[FAQ] Controls von Thread aktualisieren lassen (Control.Invoke/Dispatcher.Invoke)

waitBarControl1.Start();
soll wohl einen Thread anstossen
wenn ich das richtig verstanden habe

in dem läuft ein timer/schleife/whatever und da machst du das invoke!

D
DevHB Themenstarter:in
211 Beiträge seit 2006
vor 13 Jahren

Hi,

es ist vlt ein wenig verwirrend vom Namen (muss noch geändert werden).
Das Waitbarcontrol besteht aus einer Form.
Durch "Start" wird die Form angezeigt und die Waitbar auf der Form gestartet.

Meine Versuche gingen dahin, dass ich den "WaitbarControl.Start()" Aufruf in der Schleife mit einem Thread oder bgw versucht habe umzusetzen.
(So hatte ich den Link verstanden, die Klasse in der die Schleife durchlaufen wird, wäre ja der Erstellunsthread).
Ich habe dort dann eine Methode gemacht, in der ein Delegate (auf Start()) invoked wird.

Die Waitbar läuft aber nicht und irgendwann laufe ich in Exceptions rein.

Ich muss mich leider auch an die gegebene Schleifenstruktur halten.

Ich möchte im Prinzip bei "Start" das Ding anzeigen, er soll die eigentliche BusinessAction ausführen und danach die Form wieder schließen.

Habe ich event. schon Probleme durch mein Controlaufbau (Form, darauf Control mit Timer)?

Gruß

DevHB

49.485 Beiträge seit 2005
vor 13 Jahren

Hallo DevHB,

wenn du [FAQ] Warum blockiert mein GUI? und [FAQ] Controls von Thread aktualisieren lassen (Control.Invoke) liest, solltest du alles wissen, was du wissen musst. Insbesondere, dass nur die langlaufenden Aktionen in den Thread gehören, alle Forms und Controls (also auch das Wait-Form und der ProgressBar) aber in den GUI-Thread.

herbivore

D
DevHB Themenstarter:in
211 Beiträge seit 2006
vor 13 Jahren

Guten Morgen,

also, ich habe das langwierige Aufgabe mal in einen extra Thread gepackt.
Beim Debuggen hier auf der Arbeit ist mir eben aufgefallen, dass das Konstrukt mit der Waitbar doch ein wenig komplexer ist.

Grund ist, dass ich in der Schleife abhängige Actions habe, d.h. die langwierigen Actions laden Daten aus der Datenbank.
Die nächste Action ist dafür verantwortlich, die UI mit Daten zu versorgen und zusätzliche Berechtigungsstrukturen des aktuellen User auf die UI anzuwenden.

Wenn ich das Laden der Daten jetzt in einen extra Thread packe, dann werden natürlich alle weiteren Actions ausgeführt und gehen auf die Bretter.


foreach (IAction action in this.Actions)
{
   if (this.ComplexActions.ContainsKey(action))
   {
       Thread t = new Thread (new ParameterizedThreadStart(Execute));
       _handler.ExecuteAction(action);
   }
   else
   {
       _handler.ExecuteAction(action);
   }

}

private void Execute(object action)
{
     _handler.ExecuteAction((Action)action);
}

Ich müsste nun anscheinend eine Art Wartemechanismus einbauen, damit die Actions nicht weiter ausgeführt werden oder kann man das anders lösen?

Vielen Dank.

Gruß

DevHB

49.485 Beiträge seit 2005
vor 13 Jahren

Hallo DevHB,

wenn du willst, dass ein Worker-Thread die Aktionen nacheinander abarbeitet, verwende SyncQueue <T> - Eine praktische Job-Queue, denn Warten im GUI-Thread darfst du gerade nicht.

herbivore