С Новым годом! Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.81/21: Рейтинг темы: голосов - 21, средняя оценка - 4.81
0 / 0 / 0
Регистрация: 22.01.2013
Сообщений: 30

Код расчёта времени загрузки файла

18.02.2016, 13:58. Показов 4535. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую всех гуру программирования. Нужна ваша помощь.

На сайте 2ip есть очень практичный тест, по определению времени загрузки файла в зависимости от скорости. Решил я и в свою программу добавить подобный функционал. Вот только с кодом расчётов этого времени у меня возникли трудности. Поэтому я и прошу вашей помощи.

Итак, что имеется на данный момент:
1. Дизайн в калькуляторе готов: Вложение 1

2. Обработка комбобоксов тоже:
C++
1
2
3
4
5
6
7
8
9
// ------------------ Выбор MB или GB -----------------------------
void __fastcall TTrafficCalc_UOI::cbxSelectUnitChange(TObject *Sender) {
    if (cbxSelectUnit->ItemIndex == 0) {
        GB = false;
    }
    else if (cbxSelectUnit->ItemIndex == 1) {
        GB = true;
    }
}
Данные по скорости берутся напрямую из соответствующего комбобокса.

3. Остался неоконченным функционал кнопки Рассчитать:
C++
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
// ------------------- Расчёт времени закачки файла --------------------------
void __fastcall TTrafficCalc_UOI::butCalculateTimeClick(TObject *Sender) {
    if ((editNeedLoad->Text.IsEmpty()) || (editNeedLoad->Text.ToDouble() == 0))
        return;
 
    cbxSelectUnitChange(Sender); // выбор MB или GB
    DownSpd = cbxSelectDownSpeed->Text.ToDouble(); // DownSpd = выбранной скорости инета в Кбит/с
    load = editNeedLoad->Text.ToDouble(); // load = введённому размеру файла в МБ или ГБ
 
    if (!GB) {
        result = load * 1024 * 8; // общий размер файла в килобитах
    }
    else {
        result = load * 1024 * 1024 * 8;
    }
 
    double TimeSec = result / DownSpd; // Время в секундах
 
    ???
    ???
    ???
 
    /*
    // Код вывода времени
     editNeedTimeHour->Text = Hours;
     editNeedTimeMins->Text = Minutes;
     editNeedTimeSecs->Text = Seconds;
     */
}
При расчёте я исходил из того, что сначала нужно узнать размер файла в килобитах и потом разделить на скорость в килобитах, тогда я получу общее время закачивания файла в секундах (переменная result).

Проблема в том, как быстро и безболезненно преобразовать полученные секунды в часы (Hours), минуты (Minutes) и секунды (Seconds)?

Есть желающие помощь?
Миниатюры
Код расчёта времени загрузки файла  
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.02.2016, 13:58
Ответы с готовыми решениями:

Скачивание файла WebClient с отображением процентов загрузки файла, progressBar, скоростью загрузки файла
Приветствую! Нужна Ваша помощь... Имеется такой кодик, слепленный из готовых примеров System.Net.WebClient webClient =...

Алгоритм расчёта времени поезда в пути по дате и собственно времени(отправления и прибытия)
Всем доброго времени суток. Помогите пожалуйста написать алгоритм расчёта времени поезда в пути, если известны время и дата...

Нужен код для загрузки файла с выбранным иминем
Нужно сделать загрузку картинок, что-бы они сохранялись с названием, которое человек вводит в поле рядом.

16
управление сложностью
 Аватар для Почтальон
1693 / 1306 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
18.02.2016, 14:32
Цитата Сообщение от Alex Dancer Посмотреть сообщение
Проблема в том, как быстро и безболезненно преобразовать полученные секунды в часы (Hours), минуты (Minutes) и секунды (Seconds)?
А зачем вы отдельно выводите часы, минуты и секунды? Не проще ли количество секунд преобразовать в дату-время ?
0
0 / 0 / 0
Регистрация: 22.01.2013
Сообщений: 30
18.02.2016, 14:45  [ТС]
Цитата Сообщение от Почтальон Посмотреть сообщение
преобразовать в дату-время
Это как?
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
18.02.2016, 15:20
C++
1
2
3
4
5
6
    USHORT  hh, mm, ss, uu ;
    double TimeSec = result / DownSpd; // Время в секундах
    TDateTime dt = (double)TimeSec ;
    DecodeTime(dt,hh,mm,ss,uu) ;
    Label1->Caption = String().sprintf(
       "Часов: %d, минут: %d, секунд: %d, мсек: %d",hh,mm,ss,uu);
