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