none
Wie programmiert man eine Progressbar ?? RRS feed

  • Frage

  • Hallo Community... 

    Ich habe ein Programm geschrieben, die es unter anderem ermöglicht Datensätze zu suchen.

    Das ganze funktioniert so:
    Ich habe ein Textfeld und gebe dort einen begriff ein. Nun selektiert meine Routine alle Datensätze, die etwas mit diesem Begriff zu tun haben und packt das Ergebnis in einen riesigen Cursor. 

    Nun kann es aber unter Umständen sein, dass ein paar dieser Tabellen eine riesige menge an Datensätzen enthält, was dazu führt das das Erstellen des Cursors etwas Zeit in Anspruch nehmen kann. Da wir ja unseren Standard-User kennen und wissen, dass er bei jeder Verzögerung denkt, die Software sei kaputt, will ich eine Progress-Bar einbauen, an der der User erkennen kann, wie lange die Bearbeitung seiner Eingabe dauert.. 

    Nur habe ich noch nie eine Progress-Bar programmiert, kann mir jemand helfen?? 

    Donnerstag, 5. September 2013 08:56

Antworten

  • Also die 100% sind dann erreicht wenn der Cursor aufgebaut ist, der Rest zeit der zum anzeigen benötigt wird ist erstmal irrelevant. 

    Aber selbst wenn ich wissen würde wann welche prozentzahl erreicht ist, wie würde ich das in den sql select bekommen?? Ich kann ja schlecht hinterher hin gehen und das bestimmen, weil da ja schon der cursor aufgebaut ist. . 

    Um einen exakten Progressbar anzeigen zu können, musst du zwei Dinge haben, die dir hier schon genannt wurden.

    100% bedeutet in deinem Fall, dass du bereits vor dem Ausführen der Abfrage wissen müsstest, wieviele Datensätze am Ende dabei herauskommen.

    Um die Länge des Fortschrittsbalken berechnen und anpassen zu können, müsstest du dann während der Abfrage feststellen können, wieviele Treffer schon gefunden wurden.

    Das Ganze ist im Grunde mit einem in sich abgeschlossenen Vorgang einer SQL Select Abfrage nicht möglich.

    Ich würde an deiner Stelle den Rat von Olaf mit SET TALK ON berücksichtigen, oder ggf. eine feststehende Nachricht am Bildschirm platzieren, die den User darüber informiert, dass der Vorgang länger dauern kann und er sich gedulden soll.

    • Als Antwort markiert Schosch93 Donnerstag, 19. September 2013 11:25
    Donnerstag, 19. September 2013 09:37

