Laden...

Anzeigen, dass Programm gerade arbeitet

Erstellt von jogisarge vor 13 Jahren Letzter Beitrag vor 13 Jahren 6.394 Views
J
jogisarge Themenstarter:in
154 Beiträge seit 2006
vor 13 Jahren
Anzeigen, dass Programm gerade arbeitet

Hallo zusammen,

mir fällt gerade kein passender Titel ein.
Ich rufe mehrfach einen Webservice auf, der mir ein ERgebis zurückliefert.
d.h.
Ich habe eine Liste mit z.B. 5 Positionen.
Diese werden untereinander angezeigt.
Jetzt rufe ich pro Zeile einen Webservice auf, der mir ein Ergebnis zurückliefert.
(Das kann ja manchmal etwas dauern, bis die Antwort kommt)
Nun möchte ich gerne während dem Abruf anzeigen, welche Position gerade angefragt wird.
Ich dachte da an eine kleine Grafik oder so etwas, die symbolisiert, dass das Programm arbeitet.

Wie kann man so etwas darstellen ?

gruß jogi

2.298 Beiträge seit 2010
vor 13 Jahren

Nutze doch eine Progressbar oder aktualisiere den Text in der Statusbar.

Da du ja anzeigen willst welche Position verarbeitet wird.

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

3.430 Beiträge seit 2007
vor 13 Jahren

Hallo jogisarge,

noch ein kleiner Tipp vorweg.
Beachte dass du den GUI-Thread nicht blockierst und nicht von dem Worker-Thread auf die GUI zugreifst, weil sonst kracht es.

Siehe dazu: [FAQ] Warum blockiert mein GUI? und [FAQ] Controls von Thread aktualisieren lassen (Control.Invoke/Dispatcher.Invoke)

Den Zugriff auf den Webservice musst du unbedingt in einen Thread auslagern, weil sonst blockiert dir dieser den GUI-Thread bis er fertig ist.

Gruss
Michael

J
jogisarge Themenstarter:in
154 Beiträge seit 2006
vor 13 Jahren

Vielen Dank für eure Tipps.
Werd ich heut abend mal ausprobieren !

699 Beiträge seit 2007
vor 13 Jahren

Hallo,

Nun möchte ich gerne während dem Abruf anzeigen, welche Position gerade angefragt wird.
Ich dachte da an eine kleine Grafik oder so etwas, die symbolisiert, dass das Programm arbeitet.

Du könntest die Liste ja in einem DataGridView anzeigen und in der ersten Spalte dann verschiedene Grafiken nutzen. Einen grünen Haken für Aufgaben die erledigt sind etc...

Das wäre mein erster Ansatz.

Gruß Stephan

J
jogisarge Themenstarter:in
154 Beiträge seit 2006
vor 13 Jahren

Hallo nochmal,

ich habe mich durch einige Threading-Artikel gelesen, und stelle mir folgende Vorgehensweise vor:
Durch einen Button "Start" werden die 5 Positionen gelesen und pro Position ein Webservice in einem eigenen Thread aufgerufen.

Wenn der jeweilige Thread fertig ist feuert er ein Ereignis, welches dann die jeweilige Zeile auf dem GUI aktualisiert.

Wäre das ein richtige Vorgehensweise ?

Nun stellt sich mir aber eine Frage.

  1. Was passiert, wenn der Benutzer schon gar nicht mehr auf dem Ursprungsfenster ist ?
    Da ja mein GUI nicht blockiert, könnte der Benutzer schon wo anderst hin navigiert sein.
    Führt das zu Problemen, Da ja der Thread weiterarbeitet und das Ereignis feuert ?

Gruß jogi

3.430 Beiträge seit 2007
vor 13 Jahren

Hallo,

jein, soweit klingt das schon mal besser.
Aber bei den 5 Positionen.... Handelt es sich da um 5 verschiedene Webservices??
Weil sonst wäre es wohl einfacher alle 5 in einem Rutsch (in einem Thread) auszulesen.

