![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
помогите с пингом
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 это штука помощнее, а не видимость проверки с пингом, что просто шоры на глаза. Иммитация работы.