Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.03.24;
Скачать: CL | DM;

Вниз

как принудительно завершить   Найти похожие ветки 

 
w666w   (2003-02-03 14:30) [0]

Проблема в следующем:
Несколько потоков параллельно устанавливают соединение с разными web-ресурсами.
Метод execute примитивен:

procedure TMyThread.Execute;
begin
FHTTP := TIdHTTP.Create(nil);
try
FHTTP.Get("URL");
except
// если ошибка
end;
FHTTP.Free;
end;

URL передается в каждый поток свой, в зависимости от алгоритма. Необходимо выполнять такие соединения в огромных количествах. Но тут появляется трабл - некоторые адреса "подвешивают" поток. Возможно я ошибаюсь, но после долгих часов анализа пришел в выводу - некоторые IP отвечают на запрос, устанавливают TCP/IP соединение, но ничего по нему не передают. Таким образом, timeout"а не происходит и TIdHTTP считает, что все нормально и бесконечно ждет каких-либо данных. Естественно, что свойство Terminated не проверяется до тех пор, пока соединение не разорвется и убить поток простым Terminate невозможно.

Как выйти из ситуации?

Есть соображения:
1. Если каким-либо образом возможно передать в поток Message (подобно тому, как он передается главной форме), то обрабатывать его внутри потока и самоуничтожаться с сигналом об ошибке. Подскажите, возможна ли передача сообщения в поток, как его ловить, и как лучше в этом случае прерывать соединение.

2. Перед началом соединения каждый поток фиксирует время начала, а какой-либо контролирующий поток в цикле проверяет, не превысило ли это время максимально разрешенное. Если превысило, уничтожить поток через TerminateThread() (либо опять таки, послать ему мессагу).

Кто сталкивался, помогите нейти оптимальное решение...


 
Zelius ©   (2003-02-03 14:42) [1]

ТО есть, ты хочешь сказать, что установка FHTTP.ReadTimeout := xxx после Create(...) не помогает???


 
Smithson ©   (2003-02-03 14:44) [2]

Видел я такие грабли. Сделай создание объекта FHTTP := TIdHTTP.Create(nil); заключенным в какую-нибудь критическую секцию. У меня без этого глючило.
А убить поток - из другого потока TerminateThread


 
w666w   (2003-02-03 15:08) [3]

Спасибо, CS помогло...


 
Zelius ©   (2003-02-03 16:08) [4]

А какая у вас версия Indy???


 
Smithson ©   (2003-02-03 16:13) [5]

Глюки были в версии для D5. В версии для D7 я уже не пробывал "глючный" вариант.



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

Текущий архив: 2003.03.24;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.019 c
14-76663
Neox
2003-03-08 22:46
2003.03.24
вопрос к пользователям TheBat!


3-76285
-=Sergeante=-
2003-03-04 11:32
2003.03.24
Interbase + диалап


4-76731
boa
2003-01-27 07:46
2003.03.24
Подскажите, кто знает?


14-76659
multik
2003-03-08 18:02
2003.03.24
Привет всем!!! Нужен компонент, который знает ссылки.


3-76302
romychk
2003-03-04 16:32
2003.03.24
Как подключиться ид Д5 к MySQL под FreeBSD