Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Программа виснет при закачке если меняю фокус на другую [D6, WinXP]


Страницы:   1 2 3

Elen ©   (2006-09-12 09:27:00) 

Доброго времени суток господа!

Мне нужно было на скорую руку написать простейшую программу
для закачки файлов из инета.
Порывшись на форуме нахожу два способа:

1. Indy

procedure tform1.GetFile(URL, fullfilename: string);
var
str: TFileStream;
begin
try
 str := TFileStream.Create(fullfilename,fmCreate);
 IdHTTP1.Get(URL, str);
finally
 str.Free;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
IdHTTP1.Host :='21.13.4.234'; // это адрес прокси
IdHTTP1.Port :=8080;

IdHTTP1.Connect;

 GetFile(' http://podgoretsky.com/ftp/Docs/Delphi/Podgoretsky/bits.doc', 'd:\_____.doc');
IdHTTP1.Disconnect;
end;


Этот способ в idhttp.pas выдает ошибку
403 forbidden (The ISA server denied the specified Uniform Recource Locator)
Поскольку времени нет и есть другой способ разбор этой ошибки я оставляю на будущее
но буду благодарна если обьясните.

2. WinInet


//********* PROCEDURE**********
procedure tform1.dload;
//const
Var i:byte;FileName, FileURL:string; Report:textfile;
begin
if not DirectoryExists(appdir+'dload') then aMakeDir(appdir+'dload');
AssignFile(report,appdir+'dload\report.txt');
rewrite(report);
//**************************************************************************
for i:=0 to ListBox1.Count-1 do begin
ListBox1.ItemIndex:=i;
FileURL:=ListBox1.Items[i];
FileName:= appdir+'dload\'+copyas(ListBox1.Items[i],'/',-1);
writeln(report,padr('---Begin on ',' ',15)+datetimetostr(now));
hSession := InternetOpen({'STEROID Download}'Microsoft Internet Explorer',
               INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
if Assigned(hSession) then begin
  hFile := InternetOpenURL(hSession, PChar(FileURL), nil, 0,
      INTERNET_FLAG_RELOAD, 0);
  if Assigned(hFile) then begin
     AssignFile(f, FileName);
     Rewrite(f,1);
     fSize := 0;  
     repeat
        InternetReadFile(hFile, @Buffer, SizeOf(Buffer), BufferLen);
        BlockWrite(f, Buffer, BufferLen);
        fSize := fSize + BufferLen;
        caption:=inttostr(i)+' - '+inttostr(fsize);
     until (BufferLen = 0);
     CloseFile(f);
     writeln(report,filefrompath(filename)+' (',fsize,')');
     writeln(report,padr('---Ending on ',' ',15)+datetimetostr(now));writeln(report);
     InternetCloseHandle(hFile);
  end;
  InternetCloseHandle(hSession);
end;

   //**************************************************************************
end;
ListBox1.Items.Clear;
end;
//********* END PROCEDURE*******


Этот способ мне нравится больше так как контроль за закачкой глубже.
И он как раз сработал с первого раза.

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

С чем это может быть связано?


Я не знаю в какую ветку лучше писать, пишу сюда т.к. все таки связано с сетью,
но не обижусь если модератор перенесет этот вопрос в начинающие.


Elen   (2006-09-12 11:15:00) [21]


> umbra ©

Понятно. Учту.


umbra   (2006-09-12 11:14:00) [22]


>  Но этот способ не дает AV - предположим я качаю только
> один
>  файл

Поскольку локальные переменные не инициализируются, то AV может случиться, если исключение произойдет при вызове TFileStream.Create, из-за неизбежного вызова Free


Elen   (2006-09-12 11:10:00) [23]


> Dmitrij_K

Internet Direct for D6 Property and Comonent Editors?
или как версию узнать?


Dmitrij_K   (2006-09-12 11:07:00) [24]

Какая версия Indy?


Elen   (2006-09-12 11:05:00) [25]


> IdHTTP1.ProxyParams.ProxyServer

Что за прикол - там нет таких свойств!? (Я что сегодня еще не проснулась?)


Dmitrij_K   (2006-09-12 10:59:00) [26]


> Но этот способ не дает AV - предположим я качаю только один
> файл.

Когда-нибудь даст.


Dmitrij_K   (2006-09-12 10:58:00) [27]

Ето еще смешнее. Читать надо для чего какие параметры нужны
procedure TForm1.Button1Click(Sender: TObject);
begin
IdHTTP1.Host :='21.13.4.234'; // это адрес прокси
IdHTTP1.Port :=8080;

IdHTTP1.Connect;

GetFile(' http://podgoretsky.com/ftp/Docs/Delphi/Podgoretsky/bits.doc', 'd:\_____.doc');
IdHTTP1.Disconnect;
end;


Надо так
 
 IdHTTP1.ProxyParams.ProxyServer := '21.13.4.234';
 IdHTTP1.ProxyParams.ProxyPort   := 8080;
 GetFile(' http://podgoretsky.com/ftp/Docs/Delphi/Podgoretsky/bits.doc', 'd:\_____.doc');


Elen   (2006-09-12 10:57:00) [28]


> Dmitrij_K

Понятно. Учту. Но этот способ не дает AV - предположим я качаю только один файл. Ошибка другая.


Elen   (2006-09-12 10:55:00) [29]


> Сергей М.

InternetReadFile вызывается столько раз сколько ей нужно, пока не вернет пустой буффер. И все эти разы возвращает True, пока я не сменю фокус
Dload в основном потоке и вызывается по нажатию на кнопку. А что многопоточность чревата чем-то плохим?


Сергей М.   (2006-09-12 10:53:00) [30]


> Dmitrij_K   (12.09.06 10:50) [10]


А, пардон ...
Я не обратил внимания, что конструирование стрима внесено в try-блок


Сергей М.   (2006-09-12 10:51:00) [31]


> Dmitrij_K   (12.09.06 10:50) [10]


Ерунду ты городишь


Dmitrij_K   (2006-09-12 10:50:00) [32]

Кстати
procedure tform1.GetFile(URL, fullfilename: string);
var
str: TFileStream;
begin
str:=nil;// без этого можно получить AV
try
str := TFileStream.Create(fullfilename,fmCreate);
IdHTTP1.Get(URL, str);
finally
str.Free;
end;
end;


Сергей М.   (2006-09-12 10:49:00) [33]


> проверила. InternetReadFile возвращает TRUE


А с чего ты взяла, что InternetReadFile будет вызвана всего 1 раз ?

И, я надеюсь, метод dload у тебя вызывается в основномтреде ?


Elen   (2006-09-12 10:48:00) [34]


> Dmitrij_K

Не очень :-/


Dmitrij_K   (2006-09-12 10:45:00) [35]


>  InternetReadFile возвращает TRUE. И все равно висячок.

Смешно


Elen   (2006-09-12 10:39:00) [36]


> Сергей М. ©

Я проверила. InternetReadFile возвращает TRUE. И все равно висячок.


Сергей М.   (2006-09-12 10:22:00) [37]


> Elen ©   (12.09.06 10:19) [4]


Что так сразу ?)

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


Elen   (2006-09-12 10:19:00) [38]


> Сергей М. ©

Спасибо. Буду разбираться с Indy.


Сергей М.   (2006-09-12 10:01:00) [39]


> Какие там могут быть исключения?


Да мало ли какие ..

Ты вот даже результат вызова InternetReadFile() игнорируешь, о какой корректности работы программы можно после этого говорить ?


> могу контролировать каждый блок загрузки


Это возможно и при использовании TIdHTTP.


> прервать сейчас и докачать потом


Ой ли ?
Далеко не всякий сервер поддерживает возможность докачки.


Elen   (2006-09-12 09:53:00) [40]


> Сергей М. ©

Какие там могут быть исключения? ошибки не выдает. Как их отловить?


> Чем же он "глубже" ?


Я могу контролировать каждый блок загрузки, прервать сейчас и докачать потом


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо