Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2003.03.24;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.45 MB
Время: 0.007 c
1-76425
Mike2003
2003-03-11 12:40
2003.03.24
TCanvas или TImage


3-76323
sergey32
2003-03-05 15:01
2003.03.24
Не могу передать числовой параметр в хранимую процедуру.


7-76710
OxOTHuK
2003-01-12 12:00
2003.03.24
Реестр


6-76564
Serge_T
2003-02-01 23:57
2003.03.24
WinSock


3-76270
altarasjuk
2003-03-06 23:25
2003.03.24
Как получить список таблиц в базе.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский