Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

помогите с пингом


Страницы:   1 2 3 4 5

linuxoid ©   (2010-07-12 13:05:00) 

Здравствуйте.

имеется таблица в базе с ip-адресами. нужно поочередно всех пропинговать.

tablebase.Open;
tablebase.First;
for i:=1 to tablebase.recordcount do begin
adres:=tablebase.fields.Fields[2].AsString;
icmp.Host:=adres;
icmp.Ping();
listbox1.Items.Add('Время до хоста: '+' - '+inttostr(icmp.ReplyStatus.MsRoundTripTime)+'ms')
tablebase.Next;

скажите в чем проблема?


Anatoly Podgoretsky   (2010-07-14 10:06:00) [21]


> Application.ProcessMessages - временно выполняет скопившиеся
> задачи

Что неправда, никаких задач, кроме ProcessMessages он не выполняет


Anatoly Podgoretsky   (2010-07-14 10:05:00) [22]


> вот вот, я хотел посоветовать - потом передумал)

Пожалел :-)


brother   (2010-07-14 05:05:00) [23]

> вот эти не понятны что то?

странно, но все остальное понятно??? Тогда - дерзай! Удачи!


brother   (2010-07-14 04:59:00) [24]

> вот эти не понятны что то?

если уже работаем, то заново не надо запускаться, пока не отработают текущие пинги...
> а постоянными пингами, не ухудшится ли обмен пакетами в
> сети?

имхо нагрузка не велика - нет


ixen   (2010-07-13 15:20:00) [25]

а постоянными пингами, не ухудшится ли обмен пакетами в сети?


linuxoid   (2010-07-13 12:48:00) [26]


> begin
>  if Work then
>    Exit
>  else
>    Work:= True;


вот эти не понятны что то?


brother   (2010-07-13 11:27:00) [27]

Блин, ты без потоков бы попробовал разобраться!
Держи и смотри как...
unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdRawBase, IdRawClient,
 IdIcmpClient, ExtCtrls;

type
 TForm1 = class(TForm)
   Button1: TButton;
   ListBox1: TListBox;
   IdIcmpClient1: TIdIcmpClient;
   Timer1: TTimer;
   procedure FormCreate(Sender: TObject);
   procedure Timer1Timer(Sender: TObject);
   procedure FormClose(Sender: TObject; var Action: TCloseAction);
   procedure Button1Click(Sender: TObject);
 private

 public
   Work: boolean;
   IpList: array of string;
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
 i: integer;
begin
 SetLength(IpList, 21);
 for i:= 1 to High(IpList) do
   IpList[i]:= '10.1.1.' + IntToStr(i);

 IdIcmpClient1.ReceiveTimeout:= 200;
 Work:= False;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
 i: integer;
begin
 if Work then
   Exit
 else
   Work:= True;

 ListBox1.Items.Clear;
 for i:= 1 to High(IpList) do
 begin
   IdIcmpClient1.Host:= IpList[i];
   IdIcmpClient1.Ping();
   ListBox1.Items.Add('10.1.1. ' + inttostr(i) + ' :' +  inttostr(IdIcmpClient1.ReplyStatus.MsRoundTripTime)+'ms');
   Application.ProcessMessages;
   if not Work then
     Break;
 end;
 Work:= False;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
 Work:= False;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 Timer1.Enabled:= not Timer1.Enabled;
end;

end.


linuxoid   (2010-07-13 11:17:00) [28]


>
> Отдельный поток.

спасибо. теперь постараюсь сам разобраться.


faiwer   (2010-07-13 11:15:00) [29]


> почему так нельзя сделать, или в этой проге используют нескоко
> потоков?
> может дело в другом методе?

Дело в потоках, вот это:

TThreadScan = class(TThread)
    msg : string;
    msg2 : string;
private
    BeginAddr: integer;
    EndAddr: integer;
    Timeout: DWORD;
    procedure UpdateMemo;
    procedure UpdateStatusBar;
    procedure UpdateScanned;
protected
    procedure Execute; override;
public
    constructor Create(a,b:integer);
end;


Отдельный поток.


linuxoid   (2010-07-13 11:08:00) [30]


