Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ProgressBar при загрузке TTable 
:(
    Опции темы
NiJazz
  Дата 8.4.2004, 07:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Jazz coder
****


Профиль
Группа: Экс. модератор
Сообщений: 2286
Регистрация: 10.8.2003
Где: Москва

Репутация: 6
Всего: 23



Как можно в засисимости от количества записей в таблице "показать" загрузку с помощью PgoressBar? То есть чем больше записей, тем медленнее ползунок...
PM MAIL   Вверх
Cashey
Дата 8.4.2004, 08:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бессмертный
****


Профиль
Группа: Завсегдатай
Сообщений: 3441
Регистрация: 13.11.2002
Где: в столице

Репутация: 2
Всего: 60



Странный вопрос smile.gif
Ну делай цикл
Код
var
i: Integer;
begin
Table1.Active := true;
with ProgressBar1 do
 for i:=1 to Table1.RecordCount do begin
     Position:=Round((i/Table1.RecordCount)*100);
end;
end;



--------------------
библия учит любить ближнего, а камасутра обучает как именно
PM Jabber   Вверх
gray_k
Дата 8.4.2004, 08:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1015
Регистрация: 9.1.2003
Где: Москва

Репутация: 3
Всего: 22



Цитата
Ну делай цикл

Нет, так нельзя. Надо оценить время открытия таблицы заранее. Открывать её в отдельном потоке, а в основном потоке запускать ProgressBar.


--------------------
С уважением.
Gray.
PM MAIL   Вверх
Cashey
Дата 8.4.2004, 09:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бессмертный
****


Профиль
Группа: Завсегдатай
Сообщений: 3441
Регистрация: 13.11.2002
Где: в столице

Репутация: 2
Всего: 60



А зарание никак. В процесс открытия то же вряд ли можно влезть. Можно только сначало открыть таблицу и засечь время
Код
a, b, c : TDateTime;
begin
a := time();
Table1.Active := true;
b := time();
c := b-a;
end;

А потом иммитировать открытие таблицы и показать ProgressBar тем способом, который я уже приводил


--------------------
библия учит любить ближнего, а камасутра обучает как именно
PM Jabber   Вверх
Maverick
Дата 8.4.2004, 09:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1307
Регистрация: 22.9.2003
Где: Odessa, Ukraine

Репутация: 2
Всего: 10



Цитата
Странный вопрос
Ну делай цикл

Код
var
i: Integer;
begin
Table1.Active := true;
with ProgressBar1 do
for i:=1 to Table1.RecordCount do begin
    Position:=Round((i/Table1.RecordCount)*100);
end;
end;


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


--------------------
smile
PM ICQ GTalk   Вверх
Cashey
Дата 8.4.2004, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бессмертный
****


Профиль
Группа: Завсегдатай
Сообщений: 3441
Регистрация: 13.11.2002
Где: в столице

Репутация: 2
Всего: 60



Maverick
ну и как предлогаешь влезть в поток?
И потом, для работы ProgressBar, нужно что-то принять за 100%, а как ты собираешься узнать сколько время будет загружаться таблица, до того момента как она загружена? Это все равно, что сказать как закончится матч РОССИЯ-ПОРТУГАЛИЯ прямо сейчас, не дожидаясь пока матч начнется.


--------------------
библия учит любить ближнего, а камасутра обучает как именно
PM Jabber   Вверх
Maverick
Дата 8.4.2004, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1307
Регистрация: 22.9.2003
Где: Odessa, Ukraine

Репутация: 2
Всего: 10



Cashey
Я просто в шоке.... я счас попробовал - действительно работает.... но как? почему?

Цитата
with ProgressBar1 do
for i:=1 to Table1.RecordCount do begin
    Position:=Round((i/Table1.RecordCount)*100);


Почему движения Bar зависят от степени открытия таблицы - я не вижу здесь связи в коде..... я скорее не поверю собственным глазам.... baaa.gif

Совершенно посторонняя переменная i контролирует Bar.... Что тормозит Bar от мгновенного пробега? Загруженность процессора? Переключение между процессами открытия таблицы и отрисовкой позиции Bar? Значит, все равно потоки косвенно?


--------------------
smile
PM ICQ GTalk   Вверх
x77
Дата 8.4.2004, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1255
Регистрация: 25.3.2002

Репутация: 19
Всего: 22



с таблицами это не получится. с запросами - можно, только не со всеми субд. у запросов есть метод Fetch и свойство (PacketSize, кажется, не помню) отвечающее за кол-во профетчиваемых записей. вот там можно в цикле профетчить все записи, сопровождая это дело беганьем прогрессбара. а варианты с "предугадыванием времени" - это отстой. время зависит и от процессора, и от скорости обращения к винту, и от объёма свободной памяти, и от размера базы, а для сетевых БД - ещё и от пропускной способности сети и загруза её в данный момент. тут запаришься угадывать.


--------------------
Я никогда не сопротивлялся искушению, поскольку узнал: что мне
не нравится, то меня не искушает.
© Джордж Бернард Шоу (Ирландия)
PM MAIL ICQ   Вверх
Maverick
Дата 8.4.2004, 11:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1307
Регистрация: 22.9.2003
Где: Odessa, Ukraine

Репутация: 2
Всего: 10



Работает.... Законектился с сервером, именно Table, выбрал таблицу покрупнее - все отработало и Bar как ручной сделал все..... Я сам вот сижу и думаю как? thumbs-up.gif


--------------------
smile
PM ICQ GTalk   Вверх
gray_k
Дата 8.4.2004, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1015
Регистрация: 9.1.2003
Где: Москва

Репутация: 3
Всего: 22



Да блин не может это работать. Этот код делает совсем не то, что прдполагается в топике. Народ, почитайте об отображении визуальной информации из наборов данных, почитайте ФАК в конце концов, не зря же Вит писал. После открытия таблицы RecordCount не даст правильного количества выбранных записей, если не был сделан FetchAll.
Получается, что сначала НД открыли, а потом пробегаете по его записям. А надо то отобразить время открытия НД. А если ваш Table.Active будет отрабатывать минуты 2, а с БДЕ такое возможно, я сталкивался?
А оценить время открытия *приблизительно) можно. ТОлько здесь общего решения нет. Для каждого вида запроса и движка БД решение своё.


