powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Байты, кбайты,Мбайты Kbps kbps
8 сообщений из 8, страница 1 из 1
Байты, кбайты,Мбайты Kbps kbps
    #37019773
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Короче есть процесс DownLoad.
Скачиваем файл 15234545787878байт
Скачали 55566785755байт за время 8777мс
Цифры произвольные, думать над ними не надо.

Надо:
1) Отобразить скачано/всего (байт Кбайт МБ)
2) Отобразить Kbps (mbps,х.зпс)

В общем отобразить все это красиво как положено, т.е. отформатировать как надо,
как IE т.е. делает когда скачивает.
То что 1Кб=1024байта мне известно,
в KBPs вообще не разбираюсь и подозреваю что в черновом коде(ниже) вообще ерунда, и кажется завышает на порядок.
В общем то мне на все эти кбпс-понятия наплевать, но вставлять в прогу явную чушь как бы тоже неохота.

nRead-прочитано байт nFull-всего байт

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
Private Sub NetGrab1_DownloadFileProgress(ByVal nRead As Long, ByVal nFull As Long)
   Dim Kbps As Double
    Debug.Print nRead & "-" & nFull
    If nFull >  0  Then
        ProgressBar1.Max = CSng(nFull)
    End If
    With NetGrab1
        If (nRead >  0 ) And (nRead <= nFull) And (.Duration >  0 ) Then
            ProgressBar1.Value = CSng(nRead)
            Kbps = ((nRead *  8 ) /  1000 ) / (.Duration /  1000 )
            Label3.Caption = Format$(nRead, "#,##0") & "/" & _
              Format$(nFull, "#,##0") & " bytes (" & _
              Format$(Kbps, "0.0") & " kbps)"
        End If
    End With
End Sub


Как бы эти показания все облагородить?
Иными словами не даст ли мне кто готовую ф-цию для отображения форматированных байт/кБ/мб
а также вычисления/форматированного отображения кБпС-ов всяких (буквы извернул нарочно чтоб подчеркнуть свое непонимание этих единиц измерения).

Помогите, а то умучился с этими способами асинхронных закачек, думать над этими школьными форматированиями уже голова не варит.
...
Рейтинг: 0 / 0
Байты, кбайты,Мбайты Kbps kbps
    #37020373
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для начала, nRead это сколько всего прочитано из nFull? Умножать на 8 зачем? Ты уж определись, килобайты или килобиты тебе нужны. А делить все равно нужно на 1024, а не 1000.
Что такое NetGrab1.Duration? Если время, прошедшее с начала закачки, то ты считаешь среднюю скорость за все это время.

Короче, все это муть.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
Private Sub NetGrab1_DownloadFileProgress(ByVal nRead As Long, ByVal nFull As Long)
	Dim Kbps As Double
	Static pRead as Long
	Static pTime as Date
	if NetGrab1.Duration =  0  then pRead =  0 
	Kbps = ((nRead - pRead) / DateDiff("s",Now,pTime)) /  1024 
	pRead = nRead
	pTime = Now
End Sub
...
Рейтинг: 0 / 0
Байты, кбайты,Мбайты Kbps kbps
    #37020387
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя я не знаю, как часто срабатывает DownloadFileProgress, скорее всего разницу во времени нужно считать в миллисекундах.
...
Рейтинг: 0 / 0
Байты, кбайты,Мбайты Kbps kbps
    #37020544
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AntonariyА делить все равно нужно на 1024, а не 1000. Короче, все это муть.
Там какая-то муть со стандартом. Выяснять разницу KB/sec Kbps и kbps у меня желания нет. Но я с равнивал с IE, он делит на 1000 и пишет KB/sec .
В принципе я все уже сделал
NetGrab1.Duration-время прошедшее с закачки в миллисекундах. Срабатывает довольно часто, поэтому обновлять текст лучше по таймеру раз в 1сек.
Код: plaintext
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.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
        NetGrab1.DownloadStart "http://www.mysite.com/myfile.zip", _
          vbAsyncReadForceUpdate, vbAsyncTypeFile, "NewVersion"

