|  | 
 
 | 
| 
 | |||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны | 
|  | 
|  | Опции темы | Поиск в этой теме | Опции просмотра | 
| 
			 
			#1  
			
			
			
			
		 | |||
| 
 | |||
|  Пинг адреса и проверка открытости порта Суть проблемы такова: Я пишу плагин для чата, нужно пропинговать определённые адреса и проверить на открытость порта, затем вывести всё в определённый канал, но это всё фигня. Пингую адреса и получается так что весь сервер подвисает в то время пока идёт проверка адресов. Понял что это происходит в этом коде: Код: procedure TForm1.DCPing();
var
  i:integer;
  s,app:string;
begin
 App := ExtractFilePath( ParamStr(0));
 memo1.Lines.LoadFromFile(app+option+'Privetstvie.txt');
 begin
 for I:=0 to Listbox1.Count-1 do
  begin
   s:=listbox1.items[i];
 try
  IdTCPClient1.Host:=s;
  IdTCPClient1.Port:=411;
  IdTCPClient1.Connect;
   if IdTCPClient1.Connected
    then 
     //подключились
 Memo1.Lines.Add('* '+s+' '+'online');
 IdTCPClient1.Disconnect;
   except
//не подключились
 Memo1.Lines.add('* '+s+' '+'offline');
 end;
 end;
end;И так вопрос таков, как можно сделать так что бы этот код не так сильно грузил программу? Или подскажите пожалуйста другой способ проверить адрес и узнать открыт ли порт. Последний раз редактировалось -=Virus=-, 26.02.2011 в 01:25. | 
| 
			 
			#2  
			
			
			
			
		 | |||
| 
 | |||
|   в цикле попробуй сделать: Application.ProcessMessages; (можно конечно это всё сделать на потоках, но чуть сложнее будет) | 
| 
			 
			#3  
			
			
			
			
		 | |||
| 
 | |||
|   Цитата: 
 | 
| 
			 
			#4  
			
			
			
			
		 | |||
| 
 | |||
|   самый простой и примитивный способ: Код:  type
   TMyThread = class(TThread)
     host: string;
     port: integer;
     isalive: boolean;
   public
     procedure ToLog;
   protected
     procedure Execute; override;
   end;
..........................
procedure TMyThread.ToLog;
begin
  if isalive then
    Form1.Memo1.Lines.Add(host + ' at port ' + IntToStr(port) + ' is alive')
  else
    Form1.Memo1.Lines.Add(host + ' at port ' + IntToStr(port) + ' is NOT alive');
end;
procedure TMyThread.Execute;
var
  IdTCPClient: TIdTCPClient;
begin
  isalive := False;
  FreeOnTerminate := True;
    IdTCPClient := TIdTCPClient.Create(nil);
    IdTCPClient.Host := host;
    IdTCPClient.Port := port;
    try
      IdTCPClient.Connect;
      if IdTCPClient.Connected then
        isalive := True
    except
      isalive := False;
    end;
    IdTCPClient.Free;
    Synchronize(ToLog);
end;Код: var
  ping: TMyThread;
  i: integer;
begin
  for i:=1 to 100 do
  begin
    ping := TMyThread.Create(True);
    ping.host := 'localhost';
    ping.port := i;
    ping.Resume;
  end;Последний раз редактировалось Assistant, 26.02.2011 в 02:22. | 
| 
			 
			#5  
			
			
			
			
		 | |||
| 
 | |||
|   Код: procedure Execute; override; Ругается на строчку | 
| 
			 
			#6  
			
			
			
			
		 | |||
| 
 | |||
|   Цитата: 
 | 
| 
			 
			#7  
			
			
			
			
		 | |||
| 
 | |||
|   Скинь целиком,посмотрю. | 
| 
			 
			#8  
			
			
			
			
		 | |||
| 
 | |||
|   прикрепил файл | 
| 
			 
			#9  
			
			
			
			
		 | |||
| 
 | |||
|   Цитата: 
 |