![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
как принудительно завершить
w666w © (2003-02-03 14:30:00)Проблема в следующем:
Несколько потоков параллельно устанавливают соединение с разными 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() (либо опять таки, послать ему мессагу).
Кто сталкивался, помогите нейти оптимальное решение...
Smithson (2003-02-03 16:13:00) [1]Глюки были в версии для D5. В версии для D7 я уже не пробывал "глючный" вариант.
Zelius (2003-02-03 16:08:00) [2]А какая у вас версия Indy???
w666w (2003-02-03 15:08:00) [3]Спасибо, CS помогло...
Smithson (2003-02-03 14:44:00) [4]Видел я такие грабли. Сделай создание объекта
FHTTP := TIdHTTP.Create(nil);заключенным в какую-нибудь критическую секцию. У меня без этого глючило.
А убить поток - из другого потока TerminateThread
Zelius (2003-02-03 14:42:00) [5]ТО есть, ты хочешь сказать, что установка FHTTP.ReadTimeout := xxx после Create(...) не помогает???