![]() |
| ||
|
|
Новости |
Поиск |
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;
Когда ставишь критическую секцию результаты отображаются адекватно, но пока один поток пингует все остальные его ждут. Как сделать так что бы все пинговалось независимо друг от друга?
Medbe}I{onok XML (2008-08-04 16:45:00) [61]На якобы имеющее место "проблему" эти "ужасы" никак не влияют)
Влияют на скорость понимания что они и правда не влияют.
:)
Medbe}I{onok XML (2008-08-04 16:44:00) [62]к тому же будет побочный положительный эффект:
нитка и главная форма потеряют имеющуюся чудовищную взаимозависимость между собой и отлаживать все станет проще.
Сергей М. (2008-08-04 16:43:00) [63]
> спасаю от ужасов print_res
>
На якобы имеющее место "проблему" эти "ужасы" никак не влияют)
Medbe}I{onok XML (2008-08-04 16:41:00) [64]я его спасаю от ужасов print_res
Сергей М. (2008-08-04 16:41:00) [65]
> Medbe}I{onok XML © (04.08.08 16:38) [28]
Ну и какая нафих разница ? Что, от вида синхронизации зависит трип-тайм ?)
Medbe}I{onok XML (2008-08-04 16:38:00) [66]procedure TForm1.Button1Click(Sender: TObject);
begin
ping1:=Tping.Create('93.158.134.3',Handle,1);
ping2:=Tping.Create('172.21.161.34',Handle,2);
ping3:=Tping.Create('172.21.61.44',,Handle,3);
ping4:=Tping.Create('10.61.1.126',Handle,4);
ping5:=Tping.Create('172.21.61.46',Handle,5);
Medbe}I{onok XML (2008-08-04 16:36:00) [67]constructor Tping.create(ip_addr: string;fMainFormHandle : HWND;fNumberForMemo : integer);
DeeNamid (2008-08-04 16:33:00) [68]То есть,
constructor Tping.create(ip_addr: string;i:integer;fMainFormHandle;fNumberForMemo);
так? Номер мемо просто цифра? И где взять хендл ?
Сергей М. (2008-08-04 16:32:00) [69]
> почему локальную переменную имеют все подряд?
Никто ее не "имеет")
С логикой в твоем коде все более-менее в порядке.
Пробуй пинговать хосты из разныхконцов Тырнета - получишь разные результаты.
Medbe}I{onok XML (2008-08-04 16:31:00) [70]Точнее так, если там надо пинговать пока рак не свистнет:
procedure Tping.Execute;
var icmp: TIdIcmpClient;
begin
FreeOnTerminate:=true; //Это в конструктор убрать
icmp:=TIdIcmpClient.Create(nil);
while not (terminated or application.Terminated) do begin
res:=ping_func(icmp,ip_addres);
PostMessage(fMainFormHandle,WM_MYPING_MSG,<fNumberForMemo>,LParam
end;
icmp.Destroy;
(res));
end;
Medbe}I{onok XML (2008-08-04 16:29:00) [71]fMainFormHandle (хендл окна с лежащим не ём мемом) и fNumberForMemo (в каком мемо рисовать результат) передавать конструктору вторичного потока.
Medbe}I{onok XML (2008-08-04 16:28:00) [72]procedure Tping.Execute;
var icmp: TIdIcmpClient;
begin
FreeOnTerminate:=true; //Это в конструктор убрать
icmp:=TIdIcmpClient.Create(nil);
while not (terminated or application.Terminated) do begin
res:=ping_func(icmp,ip_addres);
end;
icmp.Destroy;
PostMessage(fMainFormHandle,WM_MYPING_MSG,<fNumberForMemo>,LParam(res));
end;
DeeNamid (2008-08-04 16:27:00) [73]Ладно это не важно, мне надо понять в чем проблема, почему локальную переменную имеют все подряд?
Сергей М. (2008-08-04 16:25:00) [74]А ты вообще понимаешь, что означает и как вычисляется св-во MsRoundTripTime ?
Оно никаким боком не относится к "время до хоста".
DeeNamid (2008-08-04 16:25:00) [75]Что-то как-то ты категорично вещаешь. Объясни подробнее плиз что такое
> результат передавать в WParam или LParam?
Medbe}I{onok XML (2008-08-04 16:22:00) [76]результат пинга число?
убрать всю эту ахинею. после окончания пинга и получения результата посылать главному окну сообщение, результат передавать в WParam или LParam
DeeNamid (2008-08-04 16:16:00) [77]Ну к примеру 154, тогда на вывод получается:
Время до хоста: 154 ms
и так пять раз на все окна.
Сергей М. (2008-08-04 16:13:00) [78]
> res для всех потоков имеет одинаковое значение
Какое конкретно ?
DeeNamid (2008-08-04 16:01:00) [79]Зависимость заключается в том что все пять потоков выводят на экран одни и те же значения.
Есть пять потоков и пять компонентов memo, на которые должны выводиться результаты пинга. Если использовать критическую секцию то все происходит нормально, то есть в каждом окошке отображаются корректные результаты. Но в этом случае пока пингует один поток, остальные его ждут, а это не гуд. Если же закомментировать эту секцию, то происходит следующее - все окошки отображают одни и те же цифры, при чем при отладке в watch'е видно что в процедуре print_res сам res для всех потоков имеет одинаковое значение. Вот в этом и вопрос - почему так происходит что res открыт для всех потоков, если он является локальной переменной класа TPing?
Сергей М. (2008-08-04 15:47:00) [80]
> DeeNamid © (04.08.08 14:58) [13]
А в чем, по-твоему, выражается их "зависимость друг от друга", в данный момент, т.е. при реализации, приведенной тобой в [10] ?