Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помощь InternetSetFilePointer & InternetReadFile 
V
    Опции темы
suxxor
Дата 11.12.2011, 17:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 97
Регистрация: 14.10.2010

Репутация: нет
Всего: нет



1) InternetSetFilePointer

Я пытаюсь получить размер файла в сети вызвав:
Код

InternetSetFilePointer(hFile, 0, NULL, FILE_END, 0); // возвращает  -1, с чем может быть связано???


2) InternetReadFile

Нужно вычислить скорость скачивания в цикле чтения из сети:

Код

DWORD dwTick = 0, dwSpeed = 0, dwTemp = 0, dwAvailable = 0;
DWORD dwLenght = InternetSetFilePointer(hFile, 0, NULL, FILE_END, 0); // dwLenght = -1

InternetSetFilePointer(hFile, 0, NULL, FILE_BEGIN, 0);
 
do
{
    if(!InternetQueryDataAvailable(hFile, &dwAvailable, 0, 0))
        dwAvailable = 4096;

    // Allocate Buffer
    buff = new char[dwAvailable];

    // Init Tick Counter
    dwTick = GetTickCount();
    
    // Read Data
    if(InternetReadFile(hFile, buff, dwAvailable, &ulRecv))
    {
        // Speed Calculation
        dwTemp = GetTickCount() - dwTick;

        if(dwTemp)
            dwSpeed = ulRecv / dwTemp; // содержит далёкие  от моей скорости цифры
    }

    // Clean Buffer
    delete buff;
}
while(ulRecv);


Это сообщение отредактировал(а) suxxor - 11.12.2011, 17:40
PM   Вверх
feodorv
Дата 12.12.2011, 08:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 9
Всего: 45



Гм. Гонять указатель сетевого файла туда-сюда...
Слабо представляю себе, что именно делает InternetSetFilePointer, но судя по описанию, файл должен быть достаточно скачен, чтобы указатель попал в скаченное). Так определить длину файла не получится. Более того, сам Web-сервер не обязан присылать длину файла даже в заголовках HTTP-ответа. То есть действовать нужно без учёта длины файла.

Цитата(suxxor @  11.12.2011,  17:37 Найти цитируемый пост)
Нужно вычислить скорость скачивания в цикле чтения из сети

Для этого совсем не обязательно изначально знать размер файла.
Скачивайте по 4 килобайта, оценивая скорость в каждом шаге цикла, пока не достигните конца файла (InternetReadFile как-то уж должен уведомить о том, что достигнут конец файла). Если же отдано меньше 4 к и не конец файла, допросите данных до 4 к. 



--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
feodorv
Дата 12.12.2011, 08:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 9
Всего: 45



И не знаю... Быть может, Вам и хватает GetTickCount. Но сейчас скорости так выросли... Я бы смотрел в сторону более точных инструментов, скажем, QueryPerformanceCounter
.

К тому же меня сильно смущает, что InternetReadFile как-то по-особому трактует HTML-файлы, и это не отключаемо(((

Это сообщение отредактировал(а) feodorv - 12.12.2011, 08:53


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
suxxor
Дата 12.12.2011, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 97
Регистрация: 14.10.2010

Репутация: нет
Всего: нет



А как сделать с QueryPerformanceCounter? Объясните
PM   Вверх
feodorv
Дата 12.12.2011, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 9
Всего: 45



Цитата(suxxor @  12.12.2011,  16:12 Найти цитируемый пост)
А как сделать с QueryPerformanceCounter? Объясните 

Есть неплохая статья по таймингу: Из­ме­ре­ние ин­тер­ва­лов вре­ме­ни в Windows

В принципе, всё то же самое, только надо учитывать частоту таймера:

Код

   LARGE_INTEGER frequency, start, finish;
   double t;

   QueryPerformanceFrequency(&frequency);
   QueryPerformanceCounter(&start);

    //
    //Здесь код, время работы которого замеряем
    //

   QueryPerformanceCounter(&finish);
   t = (double) (stop.QuadPart - finish.QuadPart) / (double) frequency.QuadPart * 1000.0;
   printf( "Time is %u ms\n", (unsigned int) t);


Это сообщение отредактировал(а) feodorv - 12.12.2011, 18:11


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Alca
Дата 12.12.2011, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 5
Всего: 50



https://bitbucket.org/skynowa/xlib/src/2d6d...ug/CxProfiler.h
https://bitbucket.org/skynowa/xlib/src/2d6d.../CxProfiler.cpp

Это сообщение отредактировал(а) Alca - 12.12.2011, 18:22


--------------------
PM WWW ICQ Skype Jabber   Вверх
suxxor
Дата 12.12.2011, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 97
Регистрация: 14.10.2010

Репутация: нет
Всего: нет



feodorv, stop (LARGE_INTEGER) чё за переменная?
Alca, чё это?

Это сообщение отредактировал(а) suxxor - 12.12.2011, 19:52
PM   Вверх
Alca
Дата 13.12.2011, 01:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 5
Всего: 50



Код

 LARGE_INTEGER frequency, start, finish;
   double t;

   QueryPerformanceFrequency(&frequency);
   QueryPerformanceCounter(&start);

    //
    //Здесь код, время работы которого замеряем
    //

   QueryPerformanceCounter(&finish);
   // t = (double) (stop.QuadPart - finish.QuadPart) / (double) frequency.QuadPart * 1000.0;
   t = (double) (finish.QuadPart - start.QuadPart) / (double) frequency.QuadPart * 1000.0;
   printf( "Time is %u ms\n", (unsigned int) t);


Это сообщение отредактировал(а) Alca - 13.12.2011, 01:11


--------------------
PM WWW ICQ Skype Jabber   Вверх
suxxor
Дата 13.12.2011, 17:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 97
Регистрация: 14.10.2010

Репутация: нет
Всего: нет



Да не, я не понял. Мне нужно чтоб значение скорости (а не времени выполнения) генерировалось динамически (в каждом из циклов)

Код

char buff[4096];

do
{
    // ТУТ СОЗДАЁМ ТАЙМЕР?

    if(InternetReadFile(hFile, buff, 4096, &ulRecv))
    {
         // ТУТ ПОЛУЧАЕМ СКОРОСТЬ (КАК ЭТО СДЕЛАТЬ?)
    }
}
while(ulRecv);

что то вроде! у меня не получается это ;(

Это сообщение отредактировал(а) suxxor - 13.12.2011, 17:05
PM   Вверх
Alca
Дата 13.12.2011, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 5
Всего: 50



Цитата

ТУТ ПОЛУЧАЕМ СКОРОСТЬ (КАК ЭТО СДЕЛАТЬ?)

скорость = расстояние / время


--------------------
PM WWW ICQ Skype Jabber   Вверх
Dem_max
Дата 13.12.2011, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 16
Всего: 39



Как бы посмотри эти исходники
http://forum.sources.ru/index.php?showtopic=341170


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
feodorv
Дата 13.12.2011, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 9
Всего: 45



Цитата(Alca @  13.12.2011,  17:13 Найти цитируемый пост)
скорость = расстояние / время 

Ну да. То есть:
Код

скорость = число_скаченных_байт * 8 / время_скачки_в_секундах

Получаем скорость в bps (bits per second).

Соответственно, * 1000.0 из вышеприведённого кода надо убрать...
Плюс надо учесть, что скачивается не всегда 4096 байт (например, в конце файла).

Это сообщение отредактировал(а) feodorv - 13.12.2011, 18:05


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0604 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.