К чему привязать прогресбар, что бы отображал поиск в базе данных.
» Прогресбар и поиск в базе
Цитата:
поиск в базе данных
может в таблице?
2Alex_Ved
что ты подразумеваешь под "поиск в базе данных" ? если select from ... where - то не получитца, база сама обрабатывает данный запрос и callbackов никаких нету во время сей операции
Если же ты сам чего-то ищешь в TDataSet - легко, количество записей известно, после каждой строки увеличивай процент в ProgressBar
что ты подразумеваешь под "поиск в базе данных" ? если select from ... where - то не получитца, база сама обрабатывает данный запрос и callbackов никаких нету во время сей операции
Если же ты сам чего-то ищешь в TDataSet - легко, количество записей известно, после каждой строки увеличивай процент в ProgressBar
Alex_Ved
redp
с TDataSet, repd прав, легко все работает.
а вот callback'и во всех более-менее серьезных БД есть.
только как правило это муторно и необходимо в очень редких случаях.
сам делал это в оракле и интербазе. хотя грабли еще те.
возможные варианты:
1) вместо прогрессбара использовать какую нить gif-анимацию
2) если объем поиска можно примерно спрогнозировать (с точностью до 20 %), то запросто можно ко времени привязать.
redp
с TDataSet, repd прав, легко все работает.
а вот callback'и во всех более-менее серьезных БД есть.
только как правило это муторно и необходимо в очень редких случаях.
сам делал это в оракле и интербазе. хотя грабли еще те.
возможные варианты:
1) вместо прогрессбара использовать какую нить gif-анимацию
2) если объем поиска можно примерно спрогнозировать (с точностью до 20 %), то запросто можно ко времени привязать.
Цитата:
может в таблице?
Да в таблице. Начало я думал привязать к Query->Open, а вот окончание не знаю к чему привязать. Думаю, что может к колличеству найденных строк и к времени привязать, только вот не знаю, что то count(*) не работает
Alex_Ved
Как уже выше говорили, поиск осуществляется силами СУБД, по сему нельзя спрогнозировать время выдачи результата в TQuery.
Либо делай анимацию, как говорил GreyGendalf,
либо курсорчик превращай в песочные часики....
Как уже выше говорили, поиск осуществляется силами СУБД, по сему нельзя спрогнозировать время выдачи результата в TQuery.
Либо делай анимацию, как говорил GreyGendalf,
либо курсорчик превращай в песочные часики....
Alex_Ved
если в таблице ищешь, ты же можешь всегда точно количество записей посчитать...
если в таблице ищешь, ты же можешь всегда точно количество записей посчитать...
Alex_Ved
какая БД?
какая БД?
Цитата:
если в таблице ищешь, ты же можешь всегда точно количество записей посчитать...
и что? а если в таблице 5000 записей, а искомая окажется 18-ой. прогрессбар оборвется на 0% (или на каком еще, в зависимости от местоположения записи), так что это не метод. с тем же успехом его можно и ко времени привязать. тут конечно можно сделать финт ушами и поступить так: при старте поиска стартует и прогрессбар, стартует по числу записей, а вот когда найдена искомая запись, то прогрессбар за две секунды после этого доходит до конца. иллюзия работы однако. как и GreyGendalf я в свое время занимался насильственной любовью с коллбэками в ибэйзе, но оно того не стоит, разве что из интереса.
так что имхо самый простой и приемлемый путь - анимашка...
Можно проще поступить расчитать количество строк, задать небольшую формулу по позиции прогресбара и посадить ее на таймер по окончании поска ставиш бар на максимум и по другому таймеру его через секунду обнуляеш..... если быстро находится то прогрес бар махом долетает до конца, если медленно то он начинает так вяло перемещаться ближе к концу.....
да можно еще сделать постоянно бегающий бар... доходит до максимума и обнуляется и так пока запись не найдется... Только вот его прейдется выносить в отдельный процес...
да можно еще сделать постоянно бегающий бар... доходит до максимума и обнуляется и так пока запись не найдется... Только вот его прейдется выносить в отдельный процес...
Peroon_N
Только вот его прейдется выносить в отдельный процес...
зачем? можно м просто processmessage добавить в цикл...
Только вот его прейдется выносить в отдельный процес...
зачем? можно м просто processmessage добавить в цикл...
TAnimation - the best solution.
Small job - good work!
Small job - good work!
Цитата:
да можно еще сделать постоянно бегающий бар... доходит до максимума и обнуляется и так пока запись не найдется... Только вот его прейдется выносить в отдельный процес...
Если не трудно, как это в коде для borlanda будет выглядеть.
Цитата:
processmessage
Что это такое, почитал справку, запустил пример, но так и непонял.
Цитата:
Цитата:
processmessage
Что это такое, почитал справку, запустил пример, но так и непонял.
- "...метод, предписывающий приложению обработать поступившие и ожидающие своей очереди сообщения."
Метод нужен для того, чтобы в процессе долгих вычислений, приложение реагировало на действия пользователя.
Если у тебя в отдельном потоке будет идти показ градусника, вызов ProcessMessage, даст возможность приложению обновлять окна, получать сообщения потока и, соответственно, обновлять показания ProgressBar'а
Felix
thks, избавил от объясний
Alex_Ved
в цикл вставляешь строчку
Application.processmessages;
и все.. при желании свой обработчик можно написать...
thks, избавил от объясний
Alex_Ved
в цикл вставляешь строчку
Application.processmessages;
и все.. при желании свой обработчик можно написать...
Подскажите в каком месте или в какой цикл надо добавить Application->ProcessMessages(), а то у меня во время поиска останавливается анимация. Я уже во все места программы пробовал добавить Application->ProcessMessages всё равно тормозит.
В цикл поиска, т.е. там где у тебя сравнивается искомое значение с табличными.
Этот цикл выполняется во время зависания программы. Его можно легко найти в
режиме дебуга.
Этот цикл выполняется во время зависания программы. Его можно легко найти в
режиме дебуга.
А все равно по уму так лучше заводить новый поток. Во-первых - с ProcessMessage некоторая видимость тормозов все равно будет, если же использовать новый поток - никаких подобных трабл. Это раз. Да и ProcessMessage будет стопорить основной поток и соответственно весь поиск - пока он там обработает все мессаджи. А тут будет два потока - для каждого свои кванты процессорного времени.
Цитата:
В цикл поиска, т.е. там где у тебя сравнивается искомое значение с табличными.
Этот цикл выполняется во время зависания программы. Его можно легко найти в
режиме дебуга.
Нет у меня цикла. Искомое значение записывается в Query->SQL и поиск выполняется самой СУБД. Или я чего-то недопонимаю?
To All.
Помогите разобраться с потоками, никогда не сталкивался. Всё сделал как в этом сабже http://forum.ru-board.com/topic.cgi?forum=33&topic=1832#1. Как переопределить метод Execute()? Или для моего случая может нюансы есть?
а с чего вдруг count (*) не работает?
Цитата:
а с чего вдруг count (*) не работает?
Незнаю, может потому что я использую не BDE, а Advantage Database (в нем много чего не работает), но суть не в этом, мне уже count (*) не нужен, я по другому считаю записи.
Может, кто-нибудь мне все-таки объяснит. При нажатии на кнопку поиска, появляется другая форма с анимацией (прогресбаром), при окончании форма убирается. Как сделать, что бы анимация(прогресбар), находящаяся на форме не «замораживалась» при поиске. Если надо новый поток создавать, то объясните подробнее или может, есть другие варианты. Заранее благодарен.
Страницы: 1
Предыдущая тема: Раскраска строк в DevExpress QuantumGrid C++ Builder 6
Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.