Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Передача файлов...

290
02 ноября 2009 года
Patr1ot
458 / / 09.02.2008
Всем привет. Вопросик небольшой. Как можно узнать скорость копирования файла по сети. Для последующего его отображения в Label.

Заранее спасибо..
11
02 ноября 2009 года
oxotnik333
2.9K / / 03.08.2007
копируешь руками побайтно (фиксированным объемом) и каждую секунду проверяешь сколько скопировалось.
290
02 ноября 2009 года
Patr1ot
458 / / 09.02.2008
ppc а других вариантов нет. Например как у касперского обновление показывает скорость скачивания обновлений.
11
02 ноября 2009 года
oxotnik333
2.9K / / 03.08.2007
Цитата: Patr1ot
ppc а других вариантов нет. Например как у касперского обновление показывает скорость скачивания обновлений.


ну сломай касперского да посмотри как у него реализовано

7
02 ноября 2009 года
@pixo $oft
3.4K / / 20.09.2006
Цитата: oxotnik333
копируешь руками побайтно (фиксированным объемом) и каждую секунду проверяешь сколько скопировалось.

Это прикол такой в последнее время–заставлять новичков то из потока побайтно читать,то данные побайтно пересылать?:)

Чтобы узнать скорость приёма,надо объём принятых данных разделить на время,за которое они были приняты.На это есть 2 способа:
• создать таймер с периодом 1 с,при приёме данных суммировать их объём.Когда сработает таймер,вывести полученную сумму–это будет количество байт в секунду.Не забывать потом обнулять сумму
• суммирование количества принятых байт.При достижении определённого объёма произвести расчёт времени,за которое оный был принят(естественно,надо задаться временем начала отсчёта и вычесть его из текущего),а потом разделить количество байт на время

11
02 ноября 2009 года
oxotnik333
2.9K / / 03.08.2007
Цитата: @pixo $oft
Это прикол такой в последнее время–заставлять новичков то из потока побайтно читать,то данные побайтно пересылать?:)

Чтобы узнать скорость приёма,надо объём принятых данных разделить на время,за которое они были приняты.На это есть 2 способа:
• создать таймер с периодом 1 с,при приёме данных суммировать их объём.Когда сработает таймер,вывести полученную сумму–это будет количество байт в секунду.Не забывать потом обнулять сумму
• суммирование количества принятых байт.При достижении определённого объёма произвести расчёт времени,за которое оный был принят(естественно,надо задаться временем начала отсчёта и вычесть его из текущего),а потом разделить количество байт на время


я как то по другому сказал? вроде то же самое...

290
02 ноября 2009 года
Patr1ot
458 / / 09.02.2008
Спасибо за ваши ответы. Но для меня наверна это все пока еще сложновато будет...
Но есть еще выход из моей ситуации...
В диспетчере задач есть вкладка сеть. На ней отображается загрузка
сетевого адаптера.
Можно ли программно получить эти цифры загрузки какого либо адаптера, или нет?


____________________________________________
Извените, но все с чего-нибудь начинают...
11
02 ноября 2009 года
oxotnik333
2.9K / / 03.08.2007
 
Код:
while(не конец потока)
{
DWORD start = ::GetTickCount();
// копируем блок (1 Кб к примеру)
DWORD stop = ::GetTickCount() - start;
// 1Кб скопировалось за stop  мс.
}
7
02 ноября 2009 года
@pixo $oft
3.4K / / 20.09.2006
Цитата: Patr1ot
Спасибо за ваши ответы. Но для меня наверна это все пока еще сложновато будет...
Но есть еще выход из моей ситуации...
В диспетчере задач есть вкладка сеть. На ней отображается загрузка
сетевого адаптера.
Можно ли программно получить эти цифры загрузки какого либо адаптера, или нет?