Private Sub NetGrab1_DownloadFileProgress(ByVal nRead As Long, ByVal nFull As Long)
   Dim Kbps As Long 'Double
    Debug.Print nRead & "-" & nFull
    If nFull >  0  Then
        ProgressBar1.Max = CSng(nFull)
    End If
    With NetGrab1
        If (nRead >  0 ) And (nRead <= nFull) And (.Duration >  0 ) Then
            ProgressBar1.Value = CSng(nRead)
            Kbps = CLng((nRead /  1000 ) / (.Duration /  1000 ))
            tmp_Progress = "Estimated time left " & EstimatedTimeLeft(nRead, nFull, .Duration) & " (" & _
              FormatBytes(nRead) & " of " & _
              FormatBytes(nFull) & " copied) "
            tmp_Rate = Format$(Kbps, "#") & " KB/Sec"
        End If
    End With
End Sub
Private Sub NetGrab1_DownloadFileComplete(ByVal FileName As String)
   Dim Kbps As Long 'Double
    tmp_Progress = ""
    tmp_Rate = ""
    TimerRefresh.Enabled = False
    Kbps = CLng((GetFileS(FileName) /  1000 ) / (NetGrab1.Duration /  1000 ))
    LabelProgress.Caption = FormatBytes(GetFileS(FileName)) & " in " & GetMeTime(NetGrab1.Duration)
    LabelRate.Caption = Format$(Kbps, "#") & " KB/Sec"
    If NetGrab1.Action = "NewVersion" Then
        CopyFile FileName, NewVersionFile, True
        DeleteFile FileName
        ProcessRunNewVersion NewVersionFile
    End If
End Sub

Function FormatBytes(in_bytes As Long) As String
    Dim KB As Long
    Dim MB As Double
    KB = in_bytes /  1024 
    If KB <  1000  Then
        FormatBytes = CStr(KB) & "KB"
    Else
        MB = KB /  1024 
        If MB <  10  Then
            FormatBytes = Format$(MB, "#.00") & "MB"
        Else
            FormatBytes = Format$(MB, "#.0") & "MB"
        End If
    End If
End Function

Function EstimatedTimeLeft(m_Read As Long, m_Full As Long, m_Duration As Long) As String
    Dim TimeLeftSec As Long
    Dim TimeLeftMin As Long
    Dim TimeLeftH As Long
    If m_Read >  0  Then
        TimeLeftSec = CLng(m_Duration * ((m_Full - m_Read) / m_Read) /  1000 )
        If TimeLeftSec <  60  Then
            EstimatedTimeLeft = TimeLeftSec & " sec"
        Else
            TimeLeftMin = Int(TimeLeftSec /  60 )
            TimeLeftSec = TimeLeftSec - (TimeLeftMin *  60 )
            If TimeLeftMin <  60  Then
                EstimatedTimeLeft = TimeLeftMin & " min " & TimeLeftSec & " sec"
            Else
                TimeLeftH = Int(TimeLeftMin /  60 )
                TimeLeftMin = TimeLeftMin - (TimeLeftH *  60 )
                EstimatedTimeLeft = TimeLeftH & " h " & TimeLeftMin & " min"
            End If
        End If
    Else
        EstimatedTimeLeft = ""
    End If
End Function

Function GetMeTime(m_Duration As Long) As String
    Dim TimeSec As Long
    Dim TimeMin As Long
    Dim TimeH As Long
    TimeSec = m_Duration /  1000 
    If TimeSec <  60  Then
        GetMeTime = TimeSec & " sec"
    Else
        TimeMin = Int(TimeSec /  60 )
        TimeSec = TimeSec - (TimeMin *  60 )
        If TimeMin <  60  Then
            GetMeTime = TimeMin & " min " & TimeSec & " sec"
        Else
            TimeH = Int(TimeMin /  60 )
            TimeMin = TimeMin - (TimeH *  60 )
            GetMeTime = TimeH & " h " & TimeMin & " min"
        End If
    End If
End Function

Private Sub TimerRefresh_Timer()
    LabelProgress.Caption = tmp_Progress
    LabelRate.Caption = tmp_Rate
End Sub

Собственно я занят подгонкой под себя вот энтого:
How To Use the AsyncRead Method to Download Files
Готовый хороший пример:
http://vb.mvps.org/samples/NetGrab/
+ предыстория в 2-х моих недавних топиках.

