Dll для побайтового чтения из файла

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 11.01.2005 (Вт) 21:03

2 Eugenio: Возможно я не разобрался, но у меня этот код вообще не пашет. Возвращает 1 раз кусок и все. Да и мне с другими условиями нужно было чуток. :(

2 Tyomitch: Я знаю, что уже достал. Чувствую себя последним чайником..... Позор мне, но можно чуть чуть пояснений к коду, а то я планировал упростить - тормозит немного. Если пару коментов даш, то может тогда допру как ? А то уже стыдно спрашивать :oops:

P.S кстати файл всё равно не до конца читается :(

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 11.01.2005 (Вт) 22:34

Я пробывал выяснить в чём трабл. Код не срабатывает, т.к seek не выскакивает за границы, то последний возврат nbytes=0, хотя данные ещё остались

Или я туплю ?

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 12.01.2005 (Ср) 15:53

Народ.... Я тут вроде с кодом разобрался. Написал свою DLL, но она тормозит жууутко

Скачка 680 метров - 1 час 8 минут. Скорость 156 кб/cек

А через FSO скорость 3,4 мега в секунду, но при этом проблема при чтении... с переносами...

Посоветуйте как код ускорить плиз ? :roll:

Код: Выделить всё
'---Открытие файла
Public Function OpenFile(Path As Variant)
On Error Resume Next
If fNum = 0 Then
   fNum = FreeFile
   Open Path For Binary Access Read As #fNum
End If
OpenFile = Err.Number
End Function

'----Закрытие файла
Public Function CloseFile()
On Error Resume Next
Close #fNum
fNum = 0
CloseFile = Err.Number
End Function

'----Чтение из файла побайтно.
Public Function ReadFile(Bytes As Variant) As Variant
'Если перевалили за границу чтения, то
If Bytes > LOF(fNum) - Loc(fNum) Then Bytes = LOF(fNum) - Loc(fNum)
ReadFile = InputB(Bytes, #fNum)
End Function



Использую так

Код: Выделить всё
Private Sub Form_Activate()

Set STREAM = CreateObject("Binary.STREAM")

STREAM.OpenFile ("C:\mu.wmv")

Do
Bytes = STREAM.ReadFile(10000)
Text1 = Text1 & Bytes
DoEvents
Loop Until Bytes = ""

STREAM.CloseFile
Set STREAM = Nothing
End Sub

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 12.01.2005 (Ср) 19:21

2 all: Ну неужели никак ускорить нельзя ?

2 Tyomitch: Отец, посвяти в таинство как твоя DLL так быстро файл читает ???

Твоя эскиз рисунка в 68 метров генерит за 1,5 секунд.

А моя DLL, файл в 680 метров качает около часа.... :(

Значит можно как то файл быстро читать ???? :(

Eugenio
Постоялец
Постоялец
 
Сообщения: 393
Зарегистрирован: 08.05.2004 (Сб) 13:27
Откуда: Ekaterinburg

Сообщение Eugenio » 12.01.2005 (Ср) 20:01

ALX_2002 писал(а):2 all: Ну неужели никак ускорить нельзя ?


Обычно скорость вполне приличная.
Но для начала
1) не вижу закрытия файла .
2) где объявление fNum?
А вообще, у тебя функция, вроде бы, виснет по той же причине, что и весь собранный тут код :D (мой в том числе :) )
Я в свое время скопировал чужой код и слегка изменил, а в нем-то ошиба, я и не сообразил даже :) :
Если файл не дочитываешь с помощью Get или Input() - т.е. читаешь только до LOF - EOF не возвращает True! Она возвращает True только после того, как мы при чтении зайдем за LOF. Смысл такой. Поэтому не работал предложенный тебе код. Просто, каждый раз читай либо всю порцию полностью либо LOF() - Loc() + 1
Код: Выделить всё
ReadFile = InputB(nBytes, #fNum)

ошибки не будет.
а если
Код: Выделить всё
LOF() - Loc() < nBytes

тогда закрывай файл перед выходом из функции
Попробуй.
Есть ли у меня вопрос? У меня всегда есть вопрос

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 12.01.2005 (Ср) 20:07

А какой смысл его закрывать, у меня

в моём коде
Код: Выделить всё
If Bytes > LOF(fNum) - Loc(fNum) Then Bytes = LOF(fNum) - Loc(fNum)


в твоём
Код: Выделить всё
LOF() - Loc() < nBytes


Разве не равноценно ?

Файл читается до конца.... Но мееедленно....

У FSO чтение происходит за доли секунды, у меня секунд 10-15...

За счёт этого скорость скачки больших файлов отличается в 10 раз..

Я выше уже привёл сравнения моей DLL и Tyomitcha---

У FSO скорость сравнимая с скоростью чтения Dll-ка Tyomitcha

Eugenio
Постоялец
Постоялец
 
Сообщения: 393
Зарегистрирован: 08.05.2004 (Сб) 13:27
Откуда: Ekaterinburg

Сообщение Eugenio » 12.01.2005 (Ср) 20:23

ALX_2002 писал(а):Разве не равноценно ?

разумеется равноценно :)
и что файл закрывается по требованию снаружи - теперь тоже вижу :)
(ИМХО, не совсем это верно, если при окончании чтения позиция в файле не устанавливается на начало)
Плохо просмотрел твой код, извини. Ну что ж - тебе к tyomitch'у,
если скорость чтения у него существенно отличается
Есть ли у меня вопрос? У меня всегда есть вопрос

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 12.01.2005 (Ср) 20:26