Может,это и возможно(наверняка),но:
• это будет наверняка сложней,чем тебе предложено
• а если параллельно с твоим приложением будет работать другое,которое что-то качает?Тогда результат будет неверным
Вон оксотник даже пример небольшой привёл,а не теорию,как я.Реализуй наздоровье!
Будут конкретные вопросы–задавай

290
03 ноября 2009 года
Patr1ot
458 / / 09.02.2008
На сколько я понял мне нужно написать так:
 
Код:
AnsiString start = CopyFile("C:\\1\\setup.exe","D:\\1\\setup.exe",false);
while(100)
{
 DWORD start = ::GetTickCount();
//копируем блок (1кб к примеру)
 DWORD stop = ::GetTickCount() - start;
// 1кб скопировалось за stop мс.
Label1->Caption=stop;


Но вот этот код неработает.
Может я ошибся но как я понял
в start должен содержаться какой то файл а как связать копирование и приведенный вами пример ненаю...
помогите пожалуйсто разобраться...:(
288
03 ноября 2009 года
nikitozz
1.2K / / 09.03.2007
Цитата: Patr1ot
На сколько я понял мне нужно написать так:



Нет, не так. Надо открыть сначала файл

 
Код:
ifstream f("test.txt", ios::in | ios::binary);

Потом в цикле побайтно его читать
 
Код:
f.read(...)


Хотя где здесь вообще передача файлов? Это просто его копирование.
290
03 ноября 2009 года
Patr1ot
458 / / 09.02.2008
Я тут написал еще кодик примерно так же как вы описывали что для получения скорости нужно принятый обьем информации разделить на время приема информации. Я попробывал маненько по другому, в итоге
прогамма запускается нормально но вот в чем проблемма стоит мне открыть сетевой ресурс который связан с копированием как тут же начинают вылазить бесконечно окна а в окнах написано следующее:
 
Код:
Floating point division by zero

че он пишет я незнаю но явно что то связанное с переменной float

вот код:
Код:
int start =GetTickCount();
    CopyFile("C:\\12.txt","\\\\192.168.4.111\\12.txt",false);
    CopyFile("\\\\192.168.4.111\\12.txt","c:\\12.txt",false);
    float stop =StrToFloat( GetTickCount()-start);//время за которое файл
    был скачен
    FormatFloat("0.00",stop);
    float size = 4;//Размер файла
    float Speed ;
    Speed = (size/stop)*1000;
    Label3->Caption=FormatFloat("0.00", Speed);
    Label2->Caption=Label3->Caption+" Кб./Сек.";
7
03 ноября 2009 года
@pixo $oft
3.4K / / 20.09.2006
Ой-ёй-ёй,что-то вы тут намудрили:)
Я,конечно,не знаток C++,но понимаю,что целые значения пытаться преобразовать функцией StrToFloat,по крайней мере,невежливо по отношению к компилятору.Да и зачем,собственно,вы преобразуете время в миллисекундах,которое может быть только целым(большую точность таймер не позволяет),во float?
Может,дело в моём незнании C++,но можно и без этого обойтись вроде.Вот для результата деления да,насколько я помню,нужна нецелая переменная
И почему
 
Код:
float size = 4;//Размер файла
?У вас файл любой 4 байта?Вообще все операции(например,получение размера файла) надо выполнять до вычисления скорости(ибо они могут внести погрешность в результат)
А так формула
 
Код:
Speed = (size/stop)*1000;
верна,не совсем верна реализация

Upd:ах да,насчёт деления на 0…Время копирования файла может быть так мало,что разница,которая хранится в stop,может оказаться равна 0.Посему проверяйте ваш результат
P.S.Только заметил:зачем файл копировать по сети,а затем возвращать обратно?:)
290
03 ноября 2009 года
Patr1ot
458 / / 09.02.2008
Да я согласен с тем что код немного странноват.
Почему, у меня в коде все время один и тот же размер файла?
Потому что он и есть один файл который служит для своего рода
пинга, отправка прием и все это за определнное время которое указано в
stop.
Почему Копируется туда потом обратно?
Как я обьяснил это своего рода пинг.
А вообще с делением на 0 я свами согласен, именно поэтому я и преобразовал в float за счет точных данных,(ну там 0,33, к примеру)
0 небудет.
На 1000 я умножая для перевода из милисекунд в сеунды.
ведь мне нужно получить Кб.\Сек. а не Кб.\мл.