--------------------
С уважением.
Gray.
PM MAIL   Вверх
x77
Дата 8.4.2004, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1255
Регистрация: 25.3.2002

Репутация: 19
Всего: 22



Maverick, что у тебя работает? smile.gif

gray_k, я не знаю, кто что писал, а делается это в два этапа: выполняем запрос вида select count (*) from ...., этот запрос отработает на порядки быстрее любого другого, узнаём из него кол-во записей, потом запускаем сам запрос, уже не count (*), а перечисление полей по-честному (есс-но, с теми же from, where, etc.). после этого открываем запрос и фетчим его потихоньку. кол-во записей, кторое всего придётся фетчить - известно.

есстественно, что с ущербной бде это не работает. а в ado, midas, даже в том же ibx - за милую душу.



--------------------
Я никогда не сопротивлялся искушению, поскольку узнал: что мне
не нравится, то меня не искушает.
© Джордж Бернард Шоу (Ирландия)
PM MAIL ICQ   Вверх
gray_k
Дата 8.4.2004, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1015
Регистрация: 9.1.2003
Где: Москва

Репутация: 3
Всего: 22



Да, если сначала послать запрос на count(*), то работать будет, про это я не подумал smile.gif.
А ты не оценивал, насколько изменится скорость выполнения коде, если после Open сразу сделать FetchAll и если фетчить по одной записи? Просто интересно.


--------------------
С уважением.
Gray.
PM MAIL   Вверх
x77
Дата 8.4.2004, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1255
Регистрация: 25.3.2002

Репутация: 19
Всего: 22



