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