Вроде все как надо но Ошибка появляющияся при моем обращение к сетевому ресурсу просто убивает.
7
03 ноября 2009 года
@pixo $oft
3.4K / / 20.09.2006
Ололо,вам бы неплохо поподробней почитать про всякие там преобразования,да и не только.Если вы int'овый 0 будете преобразовывать во float(внимание!Функция StrToFloat преобразовывает строку в переменну типа float,и никак иначе!),то у вас как был 0,так и останется.Так-то,я это гарантирую!

Сейчас попробую переписать код(вернее,строчки перетасовать:)),как мне он видится[Highlight=CPP]int start=GetTickCount();
CopyFile("C:\\12.txt","\\\\192.168.4.111\\12.txt",false);
CopyFile("\\\\192.168.4.111\\12.txt","c:\\12.txt",false);
int stop=GetTickCount()-start;//время за которое файл был скачАн
float size=4;//Размер файла(он что,4 байта?)
float Speed;
Speed=size/((float)stop*1000);
Label3->Caption=FormatFloat("0.00", Speed);
Label2->Caption=Label3->Caption+" Кб/с";[/Highlight]На 1000 не там умножали:)
А после единиц измерения точки не ставят.Ещё в школе учили

Upd:вот что,за код не пинайте,пожалуйста.А знающие это дело могут подправить код,за что им от топикстартера будет большая благодарность (=
И просьба такая–указать на мои ошибки.Ну чтоб я в следующий раз таких не допускал
290
03 ноября 2009 года
Patr1ot
458 / / 09.02.2008
Ваши изменения не привели к положительным результатам.
Ошибка как вылетала так и вылетает. Но почемуто перестало высчитываться скорость а именно size/((float)stop*1000);
всегда равно 0.
7
03 ноября 2009 года
@pixo $oft
3.4K / / 20.09.2006
Ну я ж предупреждал,что я не знаток:)
Пусть тогда кто-нибудь более смыслящий поправит

И ещё кое-что:а вы отладкой пользовались?Если нет,то воспользуйтесь и сообщите,на какой строчке возникает сия ошибка
290
03 ноября 2009 года
Patr1ot
458 / / 09.02.2008
Код компилируется без ошибок и даже без предупреждений, но вот
в коде указан сетевой путь: "\\\\192.168.4.111\\updates\\12.txt"
Если во время работы программы зайти в указанную выше сетевую папку посредство Windows из командной строки. Тут же начинает бесконечно вылезать окно: в котором после того как я заменил все float на Int вылазиет сообщение: "Division by zero". Че это такое я незнаю но она очень сильно мешает. программа фактически перестает работать причем немогу понять как это все связано.

Да я немного переделал формулу мне кажется так будет точнее:

1.stop - время за которое проходит отправка\прием файла размером 4кб. получили ответ в мл.
2.1000 - В 1 секунде 1000 мл.
3.4кб. - размер файла

Формула:

(1сек\stop)*4

На мой взгляд таким образом мы получим более точный результат.
Делением одной секунды (1000мл.) на stop(например: 55мл.)
мы узнаем что в 1 сек. с таким интервалом копирования можно скопировать 18 раз. А для получения в Кб. Мы умножаем 18 на размер
файла и получаем ответ 72Кб\сек. То есть за одну секунду мы можем 18 раз скопировать этот файл в данный момент а после умножения мы получаем уже точный ответ.


Самое главное избавиться от этого бесконечного сообщения.
297
04 ноября 2009 года
koodeer
1.2K / / 02.05.2009
Цитата: Patr1ot
...вылазиет сообщение: "Division by zero". Че это такое я незнаю...