gray_k, всё зависит от способа доступа. в ADO в этом плане много вкусного - асинхронный фетч, масса настроек и т.д. в ibx и TClientDataset - всё немного попроще, но тоже забавно. по скорости - впечатление слишком субъективное smile.gif при фетче по 20-30 записей тебе кажется, что таблица открывается мгновенно, и по мере записей подсасывается из базы. нажмёшь на гриде Ctrl+End - и получишь тот же FetchAll со всеми вытекающими smile.gif так что в принципе смысла в этом особо нет. я по работе всегда делаю FetchAll, и всегда в основном потоке, но это связано с тем, что db-aware контролы я вообще не пользую. для нервных юзеров на экране висит табличка типа "Hold your horses...". и на мой взгляд оптимальный вариант, это
Код

Cursor := crSqlWait;
try
 try
   Table.Active := TRUE;
 except
   on E: Exception do MessageDlg ('Ошибка открытия таблицы:'#13#13 + E.Message, mtError, [mbOk], 0);
 end;
finally
 Cursor := crDefault;
end;

а всякие там прогрессбары - цыганское великолепие. smile.gif

Это сообщение отредактировал(а) x77 - 8.4.2004, 13:50


--------------------
Я никогда не сопротивлялся искушению, поскольку узнал: что мне
не нравится, то меня не искушает.
© Джордж Бернард Шоу (Ирландия)
PM MAIL ICQ   Вверх
Maverick
Дата 8.4.2004, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1307
Регистрация: 22.9.2003
Где: Odessa, Ukraine

Репутация: 2
Всего: 10



Значит так....

Я тоже был уверен, что не сработает....
Кинул на форму Table, DataSource, Grid, Progressbar и кнопку.....
Все обычное - BDE.... Table подключил к серверу Informix к очень большой таблице.... На клик кнопки повесил указанный Cashey код.... прямо скопировал, не менял....

вот это

Цитата
Код
var
i: Integer;
begin
Table1.Active := true;
with ProgressBar1 do
for i:=1 to Table1.RecordCount do begin
    Position:=Round((i/Table1.RecordCount)*100);
end;
end;




Запустил, нажал на кнопку - ProgressBar начал постепенно (!) , равномерно заполняться... Когда заполнился весь - в Grid появилась таблица....

Я сам ОФИГЕЛ, но это факт.... я согласен со всем вами сказанным, это не должно работать.... Я до сих пор не могу понять как.... Я уже много раз запускал и ОФИГИВАЛ....



--------------------
smile
PM ICQ GTalk   Вверх
x77
Дата 8.4.2004, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1255
Регистрация: 25.3.2002

Репутация: 19
Всего: 22



Maverick, офигевать тут не с чего абсолютно. убери весь код после Active := TRUE - и твоя таблица откроется мгновенно. и мгновенно профетчится. в коде, который привел Cashey строчка Position:=Round((i/Table1.RecordCount)*100); даёт дикие тормоза. сделай код таким:

Код

 Table1.Active := true;
 with ProgressBar1 do begin
   Max := Table1.RecordCount;
   for i:=1 to Table1.RecordCount do begin
     Position := i;
//      j := Table1.RecordCount;
   end;
 end;


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

короче говоря, в коде Cashey'я просто исскуственно замедляется проход прогрессбара уже после того, как таблица давно открыта. а пока идёт в цикле обращение к RecordCount - есс-но, записи в гриде не отображаются.
smile.gif
Добавлено @ 14:43
в конце концов, поставь после Active := TRUE всего одну строчку: DBGrid1.Update; и ты увидишь значения полей задолго до конца пробега прогрессбара. другой вариант - вставить ProcessMessages - и ты будешь уже гулять по всей таблице, когда прогресбар будет ещё ползти и ползти smile.gif


--------------------
Я никогда не сопротивлялся искушению, поскольку узнал: что мне
не нравится, то меня не искушает.
© Джордж Бернард Шоу (Ирландия)
PM MAIL ICQ   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0901 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.