Ага... Я просто в шоке... У него за секунду - полторы в память грузятся BMP размером до 68 мегов ! Это на моём серве где скорость проца 440 МГЦ !!! И ещё при этом в памяти DLL ужимает рисунок до нужных размеров !!

Как он это сделал ! Я поражаюсь ! :shock:

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 13.01.2005 (Чт) 6:27

Это, при всё респекте, сделал не он, а создатели GDI+. А он тебе просто простой доступ к объектам GDI+ даёт.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 13.01.2005 (Чт) 8:37

Ага... Просто простой :-)
Изображение

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 13.01.2005 (Чт) 10:50

!@!@&*(#&@ ! А я то уж обрадовался ! - Зашёл сейчас, смотрю последний пост Tyomitch ! Думал сейчас узнаю секрет Домасской стали !

Неужели никак скорость считывания не увеличить ????!!!! :x :cry:

Интересно, а у них в GDI+ нету чтения файла частями ?

Чтобы просто считать файл побайтно ??? :(

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 13.01.2005 (Чт) 12:47

Скорость считывания дана нам свыше хардом... хотя ручки тоже имеют место быть :)

Почему читаешь именно так, а не иначе? Может читать кусками побольше? Может заранее отводить в памяти буфер нужного размера под весь файл?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 13.01.2005 (Чт) 12:52

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

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 13.01.2005 (Чт) 13:06

Отцы.....

Проблема то моя в чём.... :cry:

Мне не в коем случае нельзя файл СРАЗУ грузить в память, потому

как это отнимает много времени. Например файл 680 метров - фильм

-----------------
Всё дело в файловом сервере.

У меня ASP потокм отдаёт файл клиенту.

Всё замечательно, но если СРАЗУ ПЫТАТЬСЯ прочесть весь файл

внутрь, а потом отдавать, то пока байты к юзеру не пойдут, у него окошка сохранения файла не пояявится


Результат - юзер щёлкнул по ссылке, файл начал грузиться в

память.... представляете 600 метров.... в память...

На это уходит минуты 2-3.... За это время юзер успевает щёлкнуть

уже 10 раз подряд по ссылке и свалить мой сервак перегрузом....


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

Т.е

Первые 1000 байт отдал - у юзера окошко появилось, а дальше он начал качать ему остальные пошли....

--------------

Так что мне ниикак нельзя в память весь файл грузить :(

Или я мож чего то не понял ???

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 13.01.2005 (Чт) 13:08

Тогда увеличь блок чтения, кил до 64...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 13.01.2005 (Чт) 13:11

Пробывал..... При чтении через FSO скорость 3 мега в секунду, а при моей DLL как не читай 156 кб в секунду.....

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 13.01.2005 (Чт) 13:13

Увеличь до метра...
Или поищи-таки, где узкое место, точно ли оно в чтении...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 13.01.2005 (Чт) 13:16

Там как не увеличивай, Input Возвращает файло медленне чем FSO.

Я себе сделал пример с 2-мя сабами - FSO меньше секунды файл читает, а моя DLL 12 секунд...
:(

При чём вся DLL - 3 строки... Ни куда не уйти


2 Konst_One - попробывал - скорость не изменилась :(

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 13.01.2005 (Чт) 13:24

Режим чтения смени на input...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 13.01.2005 (Чт) 13:25

Дык мне ж двоичные файло читать ??? :shock:

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 13.01.2005 (Чт) 13:27

Смени...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 13.01.2005 (Чт) 13:28

и границу сам вычисляй, не используй Loc()
прочитал NumberBytes прибавил в свою переменную MyCurrentBytes, а затем сравнил со своей переменной (MyLOF - MyCurrentBytes), которую определил при открытии файла

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 13.01.2005 (Чт) 13:32

Сменил.... Перелапачиваю код.... Т.к терь вместо LOF - EOF....

И так помоему читаются символы, а мне байты нужны.....


Да кстати.... может я не правильно понял ?

Я заменил

Код: Выделить всё
   Open Path For Binary Access Read As #fNum


на

Код: Выделить всё
    Open Path For Input As #fNum


Или имелось в виду - InputB заменить на Input ?
Последний раз редактировалось ALX_2002 13.01.2005 (Чт) 13:36, всего редактировалось 1 раз.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 13.01.2005 (Чт) 13:33

Если ты мне объяснишь разницу между char и byte, я тебя пацалую (c) alibek...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 13.01.2005 (Чт) 13:37

http://www.activeserverpages.ru/articles/read.asp?id=25

Вот оно объяснение :roll:

Я уже вроде постил :scratch: ?

Если бы не было разницы, я бы через FSO всё и сделал.... :(

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 13.01.2005 (Чт) 14:12

Кстати... У NET появилась какая то фича для чтения файлов -

StreamReader

Вот бы до неё добраться :twisted:

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 13.01.2005 (Чт) 14:14

Переходи на ASP .NET, что тебе мешает...
Или просто FW поставь...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 13.01.2005 (Чт) 15:11

2 Gserg: А чего такое FW ? А можно отдельно DLL отвечающую за StreamReder поставить ? :shock:

Статью глянул на счёт FSO ? Byte от CHR отличается ? :?: :(

Или я не разобрался ?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 13.01.2005 (Чт) 15:20

FrameWork. А потом пиши dll на VB .NET, и юзай из страницы :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

ALX_2002
Мега гуру
Мега гуру
 
Сообщения: 2054
Зарегистрирован: 25.11.2002 (Пн) 20:03

Сообщение ALX_2002 » 13.01.2005 (Чт) 15:28

Ууу нее.... Framework ставить ломает. А ведь можно же как то саму DLL только взять из всей этой кухни ???

Так же как например Tyomitch GDI+ взял ?

Пред.След.

Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 150

    TopList