Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2006.02.26;
Скачать: [xml.tar.bz2];

Вниз

Интернет. Процесс передачи данных.   Найти похожие ветки 

 
XRed ©   (2005-11-14 23:25) [0]

Уважаемые любители своего дела!!!
Появилась маленькая проблема.
Необходимо чтобы при скачивание файла по HTTP в ProgressBar - е показывался процесс скачивания.
Я нашел код

while (ReadLen <> 0) and (stop = false) do
begin
//читаем в буфер
InternetReadFile(hURL, @fBuf, SizeOf(fBuf), ReadLen);
//смотрим ск-ко осталось докачать
InternetQueryDataAvailable(hURL, fSize, 0, 0);
ProgressBar1.Position := ProgressBar1.Max - fSize;
BlockWrite(f, fBuf, ReadLen); //<-пишем в файл
Application.ProcessMessages;
end;

но что-то он не работает как этого хотелось бы.
fSize - сколько осталось докачать.
У меня получается, что во время скачивания ProgresBar не заполняется равномерно, а скачет. То целиком заполнится, то вообще пустой.
Я вроде все перерыл не могу больше других примеров найти. Может можно через function HttpQueryInfo , пробал тоже бред какойто возвращает. Может это связанно с настройками интернета моего.
А еще по поводу подвисания формы во время открытия URL. Все пишут используй Application.ProcessMessages, но в функцию я же ее не вставлю  т.е. сама функция глючит  или это возможно как-то?
Помогите пожалуйста!!!

Один мозг хорошо. а много лучше!!!


 
Digitman ©   (2005-11-15 09:26) [1]

http://forum.sources.ru/index.php?s=cb2010641b907c31c86d9420a337759a&showtopic=55534


 
denissoft ©   (2005-11-15 22:31) [2]

Использую вот такой код, вроде все нормально работает. Скачивание с докачкой…


procedure DownloadFile(URL,Filename:string);
type
HINTERNET = Pointer;
PHINTERNET = ^HINTERNET;

var hInet, //<-переменная сод. указатель на сессию
     hURL:HINTERNET; //<-указатель на URL
     fSize, //<-размер файла
     ReadLen, //<-количество реально прочитанных байт
     RestartPos:DWORD;//<-|позиция с которой начинается
                      // |докачка
     fBuf:array[1..1024]of byte;//<-буфер куда качаем
     f:file; //<-файл куда качаем
     Header:string;//<-|дополнительная переменная в HTTP
                 // |заголовок
 begin
 try
  RestartPos:=0; //<- |инициализация
  fSize:=0; //<- |переменных

  //Если на винте есть файл то считаем, что нужно докачивать
  if FileExists(Filename) then
                              begin
                               AssignFile(f,Filename);
                               Reset(f,1);
                               RestartPos:=FileSize(F);
                               application.ProcessMessages;
                               Seek(F, FileSize(F));
                              end else
                              begin
                               //иначе с начала
                               AssignFile(f,Filename);
                               application.ProcessMessages;
                               ReWrite(f,1);
                              end;
  //открываем сессию
  hInet := InternetOpen("Mozilla",
                        PRE_CONFIG_INTERNET_ACCESS,
                        nil,
                        nil,
                        0);
  //Пишем дополнительную строку для заголовка
  Header:="Accept: */*";
  //открываем URL
  hURL := InternetOpenURL(hInet,
                          PChar(URL),
                          pchar(Header),
                          StrLen(pchar(Header)),
                          0,
                          0);
  //устанавливаем позицию в файле для докачки
  if RestartPos>0 then InternetSetFilePointer(hURL,
                                              RestartPos,
                                              nil,
                                              0,
                                              0);
  //смотрим ск-ко надо скачать
  InternetQueryDataAvailable(hURL, fSize,0,0);
  if RestartPos>0 then
                  begin
                   form1.ProgressBar1.MinValue:=0;
                   form1.ProgressBar1.MaxValue:=fSize+RestartPos;
                   form1.ProgressBar1.Progress:=RestartPos;
                   application.ProcessMessages;
                  end else
                  begin
                   form1.ProgressBar1.MinValue:=0;
                   form1.ProgressBar1.MaxValue:=fSize+RestartPos;
                  end;
  //качаем до тех пор пока реально прочитаное число байт не
  //будет равно нулю или не стор
  while (ReadLen<>0) and (stop=false) do
   begin
    //читаем в буфер
    try
    application.ProcessMessages;
    InternetReadFile(hURL, @fBuf, SizeOf(fBuf), ReadLen);
    //смотрим ск-ко осталось докачать
    InternetQueryDataAvailable(hURL, fSize,0,0);
    form1.ProgressBar1.Progress:=form1.ProgressBar1.maxValue-fSize;
    BlockWrite(f, fBuf, ReadLen);//<-пишем в файл

    finally
    Application.ProcessMessages;
    end;
   end;
  stop:=false;
  application.ProcessMessages;
  InternetCloseHandle(hURL); //<-|закрываем
  InternetCloseHandle(hInet);//<-|сесcии
  CloseFile(f); //<-|и файл
  finally
  end;
 end;


 
XRed ©   (2005-11-16 00:32) [3]

Спасибо за ответ!!!
Я сделал, но получается тоже самое. PorgressBar скачет, то есть то нет, т.е. заполняется не равномерно как должен, а бред какой-то.
form1.ProgressBar1.MinValue:=0;
form1.ProgressBar1.MaxValue:=fSize+RestartPos;
form1.ProgressBar1.Progress:=RestartPos
И не понятно Progress это Position что-ли?
Или я туплю!!! Я всю фигню пробую(скачку) URL:= http://www.mp3real.ru/mp3/chig_i_so/perekrestok/sen_similya/03_perekrestok_sen_similya.mp3
Может там сервак тупит, не те значения выдает?
Если не трудно попробуете!!!



Страницы: 1 вся ветка

Форум: "Сети";
Текущий архив: 2006.02.26;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 3.031 c
6-1131478560
Opilki_Inside
2005-11-08 22:36
2006.02.26
WebBrowser и Temporary files


15-1139047973
DSKalugin
2006-02-04 13:12
2006.02.26
Наш FAQ не работает?


15-1139056425
Alex_Korn
2006-02-04 15:33
2006.02.26
Самопроизвольное включение компьютера.


4-1133374095
dimka_sh
2005-11-30 21:08
2006.02.26
Окно на несколько секунд


1-1138173909
scolopax
2006-01-25 10:25
2006.02.26
Отображение хода работы алгоритма





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский