Как привязать ProgressBar к процессу в файле

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
strike1984
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 25.07.2006 (Вт) 11:26

Как привязать ProgressBar к процессу в файле

Сообщение strike1984 » 31.10.2006 (Вт) 8:08

Написал простую программку, для кодирования файла методом Хаффмана, программка работает быстро, но хотелось бы видеть как происходит процесс. Для этого я использовал ProgressBar, но после этого все стало тормозить в несколько раз. Мне кажется у меня сначала выполняется progressBar, а потом только кодирование, а по другому не работает, посоветуйте? И еще, насколько я понимаю с Input, происходит обращение и обновление к каждому байту, как сделать, чтобы обновлялся к примеру через каждые 100Кб?
Dim Filenr As Integer
Dim oldtimer As Single
Dim ByteArray() As Byte
Dim Huffman As New clsHuffman
Dim a As String

CommonDialog1.Filename = ""
CommonDialog1.Filter = "(*.*)|*.*|"
CommonDialog1.ShowOpen


If CommonDialog1.Filename <> "" Then
Text2.Text = CommonDialog1.Filename
Debug.Print CommonDialog1.Filename
Open CommonDialog1.Filename For Binary As 1
ProgressBar1.Min = 1
ProgressBar1.Max = LOF(1)
Text1.Text = CommonDialog1.FileTitle
Do While Not Loc(1) = LOF(1)
a = Input$(100, #1)
ProgressBar1.Value = Loc(1)
Loop
Close
Else
Exit Sub
End If

Filenr = FreeFile
Open Text2.Text For Binary As #Filenr
ReDim ByteArray(LOF(Filenr))
Label1.Caption = UBound(ByteArray)
Get #Filenr, , ByteArray()
Close #Filenr

Call Huffman.EncodeByte(ByteArray(), UBound(ByteArray) + 1)

Filenr = FreeFile
Open Text2.Text & ".rbk" For Binary As #Filenr

Put #Filenr, , ByteArray()
Close #Filenr

MsgBox "Типа работает"

End Sub

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

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 31.10.2006 (Вт) 8:39

Тэги!!!!! :twisted:

Какой смысл вот в этой части кода:
Код: Выделить всё
Do While Not Loc(1) = LOF(1)
    a = Input$(100, #1)
    ProgressBar1.Value = Loc(1)
Loop
Close


Строка a нигде не используется и затирается на каждом шаге цикла


З.Ы. Пора награды разного достоинства раздавать за неиспользование тэгов!!! ИМХО.
Весь мир матрица, а мы в нем потоки байтов!

strike1984
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 25.07.2006 (Вт) 11:26

Сообщение strike1984 » 31.10.2006 (Вт) 12:23

a = Input$(100, #1)
по идее в строке, если вместо 100 поставить 100000 можно выиграть, да несколько секунд выигрываю, но все равно большой проигрыш по сравнению без ProgressBar.
Кстати, вот еще прикольный форум есть по VB, http://bit.pirit.info/forum/index.php
там тоже можно спросить или поделиться опытом.

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 31.10.2006 (Вт) 12:33

Еще раз про то же... на кой ты файл дважды читаешь? Первый раз у тебя получается чисто для ProgressBar, второй раз собственно для кодирования... Какой смысл выводить на ProgressBar результат чтения файла никак не связанный с кодированием файла?

З.Ы. А тэги так и остались неизветными автору
Весь мир матрица, а мы в нем потоки байтов!

strike1984
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 25.07.2006 (Вт) 11:26

Сообщение strike1984 » 31.10.2006 (Вт) 12:56

Слушай Viper, ведь по идее весь процесс происходит здесь
Код: Выделить всё
Call Huffman.EncodeByte(ByteArray(), UBound(ByteArray) + 1)

туда что-ли толкать этот код, без a не срабатывает, если строку выше засуну в цикл, это будет абсурд, а коде Хаффмана столько циклов, что глаза разбегаются, по идее ведь ProgressBar без цикла не будет работать, правильно?

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Re: Как привязать ProgressBar к процессу в файле

Сообщение Viper » 31.10.2006 (Вт) 13:10

strike1984 писал(а):Написал простую программку, для кодирования файла методом Хаффмана, программка работает быстро, но хотелось бы видеть как происходит процесс.


для этого тебе надо лезть в метод EncodeBytes и каим-либо образом получать из него проценты выполнения кодирования...

strike1984 писал(а):Для этого я использовал ProgressBar, но после этого все стало тормозить в несколько раз. Мне кажется у меня сначала выполняется progressBar, а потом только кодирование, а по другому не работает, посоветуйте?


Судя по твоему коду, именно это у тебя и происходит... То что у тебя отображается на прогрессбар не имеет к Хаффману никакого отношения... У тебя по сути прогрессбар работает только для того, чтобы работать... Естественно, что код замедляется.
Весь мир матрица, а мы в нем потоки байтов!

strike1984
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 25.07.2006 (Вт) 11:26

Сообщение strike1984 » 31.10.2006 (Вт) 13:20

Продвинутый Гуру, а вообще это ProgressBar может работать как надо и без тормозов, или мне только матрица поможет?

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

Сообщение tyomitch » 31.10.2006 (Вт) 13:27

Может.
Изображение

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 31.10.2006 (Вт) 13:29

Может... Включай девайс под именем Мозг. Все что тебе надо для получения желаемого я тебе сообщил...
Весь мир матрица, а мы в нем потоки байтов!

Glyckmen
Обычный пользователь
Обычный пользователь
 
Сообщения: 72
Зарегистрирован: 30.04.2006 (Вс) 15:32
Откуда: Санкт-Петербург

Re: Как привязать ProgressBar к процессу в файле

Сообщение Glyckmen » 31.10.2006 (Вт) 13:32

strike1984 писал(а):
Код: Выделить всё
 
Filenr = FreeFile
  Open Text2.Text For Binary As #Filenr
    ReDim ByteArray(LOF(Filenr))
    Label1.Caption = UBound(ByteArray)
    Get #Filenr, , ByteArray()
  Close #Filenr

Call Huffman.EncodeByte(ByteArray(), UBound(ByteArray) + 1)


Вот этим куском кода ты читаешь весь файл в массив, а если файл большой то появляется большая вероятность получения ошибки переполнения.
Я недавно тоже делал шифрование файлов, только по другому алгоритму (RC4), я читал файл кусками (в буфер) по 128 кб (можно любой размер буфера выбрать, например 1Мб) и записывал так-же кусками, а уже после обработки этого куска я заполнял прогресс, все это работало в цикле до достижения конца файла, при этом я еще и реализовал вычисление примерного времени окончания шифрования, а если файл маленький то шифрование просходит так быстро что надобность в наблюдении этого процесса отпадает (пользователь все равно ничего не успеет заметить). Еще однин камень, операторы PUT и GET позволяют работать с файлами до 2Гб (тип LONG), если хочешь иметь возможность шифровать файлы более 2Гб то пользуйся функциями API, они и быстрее и позволяют работать с О-Очень большими файлами.

yaklit
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 129
Зарегистрирован: 09.09.2006 (Сб) 19:38

Сообщение yaklit » 31.10.2006 (Вт) 15:07

ооо я не знал что put и get до двух Гигов пригодиться, спсибо те :D [/b]


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

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

Сейчас этот форум просматривают: Bing-бот, Google-бот, Majestic-12 [Bot] и гости: 116

    TopList