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

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

Пинг


Страницы:   1 2 3 4 5

DeeNamid ©   (2008-08-04 12:48:00) 

Вопрос такой, делаю пять потоков которые пингуют каждый свою машину и выводять результаты на пять окон, проблема с icmp-компонентом. Все пять потоков толкутся около icmp.ping() и результаты пинга искажаются.
Код примерно такой:

procedure Tping1.Execute;
begin
 while not (terminated or application.Terminated) do begin
//EnterCriticalSection(CS);
 res:=ping_func(ip_addres);
//LeaveCriticalSection(CS);
 synchronize(print_res);
 end;
end;

function Tping1.ping_func(host:string):integer;
var i,failed:integer;
begin
 icmp.ReceiveTimeout:=3000;
 icmp.Host:=host;
 icmp.Ping();
 if icmp.ReplyStatus.ReplyStatusType<>rsTimeOut then
   ping_func:=icmp.ReplyStatus.MsRoundTripTime
  else
   ping_func:=0;
end;

Когда ставишь критическую секцию результаты отображаются адекватно, но пока один поток пингует все остальные его ждут. Как сделать так что бы все пинговалось независимо друг от друга?


DeeNamid   (2008-08-04 14:58:00) [81]

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


DeeNamid   (2008-08-04 14:31:00) [82]

Ты о чем?


Dennis I. Komarov   (2008-08-04 14:25:00) [83]

> [7] antonn ©   (04.08.08 13:20)

Значок видишь?


DeeNamid   (2008-08-04 14:22:00) [84]

Ну смотрите тады ))
Главная форма:

type
 TForm1 = class(TForm)
   Memo1: TMemo;
   Button1: TButton;
   ComboBox1: TComboBox;
   Panel1: TPanel;
   Label7: TLabel;
   Label8: TLabel;
   Label9: TLabel;
   Label10: TLabel;
   Label11: TLabel;
   Label12: TLabel;
   Memo2: TMemo;
   Memo3: TMemo;
   Memo4: TMemo;
   Memo5: TMemo;
   Memo6: TMemo;
   Button2: TButton;
   procedure Button1Click(Sender: TObject);
   procedure FormDestroy(Sender: TObject);
   procedure Button2Click(Sender: TObject);
   procedure FormClose(Sender: TObject; var Action: TCloseAction);
 private
   ping1,ping2,ping3,ping4,ping5: Tping;
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

procedure TForm1.Button1Click(Sender: TObject);
begin
ping1:=Tping.Create('93.158.134.3',1);
ping2:=Tping.Create('172.21.161.34',2);
ping3:=Tping.Create('172.21.61.44',3);
ping4:=Tping.Create('10.61.1.126',4);
ping5:=Tping.Create('172.21.61.46',5);
 ping1.Resume;
 ping2.Resume;
 ping3.Resume;
 ping4.Resume;
 ping5.Resume;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
try
  ping1.Terminate;
  ping2.Terminate;
  ping3.Terminate;
  ping4.Terminate;
  ping5.Terminate;
except
end;
end;

Unit2:

type
 Tping = class(TThread)
 private
   memo_num:integer;ip_addres:string;
   res:integer;res_str:string;
 protected
   procedure Execute; override;
   function ping_func(icmp:TIdIcmpClient;host:string):integer;
   procedure print_res;
 public
   constructor create(ip_addr:string;i:integer);
 end;
var CS:TRTLCriticalSection;
implementation
uses Unit1;

function Tping.ping_func(icmp:TIdIcmpClient;host:string):integer;
begin
 icmp.ReceiveTimeout:=3000;
 icmp.Host:=host;
 icmp.Ping();
 if icmp.ReplyStatus.ReplyStatusTypersTimeOut then
   ping_func:=icmp.ReplyStatus.MsRoundTripTime
  else
   ping_func:=0;
end;

procedure Tping.Execute;
var icmp: TIdIcmpClient;
begin
 FreeOnTerminate:=true;
 icmp:=TIdIcmpClient.Create(nil);
 while not (terminated or application.Terminated) do begin
//EnterCriticalSection(CS);
 res:=ping_func(icmp,ip_addres);//мне кажется здесь заморочка с res
