Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Прогресбар и поиск в базе

Автор: Alex_Ved
Дата сообщения: 06.04.2004 07:41
К чему привязать прогресбар, что бы отображал поиск в базе данных.
Автор: mastervigo
Дата сообщения: 06.04.2004 12:39

Цитата:
поиск в базе данных

может в таблице?
Автор: redp
Дата сообщения: 06.04.2004 14:45
2Alex_Ved
что ты подразумеваешь под "поиск в базе данных" ? если select from ... where - то не получитца, база сама обрабатывает данный запрос и callbackов никаких нету во время сей операции
Если же ты сам чего-то ищешь в TDataSet - легко, количество записей известно, после каждой строки увеличивай процент в ProgressBar
Автор: GreyGendalf
Дата сообщения: 06.04.2004 16:27
Alex_Ved
redp
с TDataSet, repd прав, легко все работает.
а вот callback'и во всех более-менее серьезных БД есть.
только как правило это муторно и необходимо в очень редких случаях.
сам делал это в оракле и интербазе. хотя грабли еще те.

возможные варианты:
1) вместо прогрессбара использовать какую нить gif-анимацию
2) если объем поиска можно примерно спрогнозировать (с точностью до 20 %), то запросто можно ко времени привязать.
Автор: Alex_Ved
Дата сообщения: 06.04.2004 20:40

Цитата:
может в таблице?

Да в таблице. Начало я думал привязать к Query->Open, а вот окончание не знаю к чему привязать. Думаю, что может к колличеству найденных строк и к времени привязать, только вот не знаю, что то count(*) не работает
Автор: Felix
Дата сообщения: 07.04.2004 07:45
Alex_Ved
Как уже выше говорили, поиск осуществляется силами СУБД, по сему нельзя спрогнозировать время выдачи результата в TQuery.

Либо делай анимацию, как говорил GreyGendalf,
либо курсорчик превращай в песочные часики....
Автор: Sleepwalker
Дата сообщения: 07.04.2004 08:24
Alex_Ved
если в таблице ищешь, ты же можешь всегда точно количество записей посчитать...
Автор: GreyGendalf
Дата сообщения: 07.04.2004 08:35
Alex_Ved
какая БД?
Автор: dotBY
Дата сообщения: 07.04.2004 09:27

Цитата:
если в таблице ищешь, ты же можешь всегда точно количество записей посчитать...

и что? а если в таблице 5000 записей, а искомая окажется 18-ой. прогрессбар оборвется на 0% (или на каком еще, в зависимости от местоположения записи), так что это не метод. с тем же успехом его можно и ко времени привязать. тут конечно можно сделать финт ушами и поступить так: при старте поиска стартует и прогрессбар, стартует по числу записей, а вот когда найдена искомая запись, то прогрессбар за две секунды после этого доходит до конца. иллюзия работы однако. как и GreyGendalf я в свое время занимался насильственной любовью с коллбэками в ибэйзе, но оно того не стоит, разве что из интереса.
так что имхо самый простой и приемлемый путь - анимашка...
Автор: Peroon_N
Дата сообщения: 07.04.2004 09:55
Можно проще поступить расчитать количество строк, задать небольшую формулу по позиции прогресбара и посадить ее на таймер по окончании поска ставиш бар на максимум и по другому таймеру его через секунду обнуляеш..... если быстро находится то прогрес бар махом долетает до конца, если медленно то он начинает так вяло перемещаться ближе к концу.....

да можно еще сделать постоянно бегающий бар... доходит до максимума и обнуляется и так пока запись не найдется... Только вот его прейдется выносить в отдельный процес...
Автор: Sleepwalker
Дата сообщения: 07.04.2004 10:56
Peroon_N
Только вот его прейдется выносить в отдельный процес...
зачем? можно м просто processmessage добавить в цикл...
Автор: UncoNNecteD
Дата сообщения: 07.04.2004 18:56
TAnimation - the best solution.
Small job - good work!
Автор: Alex_Ved
Дата сообщения: 07.04.2004 22:34

Цитата:
да можно еще сделать постоянно бегающий бар... доходит до максимума и обнуляется и так пока запись не найдется... Только вот его прейдется выносить в отдельный процес...

Если не трудно, как это в коде для borlanda будет выглядеть.


Цитата:
processmessage

Что это такое, почитал справку, запустил пример, но так и непонял.
Автор: Felix
Дата сообщения: 08.04.2004 07:56

Цитата:
Цитата:
processmessage

Что это такое, почитал справку, запустил пример, но так и непонял.


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

Если у тебя в отдельном потоке будет идти показ градусника, вызов ProcessMessage, даст возможность приложению обновлять окна, получать сообщения потока и, соответственно, обновлять показания ProgressBar'а
Автор: Sleepwalker
Дата сообщения: 08.04.2004 09:14
Felix
thks, избавил от объясний

Alex_Ved
в цикл вставляешь строчку
Application.processmessages;

и все.. при желании свой обработчик можно написать...
Автор: Alex_Ved
Дата сообщения: 12.04.2004 05:58
Подскажите в каком месте или в какой цикл надо добавить Application->ProcessMessages(), а то у меня во время поиска останавливается анимация. Я уже во все места программы пробовал добавить Application->ProcessMessages всё равно тормозит.
Автор: mastervigo
Дата сообщения: 12.04.2004 07:52
В цикл поиска, т.е. там где у тебя сравнивается искомое значение с табличными.
Этот цикл выполняется во время зависания программы. Его можно легко найти в
режиме дебуга.
Автор: krast
Дата сообщения: 12.04.2004 08:32
А все равно по уму так лучше заводить новый поток. Во-первых - с ProcessMessage некоторая видимость тормозов все равно будет, если же использовать новый поток - никаких подобных трабл. Это раз. Да и ProcessMessage будет стопорить основной поток и соответственно весь поиск - пока он там обработает все мессаджи. А тут будет два потока - для каждого свои кванты процессорного времени.
Автор: Alex_Ved
Дата сообщения: 13.04.2004 06:53

Цитата:
В цикл поиска, т.е. там где у тебя сравнивается искомое значение с табличными.
Этот цикл выполняется во время зависания программы. Его можно легко найти в
режиме дебуга.

Нет у меня цикла. Искомое значение записывается в Query->SQL и поиск выполняется самой СУБД. Или я чего-то недопонимаю?

To All.
Помогите разобраться с потоками, никогда не сталкивался. Всё сделал как в этом сабже http://forum.ru-board.com/topic.cgi?forum=33&topic=1832#1. Как переопределить метод Execute()? Или для моего случая может нюансы есть?
Автор: Tartrout
Дата сообщения: 13.04.2004 17:37
а с чего вдруг count (*) не работает?
Автор: Alex_Ved
Дата сообщения: 14.04.2004 05:33

Цитата:
а с чего вдруг count (*) не работает?

Незнаю, может потому что я использую не BDE, а Advantage Database (в нем много чего не работает), но суть не в этом, мне уже count (*) не нужен, я по другому считаю записи.
Автор: Alex_Ved
Дата сообщения: 16.04.2004 21:12
Может, кто-нибудь мне все-таки объяснит. При нажатии на кнопку поиска, появляется другая форма с анимацией (прогресбаром), при окончании форма убирается. Как сделать, что бы анимация(прогресбар), находящаяся на форме не «замораживалась» при поиске. Если надо новый поток создавать, то объясните подробнее или может, есть другие варианты. Заранее благодарен.

Страницы: 1

Предыдущая тема: Раскраска строк в DevExpress QuantumGrid C++ Builder 6


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.