Самое главное избавиться от этого бесконечного сообщения.



Из тех обрывков кода, что вы приводите, невозможно понять, где у вас ошибка (великая тайна, да!). Надеюсь, вы понимаете, что Division by zero означает Деление на ноль? Вот и ищите, где у вас происходит деление на ноль. Осмелюсь предположить (выложите больше кода, можно будет сказать точнее), что у вас теряется значение в ходе преобразования из целого в вещественное.
Кусочек кода для размышлений:

 
Код:
printf("%f\n", (float)(1/1000));
printf("%f\n", 1/1000.0);

К тому же у вас нет проверки успешности выполнения функции CopyFile. Она вообще работает? Соединение есть?

И возвращаясь к сабжу темы. Почему бы не использовать, скажем, функцию CopyFileEx для определения скорости копирования файлов?
290
05 ноября 2009 года
Patr1ot
458 / / 09.02.2008
Цитата: koodeer

И возвращаясь к сабжу темы. Почему бы не использовать, скажем, функцию CopyFileEx для определения скорости копирования файлов?



Чет я несовесем уверен в возможности определения скорости функции
CopyFileEx.
Приведите пример, если это возможно...

290
05 ноября 2009 года
Patr1ot
458 / / 09.02.2008
Да действительно CopyFileEx можно использовать для решения данной задачи.

Но релизовать его повидимому сложновато мне самому.

В поиске ничего нет есть только такие же предложения о использовании функции CopyFileEx, впрочем как и на google

Помогите пожалйсто разобраться с этой функцией (ведь ее еще подробно не решали на форуме).

Впринцепе почти все понятно но как это реализовать немного недоганяю.


BOOL CopyFileEx(

LPCWSTR lpExistingFileName,
LPCWSTR lpNewFileName,
LPPROGRESS_ROUTINE lpProgressRoutine,
LPVOID lpData,
LPBOOL pbCancel,
DWORD dwCopyFlags
);

первые две опции я думаю всем понятны это как и в CopyFile, путь_имя_файла, путь_имя_файла.

IpData и pbCancel, незнаю какие команды можно применить.
dwCopyFlags, и какие флаги тож ненаю.

Вот задача посложней с IpProgressRoutine. Как я понял ее нужно организовать отдельно, а как через переменную.

Да и как я понял IpProgressRoute работает как отдельная функция
CopyProgressRoutine.

тогда и там возникают вопросы

DWORD WINAPI CopyProgressRoutine(

LARGE_INTEGER TotalFileSize,
LARGE_INTEGER TotalBytesTransferred,
LARGE_INTEGER StreamSize,
LARGE_INTEGER StreamBytesTransferred,
DWORD dwStreamNumber,
DWORD dwCallbackReason,
HANDLE hSourceFile,
HANDLE hDestinationFile,
LPVOID lpData
);


Тут тоже вопросы. Как всеэто организовать и соединить CopyFileEx с CopyProgressRoutinе.

Уважаемые мудрые головы кому не составит особого труда и особой сложности помогите разобраться со всей этой байдой.
Наверняка токой вопрос не у меня одного, но тем не менее его досканально на форуме не обсуждали и не решали.

_______________________________________
Извените если глупость написал.
288
05 ноября 2009 года
nikitozz
1.2K / / 09.03.2007
Вот вам мой быдлокод с решением. Его конечно надо бы реализовать поэффективней, но суть та.
290
16 ноября 2009 года
Patr1ot
458 / / 09.02.2008
У меня еще один маленький вопросик, а через приведенный вами пример
можно ограничить скорость копирования или нет? Если да то каким способом, немогу сам допетрить. В поиске то же ничего ненашел об этом.
288
16 ноября 2009 года
nikitozz
1.2K / / 09.03.2007
CopyFileEx этого сделать не позволяет. Вы можете конечно "регулировать" скорость передачи играясь со Sleep'ами в CopyProgressRoutine. Только это как-то это некрасиво.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог