![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Прогрес выполнения процедуры [D6, IB6.x]
Kombat © (2002-07-21 12:03:00)Hi All! Есть процедура которая производит изменения в БД, процесс идет примерно 10 минут. Хотелось бы показате пользователю что он не завис)). Переносить всю логику в программу только из-за визуализации прогреса не хочется, замедлится работа. Какие есть методы отображения прогреса. Я думал об возможности использования генераторов (в процедуре увеличиваем его значение, а из программы читаем), но тогдакак наилучшим образом снимать значания генератора из программы, не хотелось бы завалить сервер постоянными SELECT GEN_ID ...
Какие есть еще пути решения этой проблемы?
Заранее благодарен.
kaif (2002-07-21 14:24:00) [21]У меня возникла внезапная идея!
Я никогда так не делал, но это может оказаться гениально...
Сделай в своей хранимой процедуре SUSPEND и возвращай какое- нибудь увеличивающееся число:
CREATE PROCEDURE MY_HEAVY_PROCEDURE(...)
RETURNS(PROGRESS INTEGER)
AS
BEGIN
.... <Всякие тяжелве дела>
Иногда среди них:
IF <некое условие, например, шаг в 1000 записей> THEN
BEGIN
PROGRESS = PROGRESS + 1;
SUSPEND;
END
END
Теперь запускаешь свою тяжелую процедуру не с помощью
EXECUTE PROCEDURE MY_HEAVY_PROCEDURE,
а с помощью:
SELECT PROGRESS FROM MY_HEAVY_PROCEDURE
Процедура начинает просто медленно возвращать набор прогресса.
По-моему это сумасшедшая идея. Главное, IB это позволяет легко сделать.
Каждый следующий FETCH со стороны клиента сделает Update прогресс-бара. Процесс останется однопоточным, как ты хочешь и живым одновременно.
Я сейчас сам побегу такое попробую...
С уважением.
Kombat (2002-07-21 12:24:00) [22]к сожалению анимация не пройдет, просто сейчас обработка идет на 70000 записях, 5 минут, но дальше их будет много больше. Запуск в отдельном потоке не помогает, так как это будет ряд разных по тяжести процедур, который выполняются строго последовательно. Кроме того в процессе работы процедур пользователь и не должен ничего делать паралельно этому, ему просто нужно знать - закончится обработка до конца рабочего дня или уже сейчас можно шагать домой ))
Lola (2002-07-21 12:13:00) [23]Можно вставить какой-нибудь компонент с анимацией. По-моему, это для 10 минут достаточно щадащий вариант.