| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > VB6 > ProgressBar относительно 2-ух файлов |
| Автор: Voldemar2004 17.3.2005, 21:13 | ||||||
| Дано: c:\file.wav например есть функция определения размера файла. Надо: написать ProgressBar, но так, чтобы он обновлялся в динамическом режиме без участия пользователя. Причем размер файла file.wav - фиксирован, а file.ogg - динамически увеличивается.
делим на 1048576 (1024*1024) чтобы получать размер сразу в Мб. |
| Автор: Naghual 18.3.2005, 11:09 |
| Чегото я не совсем уловил что тебе нужно |
| Автор: Akina 18.3.2005, 11:25 | ||
Ну и? Делаешь отедльную форму с прогресс-баром и таймером. Когда нужен - загружаешь и показываешь его, передаешь ему имена файлов, которые нужно отслеживать. Он сам по таймеру смотрит размеры файлов и рисует прогресс. Когда процесс закончился - закрывается, либо его закрывает приложение. Или - если нужен прогресс-бар на форме - просто добавь таймер с соотв. кодом. Дискретность - порядка 100 мс. |
| Автор: cardinal 18.3.2005, 14:32 | ||
То есть прописывать надо 200 p.s. это так мысли на отвлеченные темы... |
| Автор: Naghual 18.3.2005, 15:11 | ||
Не согласен. Интервал Таймера исчисляется в миллисекундах. И что-бы получить 1с нужно установить интервал 1000. А у чувака того не в порядке со временем было на компе. |
| Автор: cardinal 18.3.2005, 16:09 | ||
Это ясно но на практике на самом деле по другому (так сказал этот чувак в книге)... Но на самом деле правильно Naghual, что не согласен. Я сейчас сварганил маленький тест и он показал, что 1000 более на секунду похоже, чем 500. Интересно где я такую туфту вычитал? |
| Автор: Akina 18.3.2005, 16:22 | ||
| VB6. Кидаем на форму 2 лейбла, таймер на 1000 мс и кнопку. В модуль пишем код:
Стартуем, периодически кликаем кнопку, делаем выводы про чуваков. Не веришь - возьми еще и секундомер. |
| Автор: cardinal 18.3.2005, 16:32 |
| Верю |
| Автор: Naghual 18.3.2005, 16:39 | ||
Но все-же не есть секундой! И это правильно, так-как, этот таймер говняный. Вот если запустить в фоне процесс, например, компресии звука/видео (или любой другой ресурсоемкий), то на секунду больше будет похоже именно 500 а не 1000. Вот такой вот баг в этом таймере от мелкософта. Мораль: Или смирится, или использовать другой таймер. |
| Автор: Akina 18.3.2005, 16:55 | ||||
Тогда используем свойство функции Time получать время из аппаратного таймера. Делаем Timer1 со срабатыванием порядка 50-100 мс и в нем такой код:
|
| Автор: Naghual 18.3.2005, 19:15 |
| Akina, ну согласись, что это тоже очень приближенный таймер. Он реализуется на более далеком от системного таймера уровне и зщависит от того-же мелкософтовского таймера. Лично я не вижу в нем особого смысла. Хотя, как вариант, работать будет. |
| Автор: cardinal 18.3.2005, 19:31 |
| Я думаю этот вариант http://vingrad.ru/VB-VB-002119 остается самым лучшим на данный момент... |
| Автор: Akina 18.3.2005, 19:34 | ||
Не соглашусь. Максимальное его отклонение не превышает времени задержки текущего тика - а если эта задержка более полусекунды, то пора говорить о зависшем процессе... т.е. если в системе нет кривых процессов (как сдохших, так и забывающих отдавать педиорически управление в ось), то точность такого таймера достаточно высока. Кстати, он работает даже если запустить, к примеру, 3 ВинРАРа в приоритетом повыше (типа 12-13) на архивирование данных на виртуальном диске - при дискретности опроса в 100 мс у меня он глотал в среднем 7 ежесекундных тиков из 10, но при 20 мс уже ничего не пропускал... |
| Автор: Naghual 18.3.2005, 19:35 |
| Согласен. |
| Автор: Voldemar2004 20.3.2005, 09:01 |
| Можно еще усложнить задачу: мы никогода точно не знаем размера 2-го файла file.ogg. ProgressBar то застынет где-то на 5%, то опередит файл file.ogg, поэтому в максимальном значении ProgressBar'a надо выставить что-то типа: размер file.wav делим на коэффициент сжатия этого файла (1411/битрейт сжатия=коэфф.) +- 10% от исходного файла. |
| Автор: Voldemar2004 22.3.2005, 16:44 | ||
До меня сразу-то не дошло что надо Прогресс-Бар воткнуть в Timer. Timer я выставил на 1000 - хотя разницы между 100, 200, 500 и 1000 никакой не заметил. Naghual говорит, что если запусть процесс ресурсоемкий, то время криво отображаться будет, так на это можно сделать приоритет минимальный в Диспетчере Задач. И ваще мне кажется это от мощности ЦПУ зависит больше, чем от объекта Timer, который все так ругают - у меня все проходит гладко.
Добавлено @ 16:46 Да, и еще один вопрос: как программно в Visual BAsic убить процесс в Диспетчере Задач например с PID № 1400. Именно УБИТЬ ПРОЦЕСС, а не Снять Задачу! |