Alle Antworten

  • Hi Schorsch.

    Vielleicht hilft dir dies weiter:

    http://all-comp.blogspot.de/2008/01/vfp-how-to-insert-simple-progress-bar.html


    LG, Dennis.

    EDI Consultant/Developer

    Ich nutze meistens VB6 und VS2005 bis VS2012

    Bitte die Antworten sowie weitere hilfreiche Beiträge von Mitgliedern markieren. Vielen Dank.

    Donnerstag, 5. September 2013 13:11
  • Wenn das alles in einer SQL Abfrage passiert, die den riesen Cursor generiert, hast Du sowieso keine Chance, eine Progressbar anzuzeigen und zu aktualisieren. Da gibt's dann aber was eingebautes: SET TALK ON zeigt den Fortschritt lang dauernder SQL-Abfragen.

    Du brauchst sonst einen Punkt in einer Schleife, in der Du eine visuelle Progressbar aktualisiern kannst, die kann dann aus zwei Shapes bestehen, das ist ja nicht das Problem. Du mußt aber wissen, was 100% bedeuten soll, und abschätzen können wo Du gerade bist. Typisches Beispiel beim Scan durch eine einzelne Tabelle, der sogenannte Performancemäßig üble und nicht optimierte Full Table Scan: Recccount() ist 100% RElativer Fortschritt ist also Recno()/Reccount()*100.00. Bei Abfragen über viele Tabellen mit Joins etc. wird es beliebig kompliziert, das kann man nicht allgemein halten, außer wie gesagt, daß 100% bekannt sein muß und der aktuelle Stand irgendwie abgeschätzt werden muß.

    Tschüß, Olaf.


    Olaf Doschke (Setmics)

    Montag, 9. September 2013 16:07
  • Also die 100% sind dann erreicht wenn der Cursor aufgebaut ist, der Rest zeit der zum anzeigen benötigt wird ist erstmal irrelevant. 

    Aber selbst wenn ich wissen würde wann welche prozentzahl erreicht ist, wie würde ich das in den sql select bekommen?? Ich kann ja schlecht hinterher hin gehen und das bestimmen, weil da ja schon der cursor aufgebaut ist. . 
    Donnerstag, 19. September 2013 08:09
  • Also die 100% sind dann erreicht wenn der Cursor aufgebaut ist, der Rest zeit der zum anzeigen benötigt wird ist erstmal irrelevant. 

    Aber selbst wenn ich wissen würde wann welche prozentzahl erreicht ist, wie würde ich das in den sql select bekommen?? Ich kann ja schlecht hinterher hin gehen und das bestimmen, weil da ja schon der cursor aufgebaut ist. . 

    Um einen exakten Progressbar anzeigen zu können, musst du zwei Dinge haben, die dir hier schon genannt wurden.

    100% bedeutet in deinem Fall, dass du bereits vor dem Ausführen der Abfrage wissen müsstest, wieviele Datensätze am Ende dabei herauskommen.

    Um die Länge des Fortschrittsbalken berechnen und anpassen zu können, müsstest du dann während der Abfrage feststellen können, wieviele Treffer schon gefunden wurden.

    Das Ganze ist im Grunde mit einem in sich abgeschlossenen Vorgang einer SQL Select Abfrage nicht möglich.

    Ich würde an deiner Stelle den Rat von Olaf mit SET TALK ON berücksichtigen, oder ggf. eine feststehende Nachricht am Bildschirm platzieren, die den User darüber informiert, dass der Vorgang länger dauern kann und er sich gedulden soll.

    • Als Antwort markiert Schosch93 Donnerstag, 19. September 2013 11:25
    Donnerstag, 19. September 2013 09:37
  • okee, das wird dann wohl oder übel erst mal ausreichen müssen, schade -.- 

    Aber vielen dank leute

    Donnerstag, 19. September 2013 11:25
  • Was dachtest Du denn, wie das sonst gehen soll? hellsehen?

    Im SQL könnte man schon eine Anzeige mit einbauen, Du kannst einfach Deine Where-Klausel ergänzen mit WHERE (bisherigewhereklausel) and ShowProgress()

    ShowProgress() muß dann natürlich immer .T. zurückgeben, um das Ergebnis nicht zu verfälschen. Das würde einmal beim Aufbau des Ergebniscursor aufgerufen werden und dann für jeden Datensatz, der ins Ergebnis kommen könnte. Wenn Deine Abfrage lange dauert, würde sie damit aber u.U. um etliches länger dauern, wenn Du jedesmal die Progressbar neu zeichnest. Das ist alleine deswegen nicht wirklich ratsam Außerdem ist es überhaupt nicht übertragbar auf SQLExec, remote Views, alle Abfragen zu exernen Datenbanken. 

    Mal ein anderes Beispiel: Wenn Du den Fortschritt eines Setups per Progressbar darstellst, kannst Du z.B. von vornherein wissen, wieviele Dateien zu kopieren sind und dann den prozentualen Fortschritt abschätzen als 100*(Anzahl kopierter Dateien)/(Anzahl Dateien insgesamt). 

    Und wenn die Dateien sehr unterschiedlich groß sind, hast Du nicht wirklich einen guten Fortschrittsindikator, wenn z.B. die letzte Datei besonders groß ist, wandert der Balken schnell zu 99% und bleib dann da lange hängen.

    Wie macht Set Talk On das? In einem einfachen Fall schätzt es den Fortschritt vergleichbar ab mit 100*Recno()/Reccnount(). 

    Einen vernünftigen Fortschrittsbalken hinzubekommen ist ziemlich unmöglich, deswegen ist die automatische Progressbar von SET TALK ON auch so ungleichförmig.

    Die einzigen Fälle, wo man einen super gleichmäßig laufenden Balken hinkriegen würde sind voll rushmore optimierte Abfragen, bei denen VFP nach inspizierung der Indizes schon genau weiß, welche Datensatznummern es sich ins Ergebnis holen muß. Wenn man den Optimierungsschritt dann vernachlässigt ist es dann wirklich einfach (Anzahl der bereits gelesenen Records) / (Anzahl insgesamt zu lesender)

    Aber dann ist die Abfrage meist auch so schnell durch, daß ein Fortschrittsbalken gar nicht mehr nötig ist.

    Die wichtigere Frage, die Du Dir stellen solltest ist eigentlich, warum die Abfragen so lange dauern, und ob Du schon an die richtigen Indexe gedacht hast, um die Abfrage zu beschleunigen.

    Last not least, siehe xkcd:Estimation


    Olaf Doschke (Setmics)

    Freitag, 20. September 2013 05:46
  • Hallo Schosch,

    Man kann auch zu kleinen Tricks greifen. Das User nicht gern vor einem regungslosen Bildschirm sitzen ist klar , tut keiner gern,auch ich nicht. Und warten tut auch keiner gern, aber ich habe festgestellt das die Unruhe bei 40 sec mit Meldung(en) kleiner ist als bei 20 sec ohne jegliche Info. Deswegen hab ich z.B. zusammengesetzte Abfragen  schon mal aufgeteilt in kleinere Schritte und dann mit WAIT WINDOW ..NOWAIT dazwischen Infos gestreut, z.B. Schritt1 von 5 Schritten erfolgt oder lasse die recno() mitlaufen oder was auch immer.
    Wenn Du dann noch SET TALK ON  machst dazwischen ist auf dem Bildschirm eine Menge los und der
    User der das nach einer Weile kennt weiß wann was passiert und das was passiert.
    Ist vielleicht nicht sooo elegant aber effektiv was Userruhigstellung angeht.

    Musst halt schauen was da bei Dir machbar ist

    Grüsse aus dem WBL

    Horst

    Freitag, 20. September 2013 05:52
  • ja daran hatte ich auch schon gedacht, aber ich fand nen Prozess-balken schöner. Nun, es hätte ja sein können, dass es ne Funktion gibt, die einen genaue berechnung der sql-abfrage ermöglicht. aber da das alle so ungenau, kompliziert und vor allem noch sehr viel zeitraubender sind, als der select an sich sowieso schon, denke ich dass ich derweilen ne kleine animation aus 2-3 blidern und nem timer mache, der die bilder in einem intervall von 150 wechseln lässt.
    vor dem select wird initialisiert und hinterher wird die wieder geschlossen. Würde der pc sich aufhängen bliebe auch die animation stehen. und das gibt dem User ein besseres gefühl :D 
    ps.: die idee ist mir grade gekommen, als ich an ein spiel gedacht habe.  
    Freitag, 20. September 2013 07:04
  • Na prima.
    Dann nimm einfach noch die richtigen Bilder und die User vergessen das Arbeiten ganz:-))

    Ich kenn schon Deine nächste Frage: wie finde ich heraus welcher User vorm Bildschirm sitzt
    (unabhängig vom einloggen und Arbeitsplatz (weil sich vielleicht mal einer falsch hinsetzt))
    damit ich immer die richtigen Bilder parat habe

    honi soit qui mal y pense (oder so)

    WBL-Grüsse

    Horst

    Freitag, 20. September 2013 09:41
  • Och nöö.. das Problem hatte ich schon im vorraus gelöst ^^ 

    Aber danke trozdem für den hinweis :) 
    Montag, 23. September 2013 07:53
  • Das ist keine so unübliche Sache, man denke an Eieruhr aber auch den undeterminierten Fortschrittsbalken.

    oder auch unter Mac


    Du kannst das Windows Original aufrufen, siehe

    http://www.sweetpotatosoftware.com/SPSBlog/PermaLink,guid,9e494312-e24a-4063-ae8c-ec194db8549a.aspx

    s. letztes Beispiel "Marquee".

    Tschüß, Olaf.


    Olaf Doschke (Setmics)


    • Bearbeitet Olaf Doschke Dienstag, 24. September 2013 06:00
    Dienstag, 24. September 2013 05:58