Progressbar einfügen aber wie?

  • VB.NET

Es gibt 25 Antworten in diesem Thema. Der letzte Beitrag () ist von Dodo.

    Progressbar einfügen aber wie?

    Hallo VBler

    Ich habe ein Problem mit einer Progressbar, ich weis nicht wie ich diese korrekt einfügenkann..

    ich möchte eine haben für die Akktuelle Datei und eine für den Gesamt Fortschritt.

    hier ein ausschnitt: Delet

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Fire88“ ()

    hmm aber es ist ja immer unterschiedlich wie viele er herunterläd...
    deshalb verwirrt es mich gerade sehr extrem -.-''

    gibt es nicht eine varriante die den Aktuellen download von webclienten ausgeht anzeigt?

    mfg

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Fire88“ ()

    Der downloader ist nehme ich mal ein ein WebClient? Ist der Global deklariert? Wenn ja nutze die Events von ihm um den Einzeldateifortschritt anzuzeigen.

    msdn.microsoft.com/de-de/libra…nloadprogresschanged.aspx
    (geht glaube ich nur bei asynchronem Download).

    Für den Fortschritt aller Dateien, hast du ja die Anzahl der Dateien aus der Config. Also einfach einen Zähler hochlaufen lassen und den Prozentwert entsprechend in der Bar anzeigen.

    PS: Zudem bringt es nichts, wenn du die Länge einer Datei Hashest um sie zu vergleichen, dann kannst diese auch direkt vergleichen weil es ja eine Zahl ist. Was eher Sinn machen würde, den INHALT der Datei Hashen und vergleichen.
    @Davinho

    so sieht sie aus:

    PHP-Quellcode

    1. Patchlist.exe=2874698604693BF1C82C5F264EE15E96
    2. uiwhisper.py=B8CE47761ED7B3B6F48B583350B7F9E4


    @Dodo, Vielen dank für den Link und die kurzbeschreibung, ich bin mir nur noch nicht ganz sicher wegen dem ansync etc, kenne das Fach chinesisch noch nicht so gut =)
    aber das von msdn, werde ich mir gut durchlesen und mal sehen ob ich da was raus lernen kann.

    Gesammtfortschritt habe ich nun gelöst, und zwahr so: Delet


    nun nur noch zum Aktuellen DownloadFortschritt

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Fire88“ ()

    Nun asynchron ist das Gegenteil von synchron =)
    Das heißt, wenn dein Programm eine Datei downloaded, so "hängt" es solange, also du wirst nichts klicken können usw. somit funktioniert natürlich auch keine Progressbar, weil der GUI Thread ja währen deines Downloads "hängt" deswegen muss der Download asynchron gestartet werden, damit der GUI Thread reagieren und die Progressbar den Fortschritt anzeigen kann.

    Aufpassen musst du allerdings darauf, dass nach dem starten des Downloads, der Code weiter läuft, somit die nächste Datei gestartet wird, obwohl der andere Download noch nicht abgeschlossen ist. Dann wirds zu einer Exception kommen. Heißt du musst warten bis der Download fertig ist und erst danach die nächste Datei downloaden.
    achsoo,, ja ich habe es via thread gemacht, und habe (nun hasst ihr mich)

    VB.NET-Quellcode

    1. Control.CheckForIllegalCrossThreadCalls = False
    gemacht. somit kann ich mit der Progressbar auch kommunizieren.

    bin es mir aber am überlegen ob ich das

    VB.NET-Quellcode

    1. Control.CheckForIllegalCrossThreadCalls = False
    nicht weg lassen soll und es via Invoke laufen lassen soll. habe es mal mit einem label gemacht der was über Invoke angezeigt hat während dem das ein thread am laufen wahr. nur mit einer Progressbar hab ich das noch nicht getestet.


    mfg
    Ob Lable, Progressbar, Button, Form, das ist völlig egal, im Endeffekt rufst du nur eine Methode über Invoke auf, übergibst ihr Parameter die in der Methode dann auf Controls angewendet werden können.

    Du solltest dich aufjedenfall von CheckForIllegalCrossThreadCalls entfernen, das ist eine hohe und schlecht zu lokalisierende Fehlerquelle.
    okey, dan werde ich das noch nachholen.. =) da man das hier ja nicht gerne sieht das man

    VB.NET-Quellcode

    1. Control.CheckForIllegalCrossThreadCalls = False
    stellt

    nun habe ich was aufgeschnappt bei msdn

    VB.NET-Quellcode

    1. CStr(e.UserState), e.BytesReceived, e.TotalBytesToReceive, e.ProgressPercentage)


    würde es gehen wen ich z.b.:

    VB.NET-Quellcode

    1. progresbar2.maximum= TotalBytesToReceive
    2. prograssbar.value = BytesReceive


    machen würde?

    oder sehe ich da gerade was komplett falsch =)

    Danke nochmals für die Hilfe und Auskunft
    Auf jeden Fall solltest du CheckForIllegalCrossThreadCalls weglassen.
    Invoken geht ganz einfach.
    Hier ein Beispiel, wie du aus einem anderen Thread aus auf ein Steuerelement zugreifen kannst:

    VB.NET-Quellcode

    1. Public Sub IchLaufeInEinemAnderenThread()
    2. Steuerelement.BeginInvoke(Sub()
    3. Steuerelement.Eigenschaft1 = "hi"
    4. Steuerelement.Eigenschaft2 = 1337
    5. ' usw
    6. End Sub)
    7. End Sub

    Fire88 schrieb:

    da man das hier ja nicht gerne sieht


    Das sollst nicht UNS zu liebe machen, sondern DIR! Uns ist das erstmal egal was du fabrizierst. Wir sind nur verfechter von gutem, sauberen Code und dazu gehört sowas eben nicht.

    Zur Progressbar: Also den Maxwert würde ich nicht ständig verändern, du hast ja als Argument e.ProgressPercentage was heißt das auf Deutsch? Richtig Prozent. Also Maxwert = 100 und Value den Prozentwert vom Download zuweisen. Wenn du mal dieses Argument nicht haben solltest, dann ist es ein leichtes aus den TotalBytes und ReceivedBytes die Prozent aus zu rechen, 3-Satz solltest du ja in der Schule bereits gehabt haben.
    hehe ja 3 Satz habe ich auch heute noch (Technikerschule) =)

    ach ich Idiot.. stimmt.. ich denke das Argument sollte ich schon haben..
    andernfalls greife ich doch auf den 3 Satz zurück.

    Vielen Dank euch, dann hat sich dies für mich soweit eigentlich erledigt.

    EDIT: zu früh gefreut, das mit dem 3satz, wüste ich wie es geht, doch ich habe keinerlei member/Argumente für dies.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Fire88“ ()

    hmm

    VB.NET-Quellcode

    1. Private Shared Sub DownloadProgressCallback(ByVal sender As Object, ByVal e As DownloadProgressChangedEventArgs)


    leider verstehe ich den zusammenhang nicht ganz von dem.

    ich weis z.b. das "DownloadProgressChanged" "sobald der download Fortschritt ändert"

    aber mit dem kann ich leider noch nichts anfangen *snif*
    Du startest mittelt dem DownloadAsync() den Download einer Datei, dann wird in dieser Methode die Datein heruntergeladen. In regelmäßigen Abständen feuert die Download Methode ein Event, welches den Fortschritt wiederspiegelt, dies geschieht in der Sub.

    VB.NET-Quellcode

    1. Private WithEvents w As New WebClient
    2. Private Sub Button_Click() Handles Button.Click
    3. w.DownloadAsync("url_zur_datei", "ziel_pfad")
    4. End Sub
    5. Private Sub w_DownloadProgressChanged(ByVal sender As Object, ByVal e As DownloadProgressChangedEventArgs) Handles w.DownloadProgessChanged
    6. Progressbar1.Value = e.ProgressPercentage
    7. End Sub


    So sieht ein abstrakter Code für Asynchronen Download mit dem entsprechenden Event aus.