Ansonsten ist es so ok. Wenn die Daten vorhanden sind dann wird ein Event geschmissen und die GUI aktualisiert sich dann.

Wenn es dich stört dass der User weiternavigieren kann dann musst du ein Wartefenster (oder irgend eine Animation drübergelegt) anzeigen um das zu unterbinden.

Wenn es dich nicht stört dann ist das egal. Denn der Webservice schmeisst das Event, aber wenn niemand darauf registriert ist dann passiert halt nix mit den Daten.
Wichtig ist aber dabei noch dass du nicht im Hintergrund X Zombie-Threads laufen hast. Deshalb immer schön brav alles beenden, was nicht gebraucht wird 😃

Gruss
Michael

J
jogisarge Themenstarter:in
154 Beiträge seit 2006
vor 13 Jahren

Hallo nochmal,

mir stellt sich da noch eine Frage:

Wenn ich auf dem GUI 5 Zeilen mit Controls ,die aktualisiert werden sollen, habe - wie erkenne ich die Zeile(Textbox), die gerade aktualisiert werden soll.

Ich hab das jetzt so, dass ich pro WS-Aufruf ein Event werfe, welches dann die Controls auf dem GUI aktualisieren soll.
Gemacht habe ich das wie hier in Eigenen Event definieren / Information zu Events beschrieben.
Wie erkenne ich auf dem GUI welche Zeile gerade dran ist ?

Gruß jogi

3.430 Beiträge seit 2007
vor 13 Jahren

Hallo,

Wie erkenne ich auf dem GUI welche Zeile gerade dran ist ?

Da musst du dir merken welcher Webservice zu welcher Zeile gehört (z.b. in einem Dictionary).
Dann kannst du nachher wieder zurückverfolgen was du aktualisieren musst.

Aber das ist IMHO keine wirklich elegante Lösung.
Kannst du die Daten nicht alle in einem Rutsch laden? Oder sind das verschiedene Webservices?

Gruss
Michael

J
jogisarge Themenstarter:in
154 Beiträge seit 2006
vor 13 Jahren

Hallo michlG

Kannst du die Daten nicht alle in einem Rutsch laden? Oder sind das verschiedene Webservices?

Ne das geht nicht.
Das sind verschiedene Lieferanten und somit verschiedene Webservices.
Aber 5 Zeilen bedeutet nicht 5 verschiedene WS.
Es kann auch sein, dass mehrere Artikel von einem Lieferanten kommen.

J
jogisarge Themenstarter:in
154 Beiträge seit 2006
vor 13 Jahren

Hat jemand von euch einen Tipp für mich, wie ich das Problem

Wie erkenne ich auf dem GUI welche Zeile gerade dran ist ?

lösen kann ?

49.485 Beiträge seit 2005
vor 13 Jahren

Hallo jogisarge,

ist die Frage nicht vielmehr: Wie bringe ich mein Programm dazu, die aktuelle Zeile hervorgehoben anzuzeigen? Wie wäre es, wenn du einfach die Hintergrundfarbe änderst?

herbivore

J
jogisarge Themenstarter:in
154 Beiträge seit 2006
vor 13 Jahren

Hallo herbivore,

ich möchte nochmal kurz mein Anliegen beschreiben:

Mann kann in einer Liste mit X Artikeln suchen.
Der User markiert über Checkboxen 5 Stück und klickt einen Button.

Nun wird ein Fenster mit den 5 Zeilen gezeigt.
Also eine Zeile pro Artikel.
Jede Zeile besteht aus ein paar Labels und ein paar Textboxen.

Zeile 1 und 2 müssen bei Lieferant a angefragt werden.
Zeile 3 bei Lieferant b und Zeile 4+5 bei Lieferant c.

Der User gibt nun die gewünschte Anfragemenge ein und klickt auf einen Button.

Nun werden im Hintergrund nacheinander die einzelnen WS von der BL abgefragt.
Der WS liefert Werte zurück, die dann in die Felder auf dem GUI geschrieben werden sollen.

