![]() |
| ||
|
|
Новости |
Поиск |
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;
Когда ставишь критическую секцию результаты отображаются адекватно, но пока один поток пингует все остальные его ждут. Как сделать так что бы все пинговалось независимо друг от друга?
Anatoly Podgoretsky (2008-08-05 11:47:00) [21]> Сергей М. (05.08.2008 11:40:08) [68]
Я на индейцах давно поставил очень большой крест. А нас разные пути, я по своей дороге иду, а индейцы по своей. И разбираться с ихним монстром и конкретными функциями у меня нет никакого желания, тем более, что чем дальше, тем больше монстр становится. Кажется уже и авторы сами не понимают, как это вообще работает.
Сергей М. (2008-08-05 11:45:00) [22]
> здесь ведь наверно надо указать создателя компонента
На суть "проблемы" это никакне влияет.
Anatoly Podgoretsky (2008-08-05 11:42:00) [23]> DeeNamid (05.08.2008 11:36:07) [67]
Не обязательно, можно и nil, ведь все зависит от того, кто будет уничтожать компонент, будет ли где либо использоваться значение Owner.
Лично я так никогда не делаю, только Self, разумеется не по отношению к TIdIcmpClient, а ко всем компонентам.
Dennis I. Komarov (2008-08-05 11:41:00) [24]> [67] DeeNamid © (05.08.08 11:36)
для чего?
Medbe}I{onok XML (2008-08-05 11:40:00) [25]создатель - это ты
Сергей М. (2008-08-05 11:40:00) [26]
> у него почему то исчезает многопоточность
Нет, он понимает, почему она исчезает.
Но не понимает, что icmp-запросы требуют уникальнойидентификации секвенций.
В случае с IcmpSendEcho это требование, по всей видимости, обеспечивается неявно, в случае с индейскими ро-сокетами это нужно делать явно.
DeeNamid (2008-08-05 11:36:00) [27]
> Anatoly Podgoretsky © (05.08.08 11:32) [66]
Все ты правильно говоришь.
А скажите мне такую вещь
icmp:=TIdIcmpClient.Create(nil);
здесь ведь наверно надо указать создателя компонента icmp?
Anatoly Podgoretsky (2008-08-05 11:32:00) [28]> Сергей М. (05.08.2008 11:16:05) [65]
Так считать не надо, он пишет, что если он раскомментирует эти строки, то у него почему то исчезает многопоточность. А когда комментирует, то у него возникает проблема с порчей переменных.
Сергей М. (2008-08-05 11:16:00) [29]
> Anatoly Podgoretsky © (05.08.08 11:13) [64]
Строки, управляющие КС, у него везде закомментарены.
Считаем, что он КС не использует.
Anatoly Podgoretsky (2008-08-05 11:13:00) [30]> Сергей М. (05.08.2008 11:02:01) [61]
Не из его кода
EnterCriticalSection(CS);
res:=ping_func(ip_addres);
LeaveCriticalSection(CS);
Вот это убивает многопоточность.
Anatoly Podgoretsky (2008-08-05 11:12:00) [31]> DeeNamid (05.08.2008 10:39:00) [60]
Потому что у тебя программа не работает.
И с чего ты взял, что не могу, ты не путай не хочу с не могу.
Сергей М. (2008-08-05 11:11:00) [32]
> покажите мне мои ошибки
Ты не учитываешь вот это:
SequenceID is a Word value used as a packet identifier for the Ping request. SequenceID is also used when decoding the response packets for a Ping request. When SequenceID contains a non-zero value, it is used to match an echo response to the original ping request with the same sequence identifer. SequenceID can be set to a unique value to identify a specific Ping request and/or response
Copyright © 1993-2006, Chad Z. Hower (aka Kudzu) and the Indy Pit Crew. All rights reserved.
Сергей М. (2008-08-05 11:02:00) [33]
> Anatoly Podgoretsky © (05.08.08 09:30) [53]
Ты имеешь ввиду КС в потрохах самОй IcmpSendEcho ?
DeeNamid (2008-08-05 10:39:00) [34]
> Anatoly Podgoretsky
А кому не лень? И зачем ты тогда говоришь что у меня ошибки в реализации, если не можешь на эти ошибки указать?
Anatoly Podgoretsky (2008-08-05 10:28:00) [35]> DeeNamid (05.08.2008 10:25:58) [58]
А нафига мне столько раз смотреть?
Проси кого ни будь другого, кому не лень много раз смотреть.
DeeNamid (2008-08-05 10:25:00) [36]
> Anatoly Podgoretsky
Елки-палки, да что там разбираться, 40 строк кода. Посмотри на 10-ый пост, там весь код написан.
Anatoly Podgoretsky (2008-08-05 10:08:00) [37]А всем лень в таком коде разбираться. Слишком много телепатии надо применять.
DeeNamid (2008-08-05 09:59:00) [38]
> Anatoly Podgoretsky
Покажи где. Два дня прошу людей - покажите мне мои ошибки.
Anatoly Podgoretsky (2008-08-05 09:52:00) [39]> DeeNamid (05.08.2008 9:47:54) [54]
Так у тебя ошибки в реализации, потому и ерунда.
DeeNamid (2008-08-05 09:47:00) [40]
> Anatoly Podgoretsky
Ну да, вот тут и проблема, а если не защищать то получается ерунда