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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.04.2010, 08:57   #1
Son
Пользователь
 
Аватар для Son
 
Регистрация: 24.11.2008
Сообщений: 76
По умолчанию WinInet зависания и проблемы в работе

Пишу программу для загрузок файлов с сайта. Загрузку запускаю отдельным потоком. Вот функция загрузки:
Цитата:
function TDWL_Thead.LoadURL(stURL:string;FNa me:string):byte;
var hInet, hConnect, hRequest:HINTERNET;
itog,Q:boolean;
F:TFileStream;
Buf:array [0..8192] of Byte;
procedure MessageUnLoad;
begin
if hRequest<>nil then hRequest:=nil;
if hConnect<>nil then hConnect:=nil;
if hInet<>nil then hInet:=nil;
end;

begin
//создаем сессию
Result:=0;
hInet:=InternetOpen('IExplorer',INT ERNET_OPEN_TYPE_PRECONFIG,nil,nil,0 );
if hInet=nil then
begin
MessageUnLoad;
Result:=1; //Не удалось создать сессию!
exit;
end;
//создаем соеденение
hConnect:=InternetConnect(hInet,'ww w.atsenergo.ru',INTERNET_DEFAULT_HT TPS_PORT,nil,nil,INTERNET_SERVICE_H TTP,INTERNET_FLAG_SECURE,0);
if hConnect=nil then
begin
MessageUnLoad;
Result:=2; //Не удалось создать соеденение!
exit;
end;

//открываем запрос
hRequest:=HttpOpenRequest(hConnect, 'GET',PChar(stURL),HTTP_VERSION,nil ,nil,INTERNET_FLAG_SECURE,0);
if hConnect=nil then
begin
MessageUnLoad;
Result:=3; //Не удалось открыть запрос!
exit;
end;

//посылаем запрос
itog:=HttpSendRequest(hRequest,nil, 0,nil,0);
if not itog then
begin
MessageUnLoad;
result:=4; //Запрос не удался!
exit;
end;
//открываем файл
if (FName='nil') or (FName='') then
begin
MessageUnLoad;
Result:=5; //Файл не указан!
exit;
end;
F := TFileStream.Create(FName, fmCreate);
Rload := 0;

try
repeat
Q := InternetReadFile(hRequest, @Buf, 8192, RLoad);
F.Write(Buf, RLoad);
SumLoad:=SumLoad+RLoad;
if RLoad<>0 then
begin
STSinh:=st_FLoadARB;
Synchronize(Sinh);
end;
until Q and (RLoad = 0)
except
MessageUnLoad;
Result:=6; //ошибка при загрузке данных
exit;
//Fail := TRUE;
end;
InternetCloseHandle(hRequest);
InternetCloseHandle(hConnect);
InternetCloseHandle(hInet);
F.Free;
end;
Сайт работает по https с сертификатом.
На работе с медленным нетом все работает при выключенном фаерволе.
При включенном все виснет на стадии получения данных:
Цитата:
itog:=HttpSendRequest(hRequest,nil, 0,nil,0);
Дома при инете с хорошей скоростью часть файлов не загружется (грузит 0 байт), поток повторно не запускается.
Подскажите пожалуйста куда копать. А то ума не приложу где искать.
Лучше сдохнуть, чем жить с иглой в яйце (Кащей Бессмертный)
Son вне форума Ответить с цитированием
Старый 23.04.2010, 09:07   #2
XerSon
Форумчанин
 
Аватар для XerSon
 
Регистрация: 21.01.2008
Сообщений: 211
По умолчанию

Зачем тут пробел?
ww_w.atsenergo.ru
XerSon вне форума Ответить с цитированием
Старый 23.04.2010, 09:21   #3
Son
Пользователь
 
Аватар для Son
 
Регистрация: 24.11.2008
Сообщений: 76
По умолчанию

Цитата:
Сообщение от XerSon Посмотреть сообщение
Зачем тут пробел?
ww_w.atsenergo.ru
В исходнике нет пробела. Видимо ошибся при копировании.
Лучше сдохнуть, чем жить с иглой в яйце (Кащей Бессмертный)
Son вне форума Ответить с цитированием
Старый 23.04.2010, 11:13   #4
Son
Пользователь
 
Аватар для Son
 
Регистрация: 24.11.2008
Сообщений: 76
По умолчанию

Сделал. Вот рабочий код:
Цитата:
function TDWL_Thead.LoadURL(stURL:string;FNa me:string):byte;
const
BufferSize = 8192;
var
hSession, hURL: HInternet;
Buffer: array[1..BufferSize] of Byte;
F:TFileStream;
Q:boolean;

procedure MessageUnLoad;
begin
if hSession<>nil then hSession:=nil;
if hURL<>nil then hURL:=nil;
end;

begin
Result:=0;
hSession := InternetOpen('IExplorer',INTERNET_O PEN_TYPE_PRECONFIG , nil, nil, 0);
if hSession=nil then
begin
MessageUnLoad;
Result:=1; //Не удалось создать сессию!
exit;
end;
hURL := InternetOpenURL(hSession, PChar(stURL), nil, 0, INTERNET_FLAG_RELOAD, 0);// INTERNET_FLAG_RELOAD - что бы не грузил из кеша
if hURL=nil then
begin
MessageUnLoad;
Result:=3; //Не удалось создать сессию!
exit;
end;
//открываем файл
if (FName='nil') or (FName='') then
begin
MessageUnLoad;
Result:=5; //Файл не указан!
exit;
end;
F := TFileStream.Create(FName, fmCreate);
Rload := 0;
try
repeat
Q := InternetReadFile(hURL, @Buffer, 8192, RLoad);
F.Write(Buffer, RLoad);
SumLoad:=SumLoad+RLoad;
if RLoad<>0 then
begin
STSinh:=st_FLoadARB;
Synchronize(Sinh);
end;
until Q and (RLoad = 0)
except
MessageUnLoad;
Result:=6; //ошибка при загрузке данных
exit;
//Fail := TRUE;
end;
InternetCloseHandle(hSession);
InternetCloseHandle(hURL);
F.Free;
//

end;
Код промежуточный. Еще добавлю код на проверку возвращаемых ошибок.
Лучше сдохнуть, чем жить с иглой в яйце (Кащей Бессмертный)
Son вне форума Ответить с цитированием
Старый 23.04.2010, 11:29   #5
Son
Пользователь
 
Аватар для Son
 
Регистрация: 24.11.2008
Сообщений: 76
По умолчанию

Блин. Та же ерунда.
Лучше сдохнуть, чем жить с иглой в яйце (Кащей Бессмертный)
Son вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Зависания в связи с перегревом компьютера Frol Компьютерное железо 4 09.04.2010 03:05
Периодические зависания компьютера. Revival001 Компьютерное железо 7 25.03.2010 09:46
Проблемы в работе со временем -BlindGuardian- Общие вопросы Delphi 3 10.01.2010 11:25
Избавить программу от зависания RIO Общие вопросы Delphi 7 09.09.2009 20:30