![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Программа виснет при закачке если меняю фокус на другую [D6, WinXP]
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 13:52:00) [1]
> Сергей М. ©
Понятно.
Я лучше сначала мануалы по Indy порулю, пока вариант с WinInet работает.
Всем спасибо! Тема закрыта!
Сергей М. (2006-09-12 13:39:00) [2]
> Elen © (12.09.06 13:32) [39]
Ну а касаемо контроля хода закачки средствами IdHTTP.Get - вторым параметром укажи своего TFileStream-наследника, у которого перекрыт вирт.метод Write().
Elen (2006-09-12 13:32:00) [3]
> Сергей М. ©
Sorry, верно, Я только потом заметила отсутствие
AssignFile(f, FileName);
Rewrite(f,1);
С которыми был связан BlockRead.
Не обижайтесь. ;-)
Сергей М. (2006-09-12 13:25:00) [4]
> Как оказалось качка идет нормально
Тогда в [30] и [33] ты вешала лапшу)
Elen (2006-09-12 13:22:00) [5]
> umbra ©
Спасибо. Попробую.
Elen (2006-09-12 13:19:00) [6]
> Сергей М. ©
AssignFile(f, FileName);
Rewrite(f,1);
writeln(report, 'Начало цикла');
try
j := 1;
repeat
InternetReadFile(hFile, @Buffer, SizeOf(Buffer), BufferLen);
BlockWrite(f, Buffer, BufferLen);
fSize := fSize + BufferLen;
writeln(report, 'Итерация ' + IntToStr(j));
Inc(j);
Application.Title:=inttostr(i)+'['+IntToStr(j)+'] - '+inttostr(fsize);
until (BufferLen = 0);
writeln(report, 'Конец цикла');
except
on e:exception do writeln(report, 'Исключение ' + e.classname + ' ' + +e.message);
end;
Как оказалось качка идет нормально, но отображение на экране(Application.Title:=inttostr(i)+'['+IntToStr(j)+'] - '+inttostr(fsize);) с момента смены фокуса не обновляется и прога не отвечает. Но стоит ей закончить качку как все отображается коректно и BlockWrite оказался непричем.
Ну значит все в порядке. можно оставлять на ночь.
umbra (2006-09-12 13:18:00) [7]
> Есть ProxyAuthenticate , ProxyPassword, ProxyUsername.
>
если у Вас на прокси используется Basic-аутентификация, то пропишите имя пользователя прокси и его пароль в св-ваProxyUsernameиProxyPasswordсоответственно.
Сергей М. (2006-09-12 13:05:00) [8]
> Но ведь сохраняло скачанное как-то...
Не знаю уж, что у тебя там куда "сохраняло", но со сменой фокуса это никак не связано)
Elen (2006-09-12 13:01:00) [9]
> Сергей М. ©
Так кажись ясно - BlockWrite выдает исключение 103 File not open.
буду его копать. Cпасибо за помощь. (Но ведь сохраняло скачанное как-то...)
> umbra ©
Есть ProxyAuthenticate , ProxyPassword, ProxyUsername.
umbra (2006-09-12 12:46:00) [10]
> но качать не хочет из-за авторизации прокси
а уRequestнет свойств наподобиеProxyAuthorization, ProxyLogin, ProxyPassword?
Сергей М. (2006-09-12 12:23:00) [11]
> Elen © (12.09.06 12:03) [30]
Вот тебе и исключение !)
А ты - "откуда, откуда .."))..
теперь делай так:
writeln(report, 'Начало цикла');
try
j := 1;
repeat
InternetReadFile(hFile, @Buffer, SizeOf(Buffer), BufferLen);
BlockWrite(f, Buffer, BufferLen);
fSize := fSize + BufferLen;
writeln(report, 'Итерация ' + IntToStr(j));
Inc(j);
until (BufferLen = 0);
writeln(report, 'Конец цикла');
except
on e:exception do writeln(report, 'Исключение ' + e.classname + ' ' + e.message);
end;
Что видишь в отчете ?
Elen (2006-09-12 12:03:00) [12]
> Сергей М. ©
Да собсно он короткий :
---Begin on 12.09.2006 10:56:06
Начало цикла
Исключение !
---Begin on 12.09.2006 10:56:08
Начало цикла
Исключение !
список качаемых файлов :
http://podgoretsky.com/ftp/Docs/Delphi/Podgoretsky/bits.doc
http://www.teplocom.msk.ru/doc/klient.pdf
http://podgoretsky.com/ftp/Docs/Internet/IntroIndy/IndyInDepth.pdf
Сергей М. (2006-09-12 11:59:00) [13]
> Elen © (12.09.06 11:57) [28]
Откуда, откуда .. Оттуда !)
Пробуй и приводи сюда достовно текст отчета ..
Elen (2006-09-12 11:57:00) [14]
> Сергей М. ©
ОТКУДА ТУТ ТАКИЕ ИСКЛЮЧЕНИЯ!!!???
Elen (2006-09-12 11:52:00) [15]
> Сергей М. ©
Щас спробую
Elen (2006-09-12 11:49:00) [16]
> Dmitrij_K
Даже старее :
IdHTTP1.Request.ProxyServer:='10.10.3.5';
IdHTTP1.Request.ProxyPort :=8080;
так заработало но качать не хочет из-за авторизации прокси. А через WinInet авторизации не просит
Обновлю ка я себе инди...
Сергей М. (2006-09-12 11:39:00) [17]
> многопоточность чревата чем-то плохим?
А как же !
Ты же к свойствам формы обращаешься в этом методе..
Пробуй так:
writeln(report, 'Начало цикла');
try
j := 1;
repeat
InternetReadFile(hFile, @Buffer, SizeOf(Buffer), BufferLen);
BlockWrite(f, Buffer, BufferLen);
fSize := fSize + BufferLen;
writeln(report, 'Итерация ' + IntToStr(j));
Inc(j);
until (BufferLen = 0);
writeln(report, 'Конец цикла');
except
writeln(report, 'Исключение !');
end;
Что видишь в файле отчета:
Dmitrij_K (2006-09-12 11:30:00) [18]
> 8.0.25
Ух какое старье.
IdHTTP.ProxyPort
IdHTTP.ProxyServer
Elen (2006-09-12 11:21:00) [19]
> Dmitrij_K
8.0.25 (1993-2001)
Dmitrij_K (2006-09-12 11:16:00) [20]
> как версию узнать?
Для инди надо нажать правой кнопкой по компаненту на форме
"About Internet Direct (Indy) ..."