[VB] - Download speed en Time Remaining

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Mopperman
  • Registratie: Maart 2006
  • Laatst online: 29-01 16:45
Na jaren van afwezigheid in VB, ben ik er nu weer terug ingestapt, maar ben een beetje roestig....

Voor 't werk ben ik bezig met een klein programmatje om installaties te downloaden, nu ben ik zover dat ik meerdere files gedownload krijg, een mooie progressbar heb, echter, krijg ik 't nog neit voor elkaar om een time remaining en/of een download speed erbij te krijgen.

Nu vroeg ik me af of de tweakers hierme in de juiste richting kunnen duwen....
Momenteel heb ik dit in visual basic staan....

Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
Imports System.Net

Public Class serversoftwarepack


    Private Sub btnStartDownload_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStartDownload.Click

        Dim client As WebClient = New WebClient
        Dim client2 As WebClient = New WebClient
        Dim client3 As WebClient = New WebClient
        AddHandler client.DownloadProgressChanged, AddressOf client_ProgressChanged
        AddHandler client.DownloadFileCompleted, AddressOf client_DownloadCompleted
        client.DownloadFileAsync(New Uri("http://www.bbned.nl/scripts/speedtest/download/file32mb.bin"), "C:\temp\file32mb.bin")
        client2.DownloadFileAsync(New Uri("http://speedtest.tweak.nl/10mb.bin"), "C:\temp\file10mb.bin")
        client3.DownloadFileAsync(New Uri("http://speedtest.tweak.nl/25mb.bin"), "C:\temp\file25mb.bin")
        btnStartDownload.Text = "Download in Progress"
        btnStartDownload.Enabled = False
        btnStartInstall.Enabled = False
        btnStartInstall.Text = "Download Files First"

  
    End Sub


    Private Sub client_ProgressChanged(ByVal sender As Object, ByVal e As DownloadProgressChangedEventArgs)
        Dim bytesIn As Double = Double.Parse(e.BytesReceived.ToString())
        Dim totalBytes As Double = Double.Parse(e.TotalBytesToReceive.ToString())
        Dim percentage As Double = bytesIn / totalBytes * 100

        ProgressBar.Value = Int32.Parse(Math.Truncate(percentage).ToString())
        ProgressText.Text = Int32.Parse(Math.Truncate(percentage).ToString())

    End Sub

    Private Sub client_DownloadCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.AsyncCompletedEventArgs)
        If e.Error Is Nothing Then
            btnStartDownload.Text = "Download Completed"
            btnStartDownload.Enabled = False
            btnStartInstall.Enabled = True
            btnStartInstall.Text = "Start Software Installation"
        Else
            MsgBox("An error occured: " & e.Error.Message)
        End If
    End Sub

    Private Sub btnStartInstall_Click(sender As Object, e As EventArgs) Handles btnStartInstall.Click
        btnStartInstall.Enabled = False
        btnStartInstall.Text = "Software Installation in progress"
    End Sub



End Class

I can see clearly now the rain has gone. I can see all obstacles in my way.


Acties:
  • 0 Henk 'm!

  • epic007
  • Registratie: Februari 2004
  • Laatst online: 22-09 15:11
Op het eerste gezicht start je 3 clients, en maar bij één voeg je de DownloadProgressChanged handler toe.

Verder moet je een manier zien te vinden om de totalbytes van alle files bij elkaar op te tellen en alle bytesreceived bij elkaar op tellen.

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Visual Basic .NET:
1
2
3
4
5
        Dim bytesIn As Double = Double.Parse(e.BytesReceived.ToString()) 
        Dim totalBytes As Double = Double.Parse(e.TotalBytesToReceive.ToString()) 

        ProgressBar.Value = Int32.Parse(Math.Truncate(percentage).ToString()) 
        ProgressText.Text = Int32.Parse(Math.Truncate(percentage).ToString()) 

Doe eens niet zeg :X Waarom doe je dit in hemelsnaam?

Wat had je zelf bedacht over het berekenen van de speed (Mb/s) en time remaining ("eta")?
Je kunt gewoon ergens bijhouden wanneer je gestart bent, je weet hoeveel bytes je gedownload hebt dus vervolgens uitrekenen hoeveel (mega)bytes p/sec je doet moet geen rocket science zijn. Evenals de eta: je weet hoeveel bytes je reeds gedownload hebt, hoeveel seconden dat kostte en hoeveel bytes je nog te gaan hebt. Veel meer dan basisschool "wiskunde" heb je hier niet voor nodig hoor ;)

Pas je op dat dit geen scriptrequest / Kan iemand even...? wordt? We zien hier graag wat je zelf al bedacht/geprobeerd hebt om je vraag te beantwoorden, en daar zie ik nu 0 van terug.

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Mopperman
  • Registratie: Maart 2006
  • Laatst online: 29-01 16:45
:o

Ik ben wat roestig zoals ik al aangaf... ;)

punt is dat ik enorm weinig/geen ervaring heb (nog) met berekenen van tijden e.d.
Mijn pogingen om met een ticker iets te proberen kwamen allemaal uit met een error, vandaar mijn kreet om een duwtje... :)

Wat betreft t stukje code wat je quote.... }:O
Kon zo snel niets beters verzinnen... Werkt wel....! :+

Zal zo ff rest van de code posten wat ik al had....

[ Voor 7% gewijzigd door Mopperman op 04-10-2013 11:09 ]

I can see clearly now the rain has gone. I can see all obstacles in my way.


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Mopperman schreef op vrijdag 04 oktober 2013 @ 11:08:
punt is dat ik enorm weinig/geen ervaring heb (nog) met berekenen van tijden e.d.
Mijn pogingen om met een ticker iets te proberen kwamen allemaal uit met een error, vandaar mijn kreet om een duwtje... :)
Je hebt helemaal geen ticker nodig; je wil gewoon de "starttijd" van de download(s) in een variabele (van het type DateTime) opslaan. En elke keer dat je ProgressChanged event wordt aangeroepen kun je de verstreken tijd bepalen door gewoon Datetime.Now - StartDate te doen. Dat geeft een Timespan terug die weer properties heeft als TotalSeconds, TotalMilliseconds etc. En die kun je vervolgens weer makkelijk gebruiken in je berekening:

speed_in_bytes_per_second = totalbytesdownloaded / totalseconds

Je weet hoeveel bytes je hebt gedownload, je weet hoeveel je er nog moet, je weet hoe laat je begonnen bent en hoeveel seconden het duurde om het aantal bytes dat je nu hebt te downloaden. Dat is meer dan genoeg om een goede schatting te maken wat de eindtijd wordt van de laatste byte. Die eindtijd - beginttijd = tijd_te_gaan (eta)

Mopperman schreef op vrijdag 04 oktober 2013 @ 11:08:
Kon zo snel niets beters verzinnen... Werkt wel....! :+
Naar een string converteren en daarna weer terug parsen is nooit een goed idee. Gewoon casten (of Convert.ToDouble() ofzo gebruiken).

[ Voor 17% gewijzigd door RobIII op 04-10-2013 11:28 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij