Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Интернет и сети
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 25.02.2011, 18:59
-=Virus=- -=Virus=- вне форума
Прохожий
 
Регистрация: 28.05.2009
Сообщения: 19
Репутация: 10
По умолчанию Пинг адреса и проверка открытости порта

Суть проблемы такова:
Я пишу плагин для чата, нужно пропинговать определённые адреса и проверить на открытость порта, затем вывести всё в определённый канал, но это всё фигня. Пингую адреса и получается так что весь сервер подвисает в то время пока идёт проверка адресов. Понял что это происходит в этом коде:
Код:
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  
Старый 25.02.2011, 20:57
Assistant Assistant вне форума
Продвинутый
 
Регистрация: 20.02.2011
Адрес: там где правят идиоты
Сообщения: 603
Версия Delphi: 7
Репутация: выкл
По умолчанию

в цикле попробуй сделать: Application.ProcessMessages;
(можно конечно это всё сделать на потоках, но чуть сложнее будет)
Ответить с цитированием
  #3  
Старый 25.02.2011, 21:29
-=Virus=- -=Virus=- вне форума
Прохожий
 
Регистрация: 28.05.2009
Сообщения: 19
Репутация: 10
По умолчанию

Цитата:
Сообщение от Assistant
в цикле попробуй сделать: Application.ProcessMessages;
(можно конечно это всё сделать на потоках, но чуть сложнее будет)
Расскажите а как именно можно на потоках сделать?
Ответить с цитированием
  #4  
Старый 25.02.2011, 23:10
Assistant Assistant вне форума
Продвинутый
 
Регистрация: 20.02.2011
Адрес: там где правят идиоты
Сообщения: 603
Версия Delphi: 7
Репутация: выкл
По умолчанию

самый простой и примитивный способ:
Код:
 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  
Старый 25.02.2011, 23:26
-=Virus=- -=Virus=- вне форума
Прохожий
 
Регистрация: 28.05.2009
Сообщения: 19
Репутация: 10
По умолчанию

Код:
procedure Execute; override;

Ругается на строчку
Ответить с цитированием
  #6  
Старый 25.02.2011, 23:49
Assistant Assistant вне форума
Продвинутый
 
Регистрация: 20.02.2011
Адрес: там где правят идиоты
Сообщения: 603
Версия Delphi: 7
Репутация: выкл
По умолчанию

Цитата:
Сообщение от -=Virus=-
Ругается на строчку
копировал из своего рабочего кода
Ответить с цитированием
  #7  
Старый 25.02.2011, 23:57
-=Virus=- -=Virus=- вне форума
Прохожий
 
Регистрация: 28.05.2009
Сообщения: 19
Репутация: 10
По умолчанию

Скинь целиком,посмотрю.
Ответить с цитированием
  #8  
Старый 26.02.2011, 00:37
Assistant Assistant вне форума
Продвинутый
 
Регистрация: 20.02.2011
Адрес: там где правят идиоты
Сообщения: 603
Версия Delphi: 7
Репутация: выкл
По умолчанию

прикрепил файл
Вложения
Тип файла: zip test.zip (6.6 Кбайт, 46 просмотров)
Ответить с цитированием
  #9  
Старый 26.02.2011, 01:06
-=Virus=- -=Virus=- вне форума
Прохожий
 
Регистрация: 28.05.2009
Сообщения: 19
Репутация: 10
По умолчанию

Цитата:
Сообщение от Assistant
прикрепил файл
Спасибо исходник работает. Странно почему то у меня не работал,щу буду глядеть почему.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 01:54.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter