|
Вопрос # 4 010/ вопрос открыт / |
|
Здравствуйте, уважаемые эксперты!
Есть сервер и есть список IP адресов, мне нужно проверить запущен ли на них клиент.
Использую TTCPClient, начинаю в цикле проверять все IP, если все в сети, то все происходит быстро и так как нужно, но если хоть один клиент не запущен, то приложение виснет и очень на долго. Возможно ли это как-то поправить?
---
for i:=0 to n do
with TcpClient1 do
begin
RemoteHost:=ListIP[i];
RemotePort:='5151';
if Connect then
begin
...
Disconnect;
end;
else ...
end;
 |
Вопрос задал: unl0K (статус: Посетитель)
Вопрос отправлен: 10 апреля 2010, 18:39
Состояние вопроса: открыт, ответов: 1.
|
Ответ #1. Отвечает эксперт: DNK
Здравствуйте, unl0K!
В таких случаях запускают несколько потоков. Т.е. пока один поток ожидает ответа от отсутствующего сервера, параллельно опрашиваюся другие. В приложении простейший пример, по уму надо добавить код, который ограничит количество одновременно работающих потоков.
Приложение: Переключить в обычный режим- type
- TConnectThread = class (TThread)
- private
- TcpClient: TTcpClient;
- res: boolean;
- procedure GetResult;
- protected
- procedure Execute; override;
- public
- constructor Create(AHost: string);
- end;
-
- { TConnectThread }
-
- constructor TConnectThread.Create(AHost: string);
- begin
- inherited Create(false);
- TcpClient := TTcpClient.Create(nil);
- TcpClient.RemoteHost := AHost;
- TcpClient.RemotePort := '80';
- end;
-
- procedure TConnectThread.Execute;
- begin
- res := TcpClient.Connect;
- if res then
- TcpClient.Disconnect;
- Synchronize(GetResult);
- end;
-
- procedure TConnectThread.GetResult;
- begin
- if res then
- ...
- else
- ...
- end;
-
- ...
-
- for i:=0 to n do
- TConnectThread.Create(ListIP[i]);
 |
Ответ отправил: DNK (статус: Студент)
Время отправки: 10 апреля 2010, 19:55
Оценка за ответ: 5
Комментарий к оценке: Огромное спасибо!
|
Мини-форум вопроса
Мини-форум пуст.
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|