> faiwer ©   (13.07.10 10:58) [67]

спс. теперь понял.

в этой проге -
http://www.delphisources.ru/pages/sources/internet/2007_year/ping_thread.html

можно делать несколько операции.
почему так нельзя сделать, или в этой проге используют нескоко потоков?
может дело в другом методе?


faiwer   (2010-07-13 10:58:00) [31]

Объясню по понятнее.
Твоя программа (я имею ввиду твои процедуры и функции) и её интерфейс работают в одном потоке. Если поток чем то занят, он чтото делает, то чтото другое он не делает. Поток не может делать сразу два дела в 1 момент времени. Поетому когда ты его нагружаешь пингами, он не может перерисовать ListBox, чтобы там повился новый элемент, и не может обработать твои нажатия на эдитки, кнопки и прочие вещи - ибо он "пингует", он всё ещё внутри цикла.

Application.ProcessMessages - временно выполняет скопившиеся задачи, то есть если листбокс хотел нарисовать новый элемент - он его нарисует, по окончанию списка задач, твоя программа вновь пингует. Поетому никакие едитки не пашут. Список обновился, но интерфейс так и остаётся деревянным. Потоку не до этого, он пингует.

Ты можешь вынести пинг-инг в отдельный поток, тогда ничерта зависать не будет, но во первых, тебе придётся прочитать 100500 статей, научится синхронизировать работу с тем же ListBox-ом, да и просто написать много костылей. Если ты чем то (для тебя) сложным в делфях уже занимался, то потоки на голову сложнее :)

P.S. сетевые программы, музыкальные программы даже небольшой сложности обязательно разграничены на 1-2-3...999 потоков )


faiwer   (2010-07-13 10:52:00) [32]

linuxoid
1. я в твой код добавил Application.ProcessMessages - это гарантирует то, что твой ListBox будет пополнятся постепенно, а не разом после всех пингов
2. если ты хочешь чтобы не зависал интерфейс - тебе надо выносить сетевую часть в отдельный поток. Что то мне подсказывает, что после пары статей про потоки, ты передумаешь, и захочешь чтобы зависало дальше )


linuxoid   (2010-07-13 10:40:00) [33]

все равно во время пинга в проге моей даже окно нельзя перетаскивать. вписывать какие нить данные в эдиты и т д.


brother   (2010-07-13 10:30:00) [34]

кстати:

> нужно поочередно всех пропинговать.

в [54] иже с ним, так и делается, а не реакция - работает...)


brother   (2010-07-13 10:26:00) [35]

> Выноси пинг в отдельный поток если тебе кнопки жать хоца...
>
> Правда, ИМХО, там грабель насобирашь...

вот вот, я хотел посоветовать - потом передумал)


Dennis I. Komarov   (2010-07-13 10:23:00) [36]


> после запуска программа стоит. все кнопки не активны. затем
> разом в листбокс добавляется отчет по нескольким хостам.
>  через некоторое время еще по нескольким. выход даже на
> рабоает

Ну так она работает, а не зависает. Чего ты ее дергаешь? Выноси пинг в отдельный поток если тебе кнопки жать хоца...
Правда, ИМХО, там грабель насобирашь...


linuxoid   (2010-07-13 10:21:00) [37]

вот нашел аналог. хотелось бы такое. здесь просто задается диапазон ip.
а в моей они должны братся из базы.

http://www.delphisources.ru/pages/sources/internet/2007_year/ping_thread.html


Dennis I. Komarov   (2010-07-13 10:18:00) [38]


> постоянное обращение к базе влияет?

нет


linuxoid   (2010-07-13 10:12:00) [39]

а что если все данные вначале занести в массив adres[i].
затем пинг делать перебирая значение массива.

постоянное обращение к базе влияет?


Anatoly Podgoretsky   (2010-07-13 10:11:00) [40]


> нужен наилучший вариант кода который проверит на наличие
> доступности хоста в сети.

Большинство файрволов имеют в составе verifier это штука помощнее, а не видимость проверки с пингом, что просто шоры на глаза. Иммитация работы.


Страницы:   1 2 3 4 5

Наверх

Титульная страница Поиск, карта сайта Написать письмо