1
0 / 0 / 0
Регистрация: 22.01.2013
Сообщений: 30
19.02.2016, 12:19  [ТС]
Цитата Сообщение от nick42 Посмотреть сообщение
C++
1
2
3
4
5
USHORT *hh, mm, ss, uu ;
double TimeSec = result / DownSpd; // Время в секундах
TDateTime dt = (double)TimeSec ;
DecodeTime(dt,hh,mm,ss,uu) ;
Label1->Caption = String().sprintf("Часов: %d, минут: %d, секунд: %d, мсек: %d",hh,mm,ss,uu);
Хм... "Либо я тупой, либо лыжи не едут" (c)

Но данный код у меня не работает...

Во-первых, в последней строке ошибка: Type mismatch in parameter 'format' (wanted 'const wchar_t *', got 'const char *')

Во-вторых, если запускать без неё в режиме отладки, то dt даёт 04.03.1900.
А значения hh, mm, ss, uu - все равны нулю.
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
19.02.2016, 15:18
Насчет <wanted 'const wchar_t *'> - это вам с юникодом разбираться..., а с dt - возможно; я не проверял, это только моя гипотеза (насчет того, что 64-битовое слово DateTime содержит в одной половине сумму "дней", а в другой - сумму "миллисекунд"). Если б меня такая проблема заинтересовала всерьез - я бы взлохматил гугль и яндекс... . Так что - сожалею по поводу своего совета...
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33369 / 21495 / 8234
Регистрация: 22.10.2011
Сообщений: 36,893
Записей в блоге: 12
19.02.2016, 15:37
Цитата Сообщение от Alex Dancer Посмотреть сообщение
в последней строке ошибка: Type mismatch in parameter 'format'
C++
1
Label1->Caption = String().sprintf(L"Часов: %d, минут: %d, секунд: %d, мсек: %d",hh,mm,ss,uu);
0
0 / 0 / 0
Регистрация: 22.01.2013
Сообщений: 30
19.02.2016, 16:48  [ТС]
Цитата Сообщение от volvo Посмотреть сообщение
C++
1
Label1->Caption = String().sprintf(L"Часов: %d, минут: %d, секунд: %d, мсек: %d",hh,mm,ss,uu
Спасибо, но уже неактуально. Это я уже нашёл и исправил. Да и в принципе, именно эта строка и не нужна. Код вывода у меня другой.


А вот проблема с выводом времени всё ещё актуальна.

Текущий код выводит нули во всех ячейках.

C++
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
// ------------------- Расчёт времени закачки файла --------------------------
void __fastcall TTrafficCalc_UOI::butCalculateTimeClick(TObject *Sender) {
    if ((editNeedLoad->Text.IsEmpty()) || (editNeedLoad->Text.ToDouble() == 0))
        return;
 
    cbxSelectUnitChange(Sender); // выбор MB или GB
    DownSpd = cbxSelectDownSpeed->Text.ToDouble();  // DownSpd = выбранной скорости инета в Кбит/с
    double load = editNeedLoad->Text.ToDouble();    // load = размеру файла в МБ или ГБ
 
    if (!GB) {
        result = load * 1024 * 8; // общий размер файла в килобитах
    }
    else {
        result = load * 1024 * 1024 * 8;
    }
 
    unsigned short hh, mm, ss, uu;
    double TimeSec = result / DownSpd; // Время в секундах
    TDateTime dt = (double)TimeSec;
    DecodeTime(dt, hh, mm, ss, uu);
 
    // Код вывода времени
    editNeedTimeHour->Text = hh;
    editNeedTimeMins->Text = mm;
    editNeedTimeSecs->Text = ss;
}
Чую, что проблема в строках 19 и 20, но вот как решить её не знаю...
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
19.02.2016, 19:06
Странный вы какой-то. Заучившийся... .
Из секунд часы и минуты можно получить простым делением и по модулю__
C++
1
2
3
4
5
     double doo = 8869; //  секунды
     __int64 se = doo;
     Label1->Caption = se/3600;
     Label2->Caption = se/60 % 60;
     Label3->Caption = se % 60;
0
0 / 0 / 0
Регистрация: 22.01.2013
Сообщений: 30
19.02.2016, 20:17  [ТС]
Цитата Сообщение от nick42 Посмотреть сообщение
Из секунд часы и минуты можно получить простым делением и по модулю__
А с моим кодом это можно как-то сопоставить?

Я в C++ не сильно разбираюсь, т.к. даже не учусь на программиста. Просто по ходу дела пытаюсь что-то понять и усвоить.

Ещё... я тут пытался искать код в других местах. На одном форуме натолкнулся на такой вот код:
C++
1
 Label1->Caption = TDateTime((double)TimeSec / SecsPerDay).FormatString("hh:mm:ss");
Вот только он малость кривой. Как только значение ЧАСЫ (hh) переходит 24-хчасовой рубеж, оно обнуляется.
т.е. если в моём калькуляторе запросить расчёт на 1 GB при скорости 128 Кбит/с, то я получу время 18:12:16 (18 ч. 12 м. 16 с.), что будет верным.
А вот на запрос расчёта 2 GB я получу время 12:24:32 (12 ч. 24 м. 32 с.), что уже будет НЕ верным. т.к. должно быть 36:24:32 (36 ч. 24 м. 32 с.).
Соответственно на 3 GB будет то же самое - вместо 54:36:48 (54 ч. 36 м. 48 с.), я получу 06:36:48 (06 ч. 36 м. 48 с.),
и т.д....

И данный код выводит значение только в один единственный Label, а мне надо получить данные именно раздельно - часы в свою, минуты в свою, и секунды в свою отдельную ячейку.
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
19.02.2016, 22:41
Насколько может быть сложным получить часы, минуты и секунды из кучи секунд? Последние три строки кода nick42 уверенно говорят о том, что сложно настолько же, насколько сложны четыре простых деления. Alex Dancer, может, стоит внимательней присмотреться?
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
19.02.2016, 23:48
Лучший ответ Сообщение было отмечено Alex Dancer как решение

Решение

Цитата Сообщение от Alex Dancer Посмотреть сообщение
мне надо получить данные именно раздельно
Ну, пожалуйста, - применительно к вашему тексту...
C++
1
2
3
4
5
6
     double TimeSec = result / DownSpd;
     __int64 se = TimeSec;
 
     editNeedTimeHour->Text = String().sprintf("%d",(se/3600));
     editNeedTimeMins->Text = String().sprintf("%.2d",((se/60)%60));
     editNeedTimeSecs->Text = String().sprintf("%.2d",(se%60));
1
0 / 0 / 0
Регистрация: 22.01.2013
Сообщений: 30
20.02.2016, 09:11  [ТС]
Цитата Сообщение от nick42 Посмотреть сообщение
C++
1
__int64 se
Прошу прощения, ещё один глупый вопрос. Переменную se где определять?

Прописал в header'е:
C++
1
int se;
А она всё равно не хочет обрабатываться. В логах даёт ошибку: W8004 'se' is assigned a value that is never used
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
20.02.2016, 10:27
А не нужно ее дополнительно объявлять. __int64 это эквивалент int, только длина переменной не 32 бита, а 64 (как у double). И эта запись: __int64 se = ... - это и есть ее объявление и инициализация содержимым TimeSec. Вы попробуйте этот код в работе; потом будете творчески обрабатывать, а то так эта переписка надолго затянется. Не нравится имя se - назовите как-то иначе: SummaSekund например, я не возражаю. Длинно писать не люблю ввиду природной лени.
0
0 / 0 / 0
Регистрация: 22.01.2013
Сообщений: 30
20.02.2016, 10:41  [ТС]
Цитата Сообщение от nick42 Посмотреть сообщение
Вы попробуйте этот код в работе; потом будете творчески обрабатывать
Так в том то и дело, что уже попробовал. И в данном виде код даёт вышеозначенную ошибку.
0
 Аватар для BRcr
4043 / 2333 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
20.02.2016, 11:00
Цитата Сообщение от Alex Dancer Посмотреть сообщение
В логах даёт ошибку: W8004 'se' is assigned a value that is never used
Это не ошибка, а предупреждение. Компиляции не мешает. Код-то удалось заставить работать или нет?
0
0 / 0 / 0
Регистрация: 22.01.2013
Сообщений: 30
20.02.2016, 14:39  [ТС]
Цитата Сообщение от BRcr Посмотреть сообщение
Код-то удалось заставить работать или нет?
Да, удалось. Нашёл в чём была моя ошибка. Я каждый String() присваивал соответствующим переменным, а не выводил сразу. Переписал как было указано и всё заработало.

Теперь вот думаю, делать ли мне "защиту от дурака" ? С подобием автоматического переформатирования значений.

В поле ввода можно ввести 6 символов, с расчётом на дробный ввод. Типа 123,45 MB.
Без "защиты" ничего не мешает ввести туда 999999 MB.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
20.02.2016, 14:39
Помогаю со студенческими работами здесь

Снятие атрибутов с файла через определенный промежуток времени от времени запуска bat файла
Подскажите, может есть идеи как организовать такую задачу? Есть каталог с вложенными каталогами, во вложенных каталогах периодически...

Кнопка загрузки файла и индикатор загрузки в этой же кнопке
Как из двух input &lt;form action=&quot;change_avatar.php&quot; method=&quot;post&quot; enctype=&quot;multipart/form-data&quot;&gt; &lt;input type=&quot;file&quot;...

Вывод времени расчета
Здравствуйте! Подскажите пожалуйста, можно ли как-то вывести время вычисления допустим какое-то математическое действие и в лейбл вывести...

Уменьшение времени расчета формулы массива
Добрый день уважаемые знатоки-программисты! Я тут столкнулся с весьма неприятным сюрпризом и возможно смогу объяснить такое поведение, но,...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru