Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.12.2012, 23:57   #1
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,442
Смущение Скорость передачи данных

Доброго времени!

Голова гудит, наткнулся на грабли.
Дико туплю в самых простых задачах, просто дичайше забирает и полностью

Как правильно изменять скорость отдачи/приема данных и оставшееся время?


Есть дистанция - размер файла, размер уже переданных/принятых байт
Есть время - Фиксируется старт

Скорость - это дистанция div время, результат - размер в байтах(БИТАХ?).
Оставшееся время - это разность между (размером файла и объемом принятых данных) умноженное на скорость, результат - милисекунды.

Вроде правильно, но нет. Не едут лыжи. Скорость передачи почему-то зашкаливает за 180 МБ/сек.

Код:
{
iData - размер текущего, принятого пакета данных
fWork_WorkSizeCurrent - всего принято
fWork_WorkSizeBegin - размер файла
fWork_TimeStart - время старта
fWork_TimeCurrent - разница времени для текущего пакета данных

}
  // Distance
  fWork_WorkSizeCurrent := fWork_WorkSizeCurrent + iData;

  // Time
  fWork_TimeCurrent := GetTickCount - fWork_TimeStart;

  // Speed
  if not(fWork_TimeCurrent <= 0) then
    fWork_SpeedCurrent := fWork_WorkSizeCurrent div fWork_TimeCurrent;

  // Time left: (TotalDistance-CurrentDistance)*Curent speed
  fWork_TimeLeft := (fWork_WorkSizeBegin - fWork_WorkSizeCurrent) *
    fWork_SpeedCurrent;

end;
Код переворота байтов в размерности:
Код:
function TMainForm.Size2Str(const aInt: Int64;
  const IsSpeed: Boolean = False): string;
const
  cKByte = 1024; // 1 Kilobyte = 1024 bytes
  cMByte = 1024 * cKByte; // 1 Megabyte = 1024 kilobytes
  cGByte = 1024 * cMByte; // 1 Gigabyte = 1024 megabytes
var
  Int: Int64;

  s: string;
begin
  //Crazy style
  FormatSettings.DecimalSeparator:='.';
  Int := aInt;
  if Int >= cGByte then
  begin
    s := Format(' %s GB', [FloatToStrF(Int / cGByte, ffFixed, 4, 2)]);
    if IsSpeed then
      s := Format(' %s GB/s', [FloatToStrF(Int / cGByte, ffFixed, 4, 2)]);
    result := s;
    Exit;
  end;

  if (Int >= cMByte) and (Int < cGByte) then
  begin
    s := Format(' %s MB', [FloatToStrF(Int / cMByte, ffFixed, 4, 2)]);
    if IsSpeed then
      s := Format(' %s MB/s', [FloatToStrF(Int / cMByte, ffFixed, 4, 2)]);
    result := s;
    Exit;
  end;

  if (Int >= cKByte) and (Int < cMByte) then
  begin
    s := Format(' %s KB', [FloatToStrF(Int / cKByte, ffFixed, 4, 2)]);
    if IsSpeed then
      s := Format(' %s KB/s', [FloatToStrF(Int / cKByte, ffFixed, 4, 2)]);
    result := s;
  end
  else
  begin
    s := Format(' %d.0 b', [Int]);
    if IsSpeed then
      s := Format('%d.0 b/s', [Int]);
    result := s;
  end;
  FormatSettings.DecimalSeparator:=',';
end;
Собственно прошу помощи....
Человек_Борща вне форума Ответить с цитированием
Старый 23.12.2012, 00:10   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

fWork_TimeCurrent := GetTickCount - fWork_TimeStart в милисекундах, в секунды где-то есть перевод?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 23.12.2012, 00:25   #3
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,442
По умолчанию

Во время милисекунды переводятся в последствии, сейчас это результат работы метода класса.

Скорость оно не верно измеряет.. или измеряет но в последствии что-то не так?
Человек_Борща вне форума Ответить с цитированием
Старый 23.12.2012, 13:21   #4
kangreon
Форумчанин
 
Аватар для kangreon
 
Регистрация: 03.04.2009
Сообщений: 305
По умолчанию

В вашем коде измеряется средняя скорость, с которой происходит получение данных. т.к. происходит деление всего полученного на весь промежуток времени. Более точная скорость получится если рассчитывать время, за которое происходит получение одного пакета. Со вторым способом у меня никогда не возникало проблем.
kangreon вне форума Ответить с цитированием
Старый 23.12.2012, 18:51   #5
fucil
Форумчанин
 
Регистрация: 24.02.2010
Сообщений: 148
По умолчанию

Так просто компакнее может кому нужно !
Код:
function BitsToString(Value : DWord) : string;
const
 OneKB=1024;
 OneMB=OneKB*1024;
 OneGB=OneMB*1024;
begin
 if Value<OneKB
 then Result:=FormatFloat('#,##0.00 байт',Value)
 else
  if Value<OneMB
  then Result:=FormatFloat('#,##0.00 Кбайт', Value/OneKB)
  else
   if Value<OneGB
   then Result:=FormatFloat('#,##0.00 Мбайт', Value/OneMB)
end;

lbl2.Caption :=BitsToString(Sockets.Files.ReceiveSize);

Последний раз редактировалось fucil; 23.12.2012 в 18:55.
fucil вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Delphi7:TServerSocket - скорость передачи Air Помощь студентам 6 29.12.2012 23:04
Как узнать скорость передачи данных (при копировании файлов) по сети calypso Работа с сетью в Delphi 0 02.12.2012 19:56
Органичить скорость передачи Denager Работа с сетью в Delphi 22 05.03.2008 09:08
Скорость передачи приема Лубышев Работа с сетью в Delphi 1 05.02.2008 10:14