//LeaveCriticalSection(CS);
 sleep(0);
 synchronize(print_res);
 end;
 icmp.Destroy;
end;

procedure Tping.print_res;
begin
if res>0 then res_str:='Âðåìÿ äî õîñòà: '+inttostr(res)+'ms' else res_str:='Ïðåâûøåí èíòåðâàë îæèäàíèÿ';
case memo_num of
 1: Form1.memo2.Lines.add(res_str);
 2: Form1.memo3.Lines.add(res_str);
 3: Form1.memo4.Lines.add(res_str);
 4: Form1.memo5.Lines.add(res_str);
 5: Form1.memo6.Lines.add(res_str);
end;
Form1.memo1.lines.add('Ïîòîê íîìåð: '+inttostr(memo_num));
Form1.Memo1.Lines.Add(res_str);
end;

constructor Tping.create(ip_addr: string;i:integer);
begin
ip_addres:=ip_addr;
memo_num:=i;
inherited create(true);
end;

initialization
 InitializeCriticalSection(CS);
end.

Как-то так. Сделал как ты сказал, ничего не изменилось.


Anatoly Podgoretsky   (2008-08-04 13:59:00) [85]

Да он вообще мало информации предоставил, зато он предоставил нам возможность проявиться телепатические способности.


Сергей М.   (2008-08-04 13:42:00) [86]


> antonn ©   (04.08.08 13:20) [7]


Подвох не у меня , а у автора - область видимости ид-ра icmp он не удосужился уточнить)


antonn   (2008-08-04 13:20:00) [87]

Ого, Сергей показал готовый код, где то здесь подвох! %)


Сергей М.   (2008-08-04 13:04:00) [88]

function Tping1.ping_func(ICMP: TIdICMP; host:string):integer;
var i,failed:integer;
begin
icmp.ReceiveTimeout:=3000;
icmp.Host:=host;
icmp.Ping();
if icmp.ReplyStatus.ReplyStatusType<>rsTimeOut then
  ping_func:=icmp.ReplyStatus.MsRoundTripTime
 else
  ping_func:=0;
end;

procedure Tping1.Execute;
var
  ICMPInstance: TIdICMP;
begin
..
ICMPInstance:=TIdIcmpClient.Create(nil);
try
  while not (terminated or application.Terminated) do begin
    res:=ping_func(ICMPInstance, ip_addres);
    synchronize(print_res);
  end;
finally
  ICMPInstance.Free;
end;
..
end;


DeeNamid   (2008-08-04 13:02:00) [89]

Недопонял. Как юзать разные экземпляры?


Сергей М.   (2008-08-04 12:58:00) [90]


> Так и сделано


Нет, сделано не так.

Создавать-то ты создаешь по экземпляру на каждый поток, а юзаешь в каждом потоке один и то же экз-р.


DeeNamid   (2008-08-04 12:55:00) [91]

Так и сделано вот полный вид execut'a

procedure Tping1.Execute;
var b:boolean;i:integer;
begin
 FreeOnTerminate:=true;
 b:=true;
 icmp:=TIdIcmpClient.Create(nil);
 while not (terminated or application.Terminated) do begin
EnterCriticalSection(CS);
 res:=ping_func(ip_addres);
LeaveCriticalSection(CS);
 synchronize(print_res);
 end;
 icmp.Destroy;
end;


DeeNamid   (2008-08-04 12:54:00) [92]

Так и сделано вот полный вид execut'a

procedure Tping1.Execute;
var b:boolean;i:integer;
begin
 FreeOnTerminate:=true;
 b:=true;
 icmp:=TIdIcmpClient.Create(nil);
 while not (terminated or application.Terminated) do begin
EnterCriticalSection(CS);
 res:=ping_func(ip_addres);
LeaveCriticalSection(CS);
 synchronize(print_res);
 end;
 icmp.Destroy;
end;


Сергей М.   (2008-08-04 12:53:00) [93]


> Как сделать так что бы все пинговалось независимо друг от
> друга?
>


Каждый поток должен создавать и юзать свой собственныйэкз-р класса TIdICMP.


Страницы:   1 2 3 4 5

Наверх

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