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

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

Пинг в несколько потоков [D7, WinXP]


Страницы:   1 2

Квэнди ©   (2006-12-08 15:21:00) 

Здравствуйте.
Вопроса у меня 2:
1. (немного не в эту тему) Есть объект TIdIcmpClient.
   Можно ли одновременно в нескольких потоках запускать его функцию Ping ? Чем это грозит ?
2. Есть паралльельный поток, который, собственно, и будет запускать ping, затем синхронизируясь по получению ответа. Проблема в следующем:
кол-во потоков не известно, его будет вводить пользователь. Каким образом можно реализовать создание и запуск одновременно неизвестного в disign-time кол-ва потоков ?


Квэнди   (2006-12-13 16:55:00) [1]

Dmitrij_K   (13.12.06 16:52) [29]
Вопрос в том, что если использовать последовательный пинг, то есть просто в цикле пинговать, то все правильно...


Dmitrij_K   (2006-12-13 16:52:00) [2]

У меня работает правильно.
Кто-то из них время неправильно считает.
Попробуй другой утилитой проверить. время.


Квэнди   (2006-12-13 16:49:00) [3]

еще раз прошу о помощи, ну очень хочется все- таки разобраться (( ну ведь по логике и согласно литературе все должно работать (


Квэнди   (2006-12-13 08:51:00) [4]

так никто не знает в чем причина ?


Квэнди   (2006-12-12 14:24:00) [5]

Соответственно вот код, который использую сейчас:
unit Unit1;

interface

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

type
 TForm1 = class(TForm)
   Edit1: TEdit;
   Button1: TButton;
   Memo1: TMemo;
   Timer1: TTimer;
   procedure Timer1Timer(Sender: TObject);
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;
TPrimeThrd = class(TThread)
private
  FHost : AnsiString;
  idping : tidicmpclient;
protected
  procedure Execute; override;
  procedure update;
  constructor Create(Host:AnsiString);
end;

var
 Form1: TForm1;
 int,count:integer;
 arthrd:array[1..1000] of TPrimeThrd;
implementation

{$R *.dfm}
constructor TPrimeThrd.Create(Host: AnsiString);
begin
inherited Create(False);
FreeOnTerminate:=True;
FHost := Host;
end;
procedure tprimethrd.execute;
begin
idping:=tidicmpclient.Create(nil);
try
  idping.Host := FHost;
  idping.Ping;
  Synchronize(update);
finally
  idping.Free
end
end;
procedure tprimethrd.update;
begin
form1.Memo1.Lines.Add(form1.Edit1.Text+' '+inttostr(idping.ReplyStatus.MsRoundTripTime));
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
count:=1;
timer1.Enabled:=true;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
if count<100 then
 begin
   arthrd[count]:=TPrimeThrd.Create(edit1.Text);
   inc(count);
 end
else
 begin
 timer1.Enabled:=false;
 memo1.Lines.Add('ВСЕ!!!');
 end;
end;

end.


Квэнди   (2006-12-12 14:22:00) [6]

Исправил в соответствии с тем, что вы написали. Результат тот же:
10.254.235.1 120
10.254.235.1 104
10.254.235.1 90
10.254.235.1 74
10.254.235.1 57
10.254.235.1 39
10.254.235.1 22

а вот правильный результат:

64 bytes from 10.254.235.1: icmp_seq=81 ttl=56 time=829.350 ms
64 bytes from 10.254.235.1: icmp_seq=82 ttl=56 time=1225.866 ms
64 bytes from 10.254.235.1: icmp_seq=83 ttl=56 time=1206.048 ms
64 bytes from 10.254.235.1: icmp_seq=84 ttl=56 time=1187.424 ms
64 bytes from 10.254.235.1: icmp_seq=85 ttl=56 time=1175.842 ms
64 bytes from 10.254.235.1: icmp_seq=86 ttl=56 time=1159.524 ms
64 bytes from 10.254.235.1: icmp_seq=87 ttl=56 time=1182.741 ms
64 bytes from 10.254.235.1: icmp_seq=88 ttl=56 time=1162.316 ms
64 bytes from 10.254.235.1: icmp_seq=89 ttl=56 time=1142.507 ms
64 bytes from 10.254.235.1: icmp_seq=90 ttl=56 time=1122.915 ms
64 bytes from 10.254.235.1: icmp_seq=91 ttl=56 time=1102.940 ms
64 bytes from 10.254.235.1: icmp_seq=92 ttl=56 time=1085.277 ms
64 bytes from 10.254.235.1: icmp_seq=93 ttl=56 time=1106.530 ms
64 bytes from 10.254.235.1: icmp_seq=94 ttl=56 time=1091.069 ms
64 bytes from 10.254.235.1: icmp_seq=95 ttl=56 time=1077.193 ms
64 bytes from 10.254.235.1: icmp_seq=96 ttl=56 time=1058.025 ms
64 bytes from 10.254.235.1: icmp_seq=97 ttl=56 time=1044.621 ms
64 bytes from 10.254.235.1: icmp_seq=98 ttl=56 time=1031.366 ms
64 bytes from 10.254.235.1: icmp_seq=99 ttl=56 time=1051.724 ms


Dmitrij_K   (2006-12-12 14:03:00) [7]

дополнение

constructor TPrimeThrd.Create(Host: AnsiString);
begin
 inherited Create(False);
 FreeOnTreminate := True; // ***
 FHost := Host;
end;


Dmitrij_K   (2006-12-12 13:59:00) [8]

Обращение к VCL ТОЛЬКО в основном потоке.
Вот немного подправил.
type
 TPrimeThrd = class(TThread)
 private
   FHost : AnsiString;
   idping : tidicmpclient;
 protected
   procedure Execute; override;
   procedure update;
   constructor Create(Host:AnsiString);
 end;

constructor TPrimeThrd.Create(Host: AnsiString);
begin
 inherited Create(False);
 FHost := Host;
end;

procedure tprimethrd.execute;
begin
 idping:=tidicmpclient.Create(nil);
 try
   idping.Host := FHost;
   idping.Ping;
   Synchronize(update);
 finally
   idping.Free
 end
end;

procedure tprimethrd.update;
begin
form1.Memo1.Lines.Add(fhost+' '+inttostr(idping.ReplyStatus.MsRoundTripTime));
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
tprimethrd.Create('ya.ru');
end;


Квэнди   (2006-12-12 13:39:00) [9]

Попробую хоть как- нибудь возвать к помощи


Квэнди   (2006-12-12 09:00:00) [10]

Неужели код написан правильно и это просто не должно правильно работать ?


Квэнди   (2006-12-11 13:19:00) [11]

Проверил еще раз, на сколько я понимаю по логике действительно все верно, но все- таки почему такие результаты ? где же ошибка ? (


Квэнди   (2006-12-11 09:30:00) [12]

unit Unit1;

interface

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

type
 TForm1 = class(TForm)
   Edit1: TEdit;
   Button1: TButton;
   Memo1: TMemo;
   Timer1: TTimer;
   procedure Timer1Timer(Sender: TObject);
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;
type  TPrimeThrd = class(TThread)
protected
idping:tidicmpclient;
procedure Execute; override;
procedure update;
end;

var
 Form1: TForm1;
 int,count:integer;
 arthrd:array[1..1000] of TPrimeThrd;
implementation

{$R *.dfm}
procedure tprimethrd.execute;
 begin
   idping:=tidicmpclient.Create(form1);
   idping.Host:=form1.Edit1.Text;
   idping.Ping();
   Synchronize(update);
   idping.Free;
 end;
procedure tprimethrd.update;
begin
form1.Memo1.Lines.Add(form1.Edit1.Text+' '+inttostr(idping.ReplyStatus.MsRoundTripTime));
end;
procedure TForm1.Button1Click(Sender: TObject);
var ping:tidicmpclient;
begin
count:=1;
ping:=tidicmpclient.Create(self);
ping.Host:=edit1.Text;
ping.Ping();
showmessage(inttostr(ping.ReplyStatus.MsRoundTripTime));
timer1.Enabled:=true;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
if count<100 then
 begin
   arthrd[count]:=TPrimeThrd.Create(false);
   inc(count);
 end
else
 begin
 timer1.Enabled:=false;
 memo1.Lines.Add('ВСЕ!!!');
 end;
end;

end.


Вот примерный код для теста. Но как- то очень странно получается.
проверял на хосте, до которого стандартный пинг в среднем 600мс
при обычном способе в цикле пинг, он показывал правильное время. В этом же варинате он показывает в memo1 ответы по 22мс , чего в теории не может быть ( соответственно ошибка где- то у меня, не подскажите где ?


Anatoly Podgoretsky   (2006-12-08 15:56:00) [13]

> Квэнди  (08.12.2006 15:52:17)  [17]

Ясно кода не дождемся.


Квэнди   (2006-12-08 15:52:00) [14]


> Почему один?
>
> Где твой код?

Извиняюсь, не подумав написал. Несколько, все верно, должно работать.
Извините за беспокойство.


Anatoly Podgoretsky   (2006-12-08 15:51:00) [15]

> Квэнди  (08.12.2006 15:50:12)  [12]

> послав один icmp пакет, не дожидаясь его возврата послать второй...

Так и действуй


Anatoly Podgoretsky   (2006-12-08 15:51:00) [16]

> Квэнди  (08.12.2006 15:46:09)  [9]

Почему один?

Где твой код?


Anatoly Podgoretsky   (2006-12-08 15:50:00) [17]

> Квэнди  (08.12.2006 15:42:07)  [7]

> но не в этом основной вопрос )

Теперь ты заинтриговал, а в чем же тогда?


Рамиль   (2006-12-08 15:50:00) [18]


> Квэнди ©   (08.12.06 15:46) [9]

1. Я не знаю как работает TIdIcmpClient, если он может сам работать несколькими потоками, то надо "попросить" его это сделать.
2. Если он так не работает, то в каэдом потоке создаешь экземпляр TIdIcmpClient и пигуешь себе на здоровье


Квэнди   (2006-12-08 15:50:00) [19]


> Не знаю - это динамика, создавай по мере необходимости.

Задача на самом деле проста, послав один icmp пакет, не дожидаясь его возврата послать второй...


Anatoly Podgoretsky   (2006-12-08 15:49:00) [20]

> Рамиль  (08.12.2006 15:40:06)  [6]

Массив не нужен (Кин Дза Дза)


Страницы:   1 2

Наверх

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