|
|
Регистрация | << Правила форума >> | 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
|
|||
|
|||
Цитата:
|