![]() |
Модераторы: Snowy, Poseidon, MetalFan |
![]() ![]() ![]() |
|
zedx |
|
||||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 63 Регистрация: 29.11.2007 Репутация: нет Всего: нет |
Есть некая многопоточная качалка на базе ICS. Особенность в том, что загружаются в большом количестве, до смешного маленькие файлы (от нескольких десятков байт до максимум 50-100 кБ). Пробую организовать мониторинг скорости загрузки/отдачи данных.
Завёл структуру, для хранения статистики загрузки:
Определил в ICS события для старта таймеров:
Вот, и в итоге получаю одинаковое время начала и окончания загрузки/отдачи, что сводит на нет, все мои попытки считать скорость... ![]() Это что, ограничения точности GetTickCount (и QueryPerformance)? И как, собственно, это можно победить? |
||||||
|
|||||||
RA |
|
|||
![]() Брутальный буратина ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3497 Регистрация: 31.3.2002 Где: Лес Репутация: 10 Всего: 115 |
В составе последнего пакетика ICS есть компонент TMultipartHttpDownloader специально для многопоточной скачки, так вот у него есть хорошие свойсва на борту:
Так что советую использовать его, ну или посмотреть как в нём это реализованно, всё-таки он наследник от HttpCli |
|||
|
||||
zedx |
|
||||
Шустрый ![]() Профиль Группа: Участник Сообщений: 63 Регистрация: 29.11.2007 Репутация: нет Всего: нет |
Я так понял, это для многопоточной скачки одного большого файла (чанками)? Подсчёт статистики реализован через таймер, который срабатывает раз в секунду (предполагается что мы всю эту секунду качали?) - очень грубо и мне такое совсем не поможет.
И идёт подсчёт только скорости загрузки. Исходящая скорость не учитывается... |
||||
|
|||||
RA |
|
|||
![]() Брутальный буратина ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3497 Регистрация: 31.3.2002 Где: Лес Репутация: 10 Всего: 115 |
Странно что у тебя GetTickCount возвращает одно и тоже время, может ошибка именно в его получении ? Или в отображении ?
|
|||
|
||||
zedx |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 63 Регистрация: 29.11.2007 Репутация: нет Всего: нет |
Кхм, какая тут может быть ошибка:
Где-то краем уха слышал, что точность GetTickCount равна 10-20 милисекунд (так же, как и команды sleep)... |
|||
|
||||
RA |
|
|||
![]() Брутальный буратина ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3497 Регистрация: 31.3.2002 Где: Лес Репутация: 10 Всего: 115 |
Кажется я разобрался в чём дело,
OnRequestHeaderEnd - Вызывается перед началом форматирования отправляемого заголовка а не // после отправки хидеров серверу так что фактически равен OnBeforeHeaderSend, а OnDocBegin - Вызывается после того как часть данных уже получена. Для засекания времени исходящего трафика нужно юзать события OnSendBegin - время начала отправки OnSendEnd - время конца отправки OnSendData - изменения в Буфере отправки Для входящего в событии OnStateChange ловим httpWaitingHeader или httpWaitingBody (в зависимости от наличия шапки) - И это будет время начала принятия данных. OnDocEnd - Время окончания получения данных, хотя может и не самый лучший момент ... Это сообщение отредактировал(а) RA - 4.10.2010, 16:40 |
|||
|
||||
zedx |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 63 Регистрация: 29.11.2007 Репутация: нет Всего: нет |
Полный мрак :(
- OnRequestHeaderEnd: возникает не после передачи заголовков, а после засылки их в буфер. - OnSendBegin, OnSendEnd, OnSendData: события при отправке тела запроса (POST). Заголовок же к этому времени уже отправлен. При GET и HEAD запросах не возникают. - httpWaitingHeader: срабатывает ещё до начала формирования заголовков запроса (перед OnBeforeHeaderSend и OnRequestHeaderEnd). - httpWaitingBody: срабатывает, когда часть данных (буфер в 8k?), а в моём случае всё тело уже получено (т.е. аналогично OnDocBegin). Т.е. имеем, что начало запроса определяем по OnBeforeHeaderSend, окончание ответа - по OnDocEnd. Вопрос: как определить "момент истины" когда начинаем получать от сервера хидеры? Upd: Событие OnHeaderBegin, которое по описанию http://www.webdelphi.ru/2010/05/ics-v-delp...onenta-httpcli/ должно бы срабатывать до "момента получения первого зоголовка от сервера" так же срабатывает после получения буфера. Это сообщение отредактировал(а) zedx - 4.10.2010, 20:10 |
|||
|
||||
RA |
|
|||
![]() Брутальный буратина ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3497 Регистрация: 31.3.2002 Где: Лес Репутация: 10 Всего: 115 |
Тогда никак, тут супер точности не достичь. Нужно править компонент, потом патч прислать автору. Собственно в такой форме ICS и существует кто-то что-то где-то исправил и прислал патч. Но люди всё равно любят ICS видимо каждый за своё... |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: Сети" | |
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делится вскрытыми компонентами
Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Сети | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |