Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.12.31;
Скачать: CL | DM;

Вниз

Пинг в несколько потоков   Найти похожие ветки 

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

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


 
Рамиль ©   (2006-12-08 15:26) [1]

1. Если правильно разрулить, то ничем.
2. Непонятно зачем еще один поток, который будет запускать другие потоки? Чем из основного не нравится? А насчет количества
PingTreads: array of TThread или TString(Object)List

Хотя я не пользовался TIdIcmpClient, может он сам не умеет потоки плодить?


 
Anatoly Podgoretsky ©   (2006-12-08 15:26) [2]

> Квэнди  (08.12.2006 15:21:00)  [0]

1а. можно
1б ничем не грозит, кроме паралельности

2. как ты создаешь потоки в дизайн тайм, очень интересно, покажи, тогда поможем с рантайм.


 
Рамиль ©   (2006-12-08 15:27) [3]


> может он сам не умеет потоки плодить?

> может он сам умеет потоки плодить?


 
Рамиль ©   (2006-12-08 15:29) [4]


> Anatoly Podgoretsky ©   (08.12.06 15:26) [2]

Телепортатор подсказывает, что пытается так
var
 th1, th2, th3 ... :TThread; :)
А var в runtime не перепишешь.


 
Квэнди ©   (2006-12-08 15:31) [5]


> 1а. можно
> 1б ничем не грозит, кроме паралельности

Вот вопрос как раз в параллельности выполнения, т.е. в одну единицу времени вне зависимости от кол-ва потоко, пытающихся выполнить ping, выполнит только один, и ни один другой его не выполнит, пока первый не получит reply , верно ?

>
> 2. как ты создаешь потоки в дизайн тайм, очень интересно,
>  покажи, тогда поможем с рантайм.

Неверно выразился.
Имеется ввиду что я не знаю кол- ва потоков. Соответственно единственно верный, имхо вариант это динамический массив потоков , так ?


 
Рамиль ©   (2006-12-08 15:40) [6]


> Имеется ввиду что я не знаю кол- ва потоков. Соответственно
> единственно верный, имхо вариант это динамический массив
> потоков , так ?

[1] и необязательно динамический, можно статический до n и не давать ввести больше n потоков.


 
Квэнди ©   (2006-12-08 15:42) [7]


> [1] и необязательно динамический, можно статический до n
> и не давать ввести больше n потоков.

Да это понятно, но не в этом основной вопрос )


 
Рамиль ©   (2006-12-08 15:44) [8]


> выполнит только один, и ни один другой его не выполнит,
> пока первый не получит reply , верно ?

Неверно.


 
Квэнди ©   (2006-12-08 15:46) [9]


> Неверно.

А как тогда ? экземпляр объекта TIdIcmpClient один, ведь так ? и во всех одновременных поток используется один и тот же экземпляр...


 
Anatoly Podgoretsky ©   (2006-12-08 15:48) [10]

> Квэнди  (08.12.2006 15:31:05)  [5]

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


 
Anatoly Podgoretsky ©   (2006-12-08 15:49) [11]

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

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


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


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

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


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


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

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


 
Anatoly Podgoretsky ©   (2006-12-08 15:50) [14]

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

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

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


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

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

Почему один?

Где твой код?


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

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

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

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


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


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

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


 
Anatoly Podgoretsky ©   (2006-12-08 15:56) [18]

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

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


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

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мс , чего в теории не может быть ( соответственно ошибка где- то у меня, не подскажите где ?


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

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


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

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


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

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


 
Dmitrij_K   (2006-12-12 13:59) [23]

Обращение к 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;


 
Dmitrij_K   (2006-12-12 14:03) [24]

дополнение

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


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

Исправил в соответствии с тем, что вы написали. Результат тот же:
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


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

Соответственно вот код, который использую сейчас:
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-13 08:51) [27]

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


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

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


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

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


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

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



Страницы: 1 вся ветка

Текущий архив: 2006.12.31;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.039 c
2-1165580466
Квэнди
2006-12-08 15:21
2006.12.31
Пинг в несколько потоков


15-1166046445
sat
2006-12-14 00:47
2006.12.31
задача нужны идеи


8-1147343765
Rule
2006-05-11 14:36
2006.12.31
как объеденить огромное количество изображений PNG


15-1165748672
Firefly
2006-12-10 14:04
2006.12.31
Скорость расчета


2-1165871607
MegaNop
2006-12-12 00:13
2006.12.31
ActionMainMenuBar