Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1166103298
Defort
2006-12-14 16:34
2006.12.31
Остановка программы и выход


15-1165399919
boriskb
2006-12-06 13:11
2006.12.31
Годовщина победы под Москвой


15-1165855670
Гоблин
2006-12-11 19:47
2006.12.31
MSSQL - посоветуйте книжку


4-1155900236
Rentgen
2006-08-18 15:23
2006.12.31
как работать с реестром(ТРегистри) под другими правами?


2-1165930015
oleglu
2006-12-12 16:26
2006.12.31
DBGrid





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский