![]() |
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]() ![]() ![]() |
|
NiJazz |
|
|||
![]() Jazz coder ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2286 Регистрация: 10.8.2003 Где: Москва Репутация: 6 Всего: 23 |
Как можно в засисимости от количества записей в таблице "показать" загрузку с помощью PgoressBar? То есть чем больше записей, тем медленнее ползунок...
|
|||
|
||||
Cashey |
|
|||
![]() Бессмертный ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3441 Регистрация: 13.11.2002 Где: в столице Репутация: 2 Всего: 60 |
Странный вопрос
![]() Ну делай цикл
-------------------- библия учит любить ближнего, а камасутра обучает как именно |
|||
|
||||
gray_k |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1015 Регистрация: 9.1.2003 Где: Москва Репутация: 3 Всего: 22 |
Нет, так нельзя. Надо оценить время открытия таблицы заранее. Открывать её в отдельном потоке, а в основном потоке запускать ProgressBar. -------------------- С уважением. Gray. |
|||
|
||||
Cashey |
|
|||
![]() Бессмертный ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3441 Регистрация: 13.11.2002 Где: в столице Репутация: 2 Всего: 60 |
А зарание никак. В процесс открытия то же вряд ли можно влезть. Можно только сначало открыть таблицу и засечь время
А потом иммитировать открытие таблицы и показать ProgressBar тем способом, который я уже приводил -------------------- библия учит любить ближнего, а камасутра обучает как именно |
|||
|
||||
Maverick |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1307 Регистрация: 22.9.2003 Где: Odessa, Ukraine Репутация: 2 Всего: 10 |
Странный подход, я бы сказал.... По-моему, действительно дело в обработке потоков.... |
|||
|
||||
Cashey |
|
|||
![]() Бессмертный ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3441 Регистрация: 13.11.2002 Где: в столице Репутация: 2 Всего: 60 |
Maverick
ну и как предлогаешь влезть в поток? И потом, для работы ProgressBar, нужно что-то принять за 100%, а как ты собираешься узнать сколько время будет загружаться таблица, до того момента как она загружена? Это все равно, что сказать как закончится матч РОССИЯ-ПОРТУГАЛИЯ прямо сейчас, не дожидаясь пока матч начнется. -------------------- библия учит любить ближнего, а камасутра обучает как именно |
|||
|
||||
Maverick |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1307 Регистрация: 22.9.2003 Где: Odessa, Ukraine Репутация: 2 Всего: 10 |
Cashey
Я просто в шоке.... я счас попробовал - действительно работает.... но как? почему?
Почему движения Bar зависят от степени открытия таблицы - я не вижу здесь связи в коде..... я скорее не поверю собственным глазам.... ![]() Совершенно посторонняя переменная i контролирует Bar.... Что тормозит Bar от мгновенного пробега? Загруженность процессора? Переключение между процессами открытия таблицы и отрисовкой позиции Bar? Значит, все равно потоки косвенно? |
|||
|
||||
x77 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1255 Регистрация: 25.3.2002 Репутация: 19 Всего: 22 |
с таблицами это не получится. с запросами - можно, только не со всеми субд. у запросов есть метод Fetch и свойство (PacketSize, кажется, не помню) отвечающее за кол-во профетчиваемых записей. вот там можно в цикле профетчить все записи, сопровождая это дело беганьем прогрессбара. а варианты с "предугадыванием времени" - это отстой. время зависит и от процессора, и от скорости обращения к винту, и от объёма свободной памяти, и от размера базы, а для сетевых БД - ещё и от пропускной способности сети и загруза её в данный момент. тут запаришься угадывать.
-------------------- Я никогда не сопротивлялся искушению, поскольку узнал: что мне не нравится, то меня не искушает. © Джордж Бернард Шоу (Ирландия) |
|||
|
||||
Maverick |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1307 Регистрация: 22.9.2003 Где: Odessa, Ukraine Репутация: 2 Всего: 10 |
Работает.... Законектился с сервером, именно Table, выбрал таблицу покрупнее - все отработало и Bar как ручной сделал все..... Я сам вот сижу и думаю как?
![]() |
|||
|
||||
gray_k |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1015 Регистрация: 9.1.2003 Где: Москва Репутация: 3 Всего: 22 |
Да блин не может это работать. Этот код делает совсем не то, что прдполагается в топике. Народ, почитайте об отображении визуальной информации из наборов данных, почитайте ФАК в конце концов, не зря же Вит писал. После открытия таблицы RecordCount не даст правильного количества выбранных записей, если не был сделан FetchAll.
Получается, что сначала НД открыли, а потом пробегаете по его записям. А надо то отобразить время открытия НД. А если ваш Table.Active будет отрабатывать минуты 2, а с БДЕ такое возможно, я сталкивался? А оценить время открытия *приблизительно) можно. ТОлько здесь общего решения нет. Для каждого вида запроса и движка БД решение своё. -------------------- С уважением. Gray. |
|||
|
||||
x77 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1255 Регистрация: 25.3.2002 Репутация: 19 Всего: 22 |
Maverick, что у тебя работает?
![]() gray_k, я не знаю, кто что писал, а делается это в два этапа: выполняем запрос вида select count (*) from ...., этот запрос отработает на порядки быстрее любого другого, узнаём из него кол-во записей, потом запускаем сам запрос, уже не count (*), а перечисление полей по-честному (есс-но, с теми же from, where, etc.). после этого открываем запрос и фетчим его потихоньку. кол-во записей, кторое всего придётся фетчить - известно. есстественно, что с ущербной бде это не работает. а в ado, midas, даже в том же ibx - за милую душу. -------------------- Я никогда не сопротивлялся искушению, поскольку узнал: что мне не нравится, то меня не искушает. © Джордж Бернард Шоу (Ирландия) |
|||
|
||||
gray_k |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1015 Регистрация: 9.1.2003 Где: Москва Репутация: 3 Всего: 22 |
Да, если сначала послать запрос на count(*), то работать будет, про это я не подумал
![]() А ты не оценивал, насколько изменится скорость выполнения коде, если после Open сразу сделать FetchAll и если фетчить по одной записи? Просто интересно. -------------------- С уважением. Gray. |
|||
|
||||
x77 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1255 Регистрация: 25.3.2002 Репутация: 19 Всего: 22 |
gray_k, всё зависит от способа доступа. в ADO в этом плане много вкусного - асинхронный фетч, масса настроек и т.д. в ibx и TClientDataset - всё немного попроще, но тоже забавно. по скорости - впечатление слишком субъективное
![]() ![]()
а всякие там прогрессбары - цыганское великолепие. ![]() Это сообщение отредактировал(а) x77 - 8.4.2004, 13:50 -------------------- Я никогда не сопротивлялся искушению, поскольку узнал: что мне не нравится, то меня не искушает. © Джордж Бернард Шоу (Ирландия) |
|||
|
||||
Maverick |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1307 Регистрация: 22.9.2003 Где: Odessa, Ukraine Репутация: 2 Всего: 10 |
Значит так....
Я тоже был уверен, что не сработает.... Кинул на форму Table, DataSource, Grid, Progressbar и кнопку..... Все обычное - BDE.... Table подключил к серверу Informix к очень большой таблице.... На клик кнопки повесил указанный Cashey код.... прямо скопировал, не менял.... вот это
Запустил, нажал на кнопку - ProgressBar начал постепенно (!) , равномерно заполняться... Когда заполнился весь - в Grid появилась таблица.... Я сам ОФИГЕЛ, но это факт.... я согласен со всем вами сказанным, это не должно работать.... Я до сих пор не могу понять как.... Я уже много раз запускал и ОФИГИВАЛ.... |
|||
|
||||
x77 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1255 Регистрация: 25.3.2002 Репутация: 19 Всего: 22 |
Maverick, офигевать тут не с чего абсолютно. убери весь код после Active := TRUE - и твоя таблица откроется мгновенно. и мгновенно профетчится. в коде, который привел Cashey строчка Position:=Round((i/Table1.RecordCount)*100); даёт дикие тормоза. сделай код таким:
и у тебя всё будет летать. а потом откомментируй вон ту строчку с обращением к RecordCount - и получишь тоже самое, что и было. короче говоря, в коде Cashey'я просто исскуственно замедляется проход прогрессбара уже после того, как таблица давно открыта. а пока идёт в цикле обращение к RecordCount - есс-но, записи в гриде не отображаются. ![]() Добавлено @ 14:43 в конце концов, поставь после Active := TRUE всего одну строчку: DBGrid1.Update; и ты увидишь значения полей задолго до конца пробега прогрессбара. другой вариант - вставить ProcessMessages - и ты будешь уже гулять по всей таблице, когда прогресбар будет ещё ползти и ползти ![]() -------------------- Я никогда не сопротивлялся искушению, поскольку узнал: что мне не нравится, то меня не искушает. © Джордж Бернард Шоу (Ирландия) |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: Общие вопросы" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |