Brauche hilfe bei meinem updater bitte

  • VB.NET

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von tomso.

    Brauche hilfe bei meinem updater bitte

    ich habe ein updater so mit progressbar und ein label der mir sagt MB von MB

    so ich habe ein 2 label und der soll mir sagen wie lang der download noch braucht
    problem bevor ich
    das mit dem verbliebene zeit gemacht habe ging alles
    aber jetzt geht progressbar nicht und der label auch nicht aber es lädt runter

    könnt ihr mir helfen was ich falsch gemacht habe ????



    VB.NET-Quellcode

    1. Imports System.NetImports System.Timers
    2. Public Class Update
    3. Private WithEvents httpclient As WebClient Dim Pfad As String = Nothing Dim sw As New Stopwatch Dim received As Integer Dim Totalbytes As Double Dim bytes As Double Dim downloadsekunde As Integer Dim downloadsekunden As Integer Dim averagedownload As Integer Dim restzeit As Integer
    4. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load MsgBox("Bitte Datei in das Spielverzeichniss unter Update.exe speichern, die .exe ausführen und auf ersetzen klicken !", MsgBoxStyle.Information, "Information") Me.Hide()ShowDialog: SaveFileDialog1.ShowDialog() If SaveFileDialog1.FileName = Nothing Then GoTo ShowDialog End If Pfad = SaveFileDialog1.FileName Try Me.Show() httpclient = New WebClient Dim URL As String = "http://www.weebly.com/uploads/2/1/9/9/21997230/updater.exe" Application.DoEvents() httpclient.DownloadFileAsync(New Uri(URL), Pfad) Application.DoEvents() Catch ex As Exception MsgBox("ein Fehler ist aufgetreten:" & vbNewLine & ex.ToString, MsgBoxStyle.Critical, "Fehler") End End Try End Sub
    5. Private Sub httpclient_DownloadFileCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.AsyncCompletedEventArgs) Handles httpclient.DownloadFileCompleted MsgBox("Download complete", MsgBoxStyle.Information, "Information") End End Sub
    6. Private Sub httpclient_DownloadProgressChanged(ByVal sender As Object, ByVal e As System.Net.DownloadProgressChangedEventArgs) Dim aTimer As New System.Timers.Timer() AddHandler aTimer.Elapsed, New ElapsedEventHandler(AddressOf OnTimedEvent) aTimer.Interval = 1000
    7. Me.ProgressBar1.Value = e.ProgressPercentage Dim totalbytes = Math.Round(e.TotalBytesToReceive \ 1024 \ 1024, 2) Dim bytes = Math.Round(e.BytesReceived \ 1024 \ 1024, 2) Me.Label1.Text = bytes & "MB von " & Totalbytes & "MB" aTimer.Enabled = True
    8. End Sub
    9. Private Sub OnTimedEvent(ByVal source As Object, ByVal e As ElapsedEventArgs) downloadsekunden += 1 Dim averagedownload = bytes / downloadsekunden Dim restzeit = (Totalbytes - bytes) / averagedownload Label2.Text = restzeit End Sub
    10. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click End End Sub
    11. Private Sub Update_MouseDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles MyBase.MouseDown If (e.Button = Windows.Forms.MouseButtons.Left) Then Me.Capture = False Me.WndProc(Message.Create(Me.Handle, &HA1, CType(&H2, IntPtr), IntPtr.Zero))
    12. Else : End If End SubEnd Class



    lg vbcji
    Hallo vbcji!

    Zuerst einmal möchte ich mich über die Formatierung von deinem Code beklagen... Das hat ja zehn mal länger gedauert als nötig.

    Dies hier

    VB.NET-Quellcode

    1. Private Sub httpclient_DownloadProgressChanged(ByVal sender As Object, ByVal e As System.Net.DownloadProgressChangedEventArgs)

    wird nicht aufgerufen, wie man mit einem einfach Haltepunkt schnell sehen kann! Hier fehlt ganz simpl ldie Handles-Klausel:

    VB.NET-Quellcode

    1. Private Sub httpclient_DownloadProgressChanged(ByVal sender As Object, ByVal e As System.Net.DownloadProgressChangedEventArgs) Handles httpclient.DownloadProgressChanged


    Jetzt wird eine Fehlermeldung erscheinen, aber das hat nichts mehr mit der fehlenden Funktion zu tun!
    erstmal bedanke ich mich das die progressbar wieder geht ^^

    2. bei mir kommt kein fehler ? :D

    3.
    wie kann ich sagen das er mir die verbliebene zeit in label 2 anzeigt ???

    VB.NET-Quellcode

    1. Private Sub OnTimedEvent(ByVal source As Object, ByVal e As ElapsedEventArgs) downloadsekunden += 1 Dim averagedownload = bytes / downloadsekunden Dim restzeit = (Totalbytes - bytes) / averagedownload Label2.Text = restzeit End Sub




    habe ich stehen aber dann kommt ein fehler und das programm hält an

    was kann ich tun ?


    lg vbcji
    Also wieder zuerst rumgemäkele...
    Option Strict On, kennst du das? Das macht alles "schöner"...

    Die Variablen darfst du nicht in dem Sub deklarieren, sonst sind die bei End Sub wieder vergessen... außerdem wäre ein Typ sehr angebracht! (Integer)

    VB.NET-Quellcode

    1. Dim aTimer As New System.Timers.Timer()
    2. Private Sub httpclient_DownloadProgressChanged(ByVal sender As Object, ByVal e As System.Net.DownloadProgressChangedEventArgs) Handles httpclient.DownloadProgressChanged
    3. AddHandler aTimer.Elapsed, New ElapsedEventHandler(AddressOf OnTimedEvent) ' ist hier auch nicht gold richtig, denke ich, erfüllt aber wohl seinen Sinn
    4. aTimer.Interval = 1000
    5. Me.ProgressBar1.Value = e.ProgressPercentage
    6. 'hier schreibst du "Dim receivedbytes [...]", das "Dim" darf hier nicht sein, es ist keine Deklaration!
    7. totalbytes = e.TotalBytesToReceive ' hier darf auf keinen Fall gerundet werden!
    8. bytes = e.BytesReceived ' hier noch weniger!
    9. Me.Label1.Text = (bytes/1024/1024) & "MB von " &( totalbytes/1024/1024) & "MB"
    10. 'das Runden spare ich mir mal :P
    11. aTimer.Enabled = True
    12. End Sub



    Soweit für ProgressChanged...

    Die verbleibende Zeit kannst du doch auch ruhig da berechnen? Ich rate dir von einem Timer ab und empfehle das mit Date zu lösen. Merke dir in einer Variable das Startdatum am Anfang und berechne dann bei ProgressChanged die Differenz in Sekunden, das ist viel besser!

    VB.NET-Quellcode

    1. Dim start as Date = Now


    und später bei ProgressChanged:

    VB.NET-Quellcode

    1. Dim timeused As Integer = (Now - start).TotalSeconds



    MfG,
    Tom
    Also dann mal Schritt für Schritt:

    1. Deklarationen

    VB.NET-Quellcode

    1. Private WithEvents httpclient As WebClient
    2. Dim Pfad As String = Nothing
    3. Dim sw As New Stopwatch
    4. Dim received As Integer
    5. Dim Totalbytes As Double
    6. Dim bytes As Double
    7. Dim downloadsekunde As Integer
    8. Dim downloadsekunden As Integer
    9. Dim averagedownload As Integer
    10. Dim restzeit As Integer
    11. 'Dies hier ergänzen
    12. Dim start As Date
    13. Timer1.start()



    2. FormLoad - Startzeit merken

    VB.NET-Quellcode

    1. Application.DoEvents()
    2. start = Now ' Die Zeit merken, wann der Download start
    3. httpclient.DownloadFileAsync(New Uri(URL), Pfad)


    3. ProgressChanged

    VB.NET-Quellcode

    1. Private Sub httpclient_DownloadProgressChanged(ByVal sender As Object, ByVal e As System.Net.DownloadProgressChangedEventArgs) Handles httpclient.DownloadProgressChanged
    2. Me.ProgressBar1.Value = e.ProgressPercentage
    3. Totalbytes = e.TotalBytesToReceive
    4. bytes = e.BytesReceived
    5. Me.Label1.Text = Math.Round((bytes / 1024 / 1024), 2) & "MB von " & Math.Round((Totalbytes / 1024 / 1024), 2) & "MB" ' Hier runden
    6. downloadsekunden = (Now - start).TotalSeconds ' Die vergangene Zeit berechnen: Aktuelle Zeit - Startzeit, in Seknunden
    7. averagedownload = bytes / downloadsekunden
    8. restzeit = (Totalbytes - bytes) / averagedownload
    9. End Sub


    4. Timer1_Tick

    VB.NET-Quellcode

    1. tem.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
    2. 'und anzeigen und runden
    3. Label2.Text = "Verbleibende Zeit: " & Math.Round(restzeit, 2) & "s"
    4. End Sub


    Das Ganze habe ich mit einem zusätzlichem Timer für die Zeitangabe gemacht, der dann sekündlich die Restzeit anzeigt.

    Ich hoffe, ich konnte dir bis hierhin helfen.
    Meld dich ruhig wenn du noch weitere Fragen hast!