Mein jetziger Stand war, dass folgender Ablauf ok wäre:
Durch den Klick auf der GUI wird in der BL pro WS ein Tread gestartet, der dann den WS abfrägt.
Wenn der Thread fertig ist, wird ein Event gefeuert und vom GUI registriert.

Nun die Frage:
Wie kann ich auf dem GUI wissen, welche Zeile aktualisiert werden soll(en)

49.485 Beiträge seit 2005
vor 13 Jahren

Hallo jogisarge,

das GUI weiß doch im EventHandler aufgrund des senders, wer den Event gefeuert hat und kann anhand dessen die Zuordnung zur richtigen Zeile vornehmen.

herbivore

J
jogisarge Themenstarter:in
154 Beiträge seit 2006
vor 13 Jahren

Hallo nochmal,

das GUI weiß doch im EventHandler aufgrund des senders, wer den Event gefeuert hat und kann anhand dessen die Zuordnung zur richtigen Zeile vornehmen.

sorry herbivore, aber das kapier ich nicht 🤔

in der BL werden alle zu verarbeitenden Zeilen nacheinander abgearbeitet.
Für jede Zeile wird ein eigener Thread gestartet, welcher dann am Ende ein Event feuert.

wie kann ich jetzt in der GUI erkennen, zu welchen Textboxen der Thread gehört ?
Ich müsste dann pro Zeile, also pro Event-Aufruf zwei Textboxen aktualisieren.

Gruß jogi

3.430 Beiträge seit 2007
vor 13 Jahren

Hallo jogisarge,

wie kann ich jetzt in der GUI erkennen, zu welchen Textboxen der Thread gehört ?

Wie herbivore schon gesagt hat kannst du das herausfinden indem du den sender verwendest.
D.h. der Thread gibt zurück zu welcher Textbox er gehört.
Natürlich sollte das getrennt sein (der Thread kennt die TextBox nicht) dann musst du dir halt sonst irgendwie in der GUI die Zugehörigkeit merken.
z.B. über ein Dictionary

Gruß
Michael

J
jogisarge Themenstarter:in
154 Beiträge seit 2006
vor 13 Jahren

Hallo MichlG,

Wie herbivore schon gesagt hat kannst du das herausfinden indem du den sender verwendest.
D.h. der Thread gibt zurück zu welcher Textbox er gehört.

Gelesen habe ich das schon, was herbivore geschrieben hat, aber mir ist nicht klar, wie ich das über den sender übertrage ??

Gruß jogi

3.430 Beiträge seit 2007
vor 13 Jahren

Hallo,

guck mal auf den Link: [FAQ] Eigenen Event definieren / Information zu Events
Wenn du das Event auslöst dann kannst du den Sender mitgeben (meistens this).
Und genau dieses object sender, kriegst du dann auch in der GUI raus, wenn du das Event abfängst.
Du kannst aber auch in das EventArgs zusätzlich Daten packen, falls das nötig ist.

Gruß
Michael

49.485 Beiträge seit 2005
vor 13 Jahren

Hallo jogisarge,

grundsätzlich muss das GUI ja selbst wissen, was es wo darstellt. Es kann also nur darum gehen, dass das GUI am Ende der Verarbeitung immer noch weiß, was da gerade verarbeitet wurde. Und das kannst du über z.B. über den sender herausfinden. Das GUI hat den Thread ja gestartet, also sollte es auch wissen, welcher Thread welche Daten verarbeitet.

Wenn dir das zu abstrakt oder zu sehr um die Ecke ist, kannst du ja in den (eigenen) EventArgs beliebige (weitere) Informationen übergeben, die die Zuordnung ermöglichen.

Jetzt klarer? Wenn nein, schreibt bitte nicht nur "verstehe ich nicht", sondern schreib genau, was dir unklar ist.

herbivore

J
jogisarge Themenstarter:in
154 Beiträge seit 2006
vor 13 Jahren

JA, jetzt ist es klar.
Vielen Dank !!!!!!