Как думаете, оно того стоит?
Планирую использовать для чтения текстовухи с сервера в переменную и для контролируемой загрузки файла (с прогрессбаром).
Через wininet API я обломался, натолкнувшись на сложности асинхронного подхода, а Inet-control требует ocx, по религиозным соображениям таскать ее за программой не хочу. Плюс те 2 метода не очень нравятся антивирусам. А на этот 2 дня назад смотрел как на новые ворота, но вроде понравилось в итоге. User Control ведь за собой не надо таскать? Муть конечно, но метод вроде как "родной-майкрософтовский".
...
Рейтинг: 0 / 0
Байты, кбайты,Мбайты Kbps kbps
    #37020784
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Как думаете, оно того стоит?Только лишь ради прогрессбара и циферок, на которые не смотрит 99% пользователей, я бы не стал городить такие огороды.
Дмитрий77Муть конечно, но метод вроде как "родной-майкрософтовский".Я имел ввиду расчет скорости.
...
Рейтинг: 0 / 0
Байты, кбайты,Мбайты Kbps kbps
    #37020944
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Antonariy,
Бог с ними с циферьками, хотя куда эти пользователи еще смотрят....

Проблема возникла в другом, я описывал в соседней теме. В случае когда интернет типа есть, но на самом деле нет (отключен в роутере) при синхронном запросе через wininet API вся программа будет висеть (~10-15сек) до получения error.

Поэтому я и спрашиваю вашего авторитетного мнения про две ссылки что внизу (насчет UserControl ). Надо просто скачать и глянуть исходный (не испорченный "циферьками" пример).
Конкренто вот этот:
http://vb.mvps.org/samples/snatch.asp?id=NetGrab
И сказать, что думаете.

Или возможно Вам будет под силу вылечить уникальный API-вариант? здесь в конце взгляните.
http://www.sql.ru/forum/actualthread.aspx?tid=385335
...
Рейтинг: 0 / 0
Байты, кбайты,Мбайты Kbps kbps
    #37020977
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А с другой стороны, может случайно известен способ контролируемо и грамотно вызвать родное окно? Тогда вопрос о прогрессбаре и загрузке большого файла вообще можно снять.
(потому что ниже безграмотно).
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
Private Sub cmdGet_Click()
    Dim TheBrowser 'As InternetExplorer
    MsgBox "Run App after downloading"
On Error GoTo nodown
    Set TheBrowser = CreateObject("InternetExplorer.Application")
    'TheBrowser.Visible = True
    TheBrowser.Navigate "http://www.myproga.com/newversion.zip"
nodown:
    Set TheBrowser = Nothing
End Sub
...
Рейтинг: 0 / 0
Байты, кбайты,Мбайты Kbps kbps
    #37022111
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Короче, NetGrab/UserControl решение пока решил не использовать но иметь ввиду на будущее.
Оно хорошо именно когда надо встроить прогрессбар в рюшечки. Т.к. я стараюсь придерживаться Windows а не custom стандартов оформления, то использовать такой прогрессбар означает полностью перерисовать диалог "Загрузка файла", что конечно мне под силу, но в данном случае как заметил Antonariy не стоит городить такие огороды, да и при выходе новой версии IE он станет нестандартным. Имело бы смысл, если б новая версия скачивалась и без спроса устанавливалась по одному подтверждению, но "без спроса" пока не планируется.

В этих всех делах еще есть подводные камни:
1) Автономный режим IE
2) Internet Explorer Enhanced Security Cofiguration
и фиг знает чего еще.

Поэтому все таки остановился на следующем:
1) Для чтения короткого текстового файла (в частности с информацией об New Version) использовать Microsoft Internet Transfer Control 6.0 (SP6) с корректной инсталляцией/регистрацией OCX через setup приложения.
2) Для загрузки/запуска файла использовать стандартное диалоговое окно IE "Загрузка файла" по методу:
Код: plaintext
1.
2.
3.
4.
5.
6.
Private Sub cmdGet_Click()
    Dim TheBrowser 'As InternetExplorer
On Error exit sub
    Set TheBrowser = CreateObject("InternetExplorer.Application")
    TheBrowser.Visible = False
    TheBrowser.Navigate "http://www.myproga.com/newversion.zip"
End Sub

(1) позволяет избежать висяка программы, т.к. работает асинхронно и всегда возвращает результат, пусть пустой через 10сек в случае неуспеха(нет связи с сайтом, автономный режим и т.п.) но всегда возвращает. Здесь нужна надежность, ибо этот пункт выполняется при каждом старте программы.

(2) успех (2) практически всегда гарантирован, т.к. в случае неуспеха (1) событие (2) никогда не вызывается. Вероятность неуспеха (2) ничтожно мала, в крайнем плохом случае мы получим 1 незакрытый процесс IEXPLORER но на это можно наплевать, т.к. систему это точно не положит.

В конце концов не GetWrite пишу. В общем полегчало. Надо остановиться.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Байты, кбайты,Мбайты Kbps kbps
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]