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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.02.2011, 18:00   #1
palm
 
Регистрация: 10.02.2011
Сообщений: 6
По умолчанию Повторное соединение (Indy)

Здравствуйте. Парни сильно не пинайте за код я не программист.
Indy 10.5.7
Цитата:
while i< ListBox1.Count do
Begin
flag:=false;
auto:=false;
while not auto do
begin
... // тут простая обработка переменных роли не играет
while not flag do begin

try
try
Http := TidHTTP.Create(Self);

http.ProxyParams.BasicAuthenticatio n:=true;
http.ProxyParams.ProxyServer:='prox y.ru';
http.ProxyParams.ProxyPort:=3128;
http.ProxyParams.ProxyUsername:='ad min';
http.ProxyParams.ProxyPassword:='ad min';
M := TMemoryStream.Create;
Data := TStringList.Create;
CM := TidCookieManager.Create(Http);
Http.AllowCookies := true;
Http.CookieManager := CM;
Http.HandleRedirects := true;
Http.Request.Host:='ya.ru';
Http.Request.UserAgent:='Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10';
Http.Request.Accept:='text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8';
Http.Request.AcceptLanguage:='ru,en-us;q=0.7,en;q=0.3';
Http.Request.AcceptCharSet:='window s-1251,utf-8;q=0.7,*;q=0.7';
Http.Request.Referer:='http://ya.ru/';
Data.Add('login=' + mail_login);
Data.Add('domain=ya.ru');
Data.Add('password=' + mail_password);
Data.Add('page=http://ya.ru/');

Http.Post('http://ya.ru/cgi-bin/auth', Data, M);
Http.Get('http://ya.ru/', M);
strpage := StreamToText(M);
except
flag:=false;
end;
finally
Data.Free;
M.Clear;
FreeAndNil(M);
flag:=true;
// http.Free; не освобождаем так как еще потребуется ниже
end;
end;
// проверяем прошли или нет авторизацию
if Pos('http://ya.ru/'+mail_login+'/',StrPage) <> 0 then
auto:=true
else
listbox1.Items.Delete(i);
end;
...
В listbox1 хранятся адреса почты с паролями. Задача такая -берем по порядку адрес почты и пароль, проходим авторизацию и дальше отправляем принимаем обрабатываем данные так как нам нужно.
Все в принципе делается правильно-авторизировались, послали, приняли нужные нам данные, ниже по программе, записываем данные в listbox2, перешли на новый e-mail и все повторяется пока не закончился список.
Допустим у нас в списке 100 строк с e-mail. Но почему-то необрабатывается весь список. Скажем 10 или 20 e-mail обработалось в listbox2 нужное нам записалось и все.
Пишет list index out of bounds (ну и строку на которой все закончилось)
Думаю или прокси или сайт скажем так посылает меня.
Я сделал конструкцию try except и прописывал в нем flag специально чтобы при исключительных ситуациях (таких как пропажа связи) снова пытаться отправить или принять запрос к(от)) сервера. Но не очень то и помогает.

Я может быть сумбурно все описал. Но главный вопрос (помимо того где у меня может быть ошибка) вот в чем: Как при работе с сетью и использую Indy повторно посылать данные на сервер. Если он отверг запрос или разорвал связь, повторять запросы пока он не ответит (пусть час два он молчит но главное попытки связатся с ним выполнялись чтобы).
Будут благодарен если кто-нибудь знающий приведет пример.

Вроде бы нашел причину, пока тестирую.
Убрал блок try finally. Все что было в нем вставил после strpage := StreamToText(M); получилось так:
Http.Get('http://ya.ru/', M);
strpage := StreamToText(M);
Data.Free;
M.Clear;
FreeAndNil(M);
flag:=true;
except
flag:=false;
end;

добавил еще connectiontimeout=10 сек и если ловлю исключение то как и выше flag=false и пытаюсь снова соедин-я и выполнять прием передачу запросов.

Вот еще пару вопросов возникло. Если я скажем отключу интернет сработает блок try except и программа будет пытаться отправлять и принимать запросы повторно. В это время Форма как бы зависает. Можно как то этого как-то избежать, а то может показаться что программа тупо зависла.
И второй вопрос как корректно закрыть программу когда она работает. Если жму на крестик закрытия программы ничего не происходит-обработка как шла так и идет.

Последний раз редактировалось palm; 21.02.2011 в 20:26.
palm вне форума Ответить с цитированием
Старый 22.02.2011, 14:23   #2
AndreyK
Подтвердите свой е-майл
 
Регистрация: 05.04.2010
Сообщений: 76
По умолчанию

По воду обработки email адресов помочь не могу...попробуй поработь с отладчиком может и найдёшь ошибку. А на счёт того чтобы программа не зависала нужно использовать потоковые объекты (TThread object). Для того чтобы закрыть корректно программу нужно использовать Application.Terminate;
AndreyK вне форума Ответить с цитированием
Старый 22.02.2011, 16:05   #3
palm
 
Регистрация: 10.02.2011
Сообщений: 6
По умолчанию

Цитата:
Сообщение от AndreyK Посмотреть сообщение
По воду обработки email адресов помочь не могу...попробуй поработь с отладчиком может и найдёшь ошибку. А на счёт того чтобы программа не зависала нужно использовать потоковые объекты (TThread object). Для того чтобы закрыть корректно программу нужно использовать Application.Terminate;
Здравствуйте.
По поводу потоков я вкурсе, но пока для меня это тяжко в них разобраться )
По поводу закрытия программы:
Вот жму я на крестик закрытия программы, какое событие мне надо обработать, куда включать Application.Terminate, чтобы все действия в программе остановились и она корректно и без выдачи ошибки закрылась?
palm вне форума Ответить с цитированием
Старый 23.02.2011, 15:49   #4
kangreon
Форумчанин
 
Аватар для kangreon
 
Регистрация: 03.04.2009
Сообщений: 305
По умолчанию

Здравствуйте. Если не хотите работать с потоками, то попробуйте кинуть на форму IdAntiFreeze.

Цитата:
Вот жму я на крестик закрытия программы, какое событие
OnClose
kangreon вне форума Ответить с цитированием
Старый 24.02.2011, 21:06   #5
palm
 
Регистрация: 10.02.2011
Сообщений: 6
По умолчанию

Цитата:
Сообщение от kangreon Посмотреть сообщение
Здравствуйте. Если не хотите работать с потоками, то попробуйте кинуть на форму IdAntiFreeze.


OnClose
Здравствуйте антифриз стоит, по поводу onclose попробую.
palm вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
программно разорвать соединение на сервере Indy мандарин Работа с сетью в Delphi 3 19.04.2015 02:18
Повторное нажатие Enter _-Re@l-_ Общие вопросы Delphi 10 28.01.2011 23:48
повторное воспроизведение wav romlo Мультимедиа в Delphi 4 03.01.2011 04:02
Indy соединение и Виртуальная сеть Deman005 Работа с сетью в Delphi 19 15.04.2010 21:43