Форум: "Начинающим";
Текущий архив: 2006.12.31;
Скачать: [xml.tar.bz2];
ВнизПинг в несколько потоков Найти похожие ветки
← →
Квэнди © (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;
Скачать: [xml.tar.bz2];
Память: 0.53 MB
Время: 0.052 c