Вверх ↑
Этот топик читают: Гость
Гость
Ответов: 17029
Рейтинг: 0
#1: 2016-01-19 08:01:08 правка | ЛС | профиль | цитата


Редактировалось 8 раз(а), последний 2021-06-24 08:53:33
карма: 0

0
Ответов: 100
Рейтинг: -1
#2: 2016-01-19 10:14:05 ЛС | профиль | цитата
WinExec + cmd + ping как альтернативу с возможностю динамически изменять лубые параметры в том числе и нужные вам -l, -w.
карма: 0

0
Ответов: 4630
Рейтинг: 749
#3: 2016-01-19 13:40:46 ЛС | профиль | цитата
г. Юзер писал(а):
Недолго думая, я решил по её шаблону добавить рядом

Правильно. Но поскольку у компонента уже есть нижняя точка ByteCount, то твоей точке нужно дать другое имя, например dtByteCount.
Тогда в коде:
_data_dtByteCount: THI_Event;
_data_TimeOut: THI_Event;

Для того, чтобы задействовать эти точки, в процедуре THIPing._work_doPing замени _prop_TimeOut на ReadInteger(_Data, _data_TimeOut, _prop_TimeOut) и внеси следующие изменения:
#pas
var
hIP : THandle;
BC : Integer;
...
begin
BC := ReadInteger(_Data, _data_dtByteCount, _prop_ByteCount);
hIP := IcmpCreateFile();
...
// И ниже везде _prop_ByteCount замени на BC
end;

Ещё сюда глянь: [url]forum.html?q=3&p=261754#p261754[/url]
карма: 26

0
Гость
Ответов: 17029
Рейтинг: 0
#4: 2016-01-20 16:26:43 правка | ЛС | профиль | цитата


Редактировалось 8 раз(а), последний 2021-06-24 08:53:33
карма: 0

0
Гость
Ответов: 17029
Рейтинг: 0
#5: 2016-01-20 17:39:20 правка | ЛС | профиль | цитата


Редактировалось 8 раз(а), последний 2021-06-24 08:53:33
карма: 0

0
Ответов: 4630
Рейтинг: 749
#6: 2016-01-20 18:05:26 ЛС | профиль | цитата
BC := ReadInteger(_Data, _data_dtByteCountIn, _prop_ByteCount);
Убери dt

ByteCountIn=Количество байт для отправки на удалённый хост|4|1
TimeOutIn=Время ожидания ответа от сервера|4|1
Последняя цифра обозначает код типа данных. В коде ни на что не влияет, в среде точка выделяется другим цветом, подсказывая, какие данные на неё следует подавать.

г. Юзер писал(а):
берёт данные из указанных в её скобках переменных с приоритетным выбором первых
Да, только приоритет согласно описанному в справке: верхняя точка (_data_ByteCountIn), если 0, то свойство (_prop_ByteCount), если и оно 0 - взять из потока (_Data)

г. Юзер писал(а):
чтобы элемент брал инфу сразу из нескольких источников, ему нужно создать переменную типа этой "BC"
В данном случае переменная заводится, если данные нужно использовать в нескольких местах (соотвественно, для ReadInteger(_Data, _data_TimeOut, _prop_TimeOut) я переменной не заводил). То есть вместо 4-х ReadInteger() я завожу переменную и вызываю только один раз, в остальных местах подставляю переменную.
карма: 26

0
Гость
Ответов: 17029
Рейтинг: 0
#7: 2016-01-20 19:09:39 правка | ЛС | профиль | цитата


Редактировалось 8 раз(а), последний 2021-06-24 08:53:32
карма: 0

0
Ответов: 4630
Рейтинг: 749
#8: 2016-01-20 20:17:56 ЛС | профиль | цитата
Могу предположить, что одна из проблем - в использовании имени хоста вместо IP адреса (в коде есть вызов gethostbyname()).
Во-первых, само определение адреса по DNS занимает некоторое время, во-вторых, запись DNS может кешироваться в системе или в провайдера, поэтому последующие вызовы могут быть быстрее. То есть, нужно переделать компонент на использование IP, а не доменного имени (а IP можно получать с помощью компонента Host)

Кроме того, можно в компоненте вынести функции IcmpCreateFile() и IcmpCloseHandle(hIP) за пределы _work_doPing, может они тоже занимают время.

И также сходи по той ссылке, что я выше давал - там есть модификация этого компонента для лучшего определения ошибок.
карма: 26

0
Гость
Ответов: 17029
Рейтинг: 0
#9: 2016-01-20 20:33:51 правка | ЛС | профиль | цитата


Редактировалось 8 раз(а), последний 2021-06-24 08:53:32
карма: 0

0
Ответов: 4630
Рейтинг: 749
#10: 2016-01-20 21:14:01 ЛС | профиль | цитата
Выложи схему, Ping.ini и hiPing.pas.
карма: 26

0
Гость
Ответов: 17029
Рейтинг: 0
#11: 2016-01-20 22:44:25 правка | ЛС | профиль | цитата


Редактировалось 8 раз(а), последний 2021-06-24 08:53:32
карма: 0

0
Ответов: 4630
Рейтинг: 749
#12: 2016-01-21 12:03:10 ЛС | профиль | цитата
Проверил. Задержка всегда примерно одинаковая во всех попытках для разных сайтов. Поэтому проблема не в компоненте, а в твоём интернете.
г. Юзер писал(а):
Если указать очень низкий таймаут (например, 1 мс), элемент будет ждать ответа сервера всё равно куда дольше указанного
Все подобные таймауты в системе имеют определенную точность, поэтому разницы между таймаутом 1 и 30, или 1000 и 1020 нет.
Но время, которое получается в результате команды ping имеет другую природу (измеряется где-то на уровне сетевого интерфейса и его драйверов), поэтому показатель пинга более точный.

Схему можно так сделать:
Add(MainForm,2953706,14,112)
{
Width=250
Height=180
Color=15793151
Font=[Tahoma,8,0,0,1]
Caption="Пингомер"
BorderStyle=4
Position=1
}
Add(Edit,8392031,147,63)
{
Left=60
Top=40
Color=15793151
Font=[Tahoma,10,0,0,1]
Text="32"
Alignment=2
DataType=1
MaxLenField=6
ClearAfterEnter=1
}
Add(Edit,4303247,196,63)
{
Left=130
Top=40
Color=15793151
Font=[Tahoma,10,0,0,1]
Text="1000"
Alignment=2
DataType=1
MaxLenField=10
ClearAfterEnter=1
}
Add(Ping,12335572,98,168)
{
Name=""
ByteCount=0
TimeOut=0
Point(ByteCount)
Point(Time)
link(onFind,7637930:doString,[(220,174)(220,231)(79,231)(79,258)])
link(onFailed,16515319:doMessage,[])
link(Name,3199038:Text,[])
link(ByteCountIn,8392031:Text,[(111,125)(153,125)])
link(TimeOutIn,4303247:Text,[(118,141)(202,141)])
}
Add(Button,16051153,56,168)
{
Left=95
Top=65
Height=25
Font=[Tahoma,10,1,0,1]
Caption="ПИНГ"
link(onClick,12335572:doPing,[])
}
Add(Label,2644215,168,252)
{
Left=3
Top=95
Width=240
Height=60
Color=15793151
Font=[Tahoma,10,1,0,1]
Caption="IP\r\nБайт\r\nЗадержка\r\n"
AutoSize=1
Alignment=2
}
Add(Edit,3199038,98,63)
{
Width=244
Height=25
Align=2
Color=0
Font=[Tahoma,10,0,65535,1]
Name="Адрес"
Text="hiasm.net"
Alignment=2
MaxLenField=1000
ClearAfterEnter=1
}
Add(Message,16515319,161,175)
{
Caption="Ошибка"
Icon=3
}
Add(Label,15041900,98,28)
{
Left=60
Top=25
Width=43
Height=12
Color=15793151
Font=[Tahoma,8,0,0,1]
Caption="Размер:"
}
Add(Label,9752276,196,28)
{
Left=130
Top=25
Height=12
Color=15793151
Font=[Tahoma,8,0,0,1]
Caption="Таймаут:"
}
Add(FormatStr,7637930,91,252)
{
DataCount=3
Mask="IP: %1\r\nБайт: %2\r\nЗадержка: %3"
link(onFString,2644215:doText,[])
link(Str2,12335572:ByteCount,[])
link(Str3,12335572:Time,[])
}

Можешь внести следующие изменения:

#pas
....
(*pHostEn := gethostbyname(pchar(ReadString(_Data,_data_Name,_prop_Name)));
if (GetLastError <> 0) then
begin
_hi_OnEvent(_event_onFailed,2);
goto error;
end;
destAddress := PInAddr(pHostEn^.h_addr_list^)^;*)
destAddress.S_addr := inet_addr(PChar(ReadString(_Data,_data_Name,_prop_Name)));
....
Подай на точку Name не имя сайта, а IP и проверь что изменится.
карма: 26

0
Гость
Ответов: 17029
Рейтинг: 0
#13: 2016-01-21 16:25:13 правка | ЛС | профиль | цитата


Редактировалось 8 раз(а), последний 2021-06-24 08:53:32
карма: 0

0
Ответов: 4630
Рейтинг: 749
#14: 2016-01-21 17:01:11 ЛС | профиль | цитата
У меня нет скачка пинга - всё время выдаёт примерно одинаковое значение (170 +-1 мс). Так что таки в модеме.
Соотношение ошибок похожее.

г. Юзер писал(а):
Но проблема с таймаутом наверняка в элементе
Что-либо сделать на уровне компонента невозможно: как видишь, там идёт вызов системной функции, в которую и передаётся этот таймаут. Если что не так - значит функция так работает.
карма: 26

0
Гость
Ответов: 17029
Рейтинг: 0
#15: 2016-01-21 21:22:21 правка | ЛС | профиль | цитата


Редактировалось 8 раз(а), последний 2021-06-24 08:51:02
карма: 0

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)