Главная страница
    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.46 MB
Время: 0.01 c
3-76316
sergey32
2003-03-05 11:50
2003.03.24
Проблемма с dbExpress


3-76294
zubov
2003-03-04 18:44
2003.03.24
Создание db-полей в рантайме


1-76403
Navigator3000
2003-03-13 13:52
2003.03.24
Компиляция? (Новичок)


1-76449
Shirson
2003-03-06 07:46
2003.03.24
Clipboard -> MS SQL


14-76640
Наташа Керенцева
2003-03-07 20: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
Английский Французский Немецкий Итальянский Португальский Русский Испанский