![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как правильно отображать ход долгих процессов? [D7]
Anthony © (2010-12-29 01:30:00)Вношу из Delphi изменения в таблицу SQL-сервера, касающиеся каждой строки, коих более 90000, - процесс занимает около 2-3 минут.
Что-бы пользователь не переживал, не зависла ли программа -
отображаю ход процесса с помощью ProgressBar.
Проблема в том - что после того как начал отображаться данный длительный процесс - если уйти с данного окна на другую Windows-задачу, а потом вернуться (или же просто начать мышью кликать на окне исполняемой программы), то Windows начинает отображать окно работающей пограммы - как зависшее, и ProgressBar - больше не отображает свой ход.
Подскажите - как правильно писать код при отображении длительных процессов?
Inovet (2010-12-31 13:22:00) [1]> [29] Cobalt © (31.12.10 12:48)
> написать вместо этого хранимую процедуру будет намного продуктивнее
Не всё сразу, сначала с параметрами разобраться.
Cobalt (2010-12-31 12:48:00) [2]Не, конечно, написать вместо этого хранимую процедуру будет намного продуктивнее :-Р
Плохиш (2010-12-30 15:22:00) [3]
> А шде ты TTable увидел?
Я код увидел, этого достаточно. Там кроме ттабле или тквери в режиме ттабле ничего не подходит.
Dennis I. Komarov (2010-12-30 09:57:00) [4]... дробь крупновата. ИМХО SQL спасет отца русской демократии.
12 (2010-12-30 09:52:00) [5]
> > while not Eof do
> >
> > Next;
> > end;
тут если , то не глядел, наверное и ЗЛО.
Но тут уже другие посоветовали как лучше
Смысл сказанного:
из потока при длительных операциях основному окну сообщать ход выполнения, только это.
Dennis I. Komarov (2010-12-30 09:47:00) [6]
> 12 © (30.12.10 09:21) [24]
ЗЛО советуешь :)
12 (2010-12-30 09:21:00) [7]все
> while not Eof do
>
> Next;
> end;
засунуть в поток
где то написать
> while not Eof do
>
if УСЛОВИЕ then SendMessge(твоему окну процент сделанного в lParam)
> Next;
> end;
Твое окно по этому мессаджу передвигает ProgressBar.Position
В остальное время курит - никакого зависание
Книга была посоветована не случайно, там почти такой же пример рассматривается. Немного переделать только.
Dennis I. Komarov (2010-12-30 09:07:00) [8]
> while not Eof do
> {опрации над текущей записью}
> ProgressBar.Position := ...;
> Next;
> end;
> А как ещё можно отображать ??
ИМХО "Ошибка" здесь.
Ega23 (2010-12-30 08:36:00) [9]
> А почему ни кто не сказал мальчику до сих пор, что ttable
> must die?
А шде ты TTable увидел?
MonoLife (2010-12-30 03:57:00) [10]
> А почему ни кто не сказал мальчику до сих пор, что ttable
> must die?
"мальчику" 40 лет, знает, поди..
Плохиш (2010-12-30 03:30:00) [11]А почему ни кто не сказал мальчику до сих пор, что ttable must die?
Германн (2010-12-30 01:51:00) [12]
> > [12] Anthony © (29.12.10 19:22)
> > простой SQL оператор, обнуляющий всего одно целочисленное
> поле в таблице с 90тыс.записями
>
> что собственно и показано в
>
> > [8] Anthony © (29.12.10 17:55)
> > UPDATE <имя таблицы> SET <имя целочисленного поля> = 0
>
> обнуляется поле во всех записях. Тогда каой цикл и откуда
> тормоза?
>
И более того. Непонятно чем в данном случае мог помочь ProcessMessages?
Inovet (2010-12-29 23:54:00) [13]> [11] Anthony © (29.12.10 19:05)
> И ещё: хотелось бы знать что Inovet © имел ввиду, написав:
>
> > от техники зависит, только не железа а программирования. Параметры надо.
По постам у тебя получается цикл на 90000 итераций в котором, "для каждой записи делаешь какие-то нетривиальные вычисления" и выполняешь запрос на обновление для каждой, а в приведённом запросе не видно параметров, а их бы здесь самое место применить, будет быстрее и правильнее. Но теперь ты говоришь
> [12] Anthony © (29.12.10 19:22)
> простой SQL оператор, обнуляющий всего одно целочисленное поле в таблице с 90тыс.записями
что собственно и показано в
> [8] Anthony © (29.12.10 17:55)
> UPDATE <имя таблицы> SET <имя целочисленного поля> = 0
обнуляется поле во всех записях. Тогда каой цикл и откуда тормоза?
И что там с индексами у тебя? хоть для этого запроса они не нужны. Или есть таки в запросе WHERE?
Anatoly Podgoretsky (2010-12-29 20:00:00) [14]
> Anthony © (29.12.10 19:39) [15]
Без твоего кода, только абстракция.
Anatoly Podgoretsky (2010-12-29 19:49:00) [15]> Anthony (29.12.2010 19:05:11) [11]
Пробуй еще.
Anthony (2010-12-29 19:39:00) [16]Ссылка на pdf файл работает, спасибо!
> выигрыш на 1-ой команде будет мало заметен
- а я имел ввиду всего 1 команду, удивившись, что у кого-то UPDATE выполняется за 3-4 секунды на 172тыс.записей!
И SQL база у меня локальная, поэтому обманывать пользователя аснихронным режимом не получится)
Большое спасибо всем за помощь!
sniknik (2010-12-29 19:27:00) [17]> ссылка на эту книгу к сожалению не работает
а так?
http://podgoretsky.com/ftp/Docs/Delphi/DX/Martin%20Harvey%20-%20Threads.pdf
не получится - зайди на сайт найди там.
> Разве такой код можно написать, чтобы он работал быстрее?
выигрыш на 1-ой команде будет мало заметен. параметры и все остальное заметны когда много запросов в цикле.
хотя, ставишь (если в фибах подобное есть) асинхронный режим команде, без ожидания результата, и будет вид что выполнилось в 1 мсек. подойдет только если клиенту пофиг на результат команды (в смысле а выполнилась ли она вообще там на сервере).
Германн (2010-12-29 19:24:00) [18]
> Я пробовал - ссылка на
> эту книгу к сожалению не работает
Там в [23] написано как пользоваться этой ссылкой.
Anthony (2010-12-29 19:22:00) [19]Спасибо!!
Использование Application.ProcessMessages помогло, я умудрился не увидеть эту подсказку сразу...
Кстати, давая ссылку
> http://www.delphimaster.ru/cgi-bin/forum.pl?id=1282149795&n=3
мне подсказывали почитать про многопоточность?.. Я пробовал - ссылка на
эту книгу к сожалению не работает
И ещё: хотелось бы знать что Inovet © имел ввиду, написав:
> от техники зависит, только не железа а программирования. Параметры надо.
Я же упомянул простой SQL оператор, обнуляющий всего одно целочисленное поле в таблице с 90тыс.записями. А какие ещё "параметры надо"?
Разве такой код можно написать, чтобы он работал быстрее?
Или Вы имели ввиду какие-то опции компоненты, производящей SQL запрос?
Или величину (вес) каждой записи в таблице БД ?
Поясните, если можно...
Anthony (2010-12-29 19:05:00) [20]Спасибо!!
Использование Application.ProcessMessages помогло, я умудрился не увидеть эту подсказку сразу...
Кстати, давая ссылку
> http://www.delphimaster.ru/cgi-bin/forum.pl?id=1282149795&n=3
мне подсказывали почитать про многопоточность?.. Я пробовал - ссылка на
эту книгу к сожалению не работает
И ещё: хотелось бы знать что Inovet © имел ввиду, написав:
> от техники зависит, только не железа а программирования. Параметры надо.
Я же упомянул простой SQL оператор, обнуляющий всего одно целочисленное поле в таблице с 90тыс.записями. А какие ещё "параметры надо"?
Разве такой код можно написать, чтобы он работал быстрее?
Или Вы имели ввиду какие-то опции компоненты, производящей SQL запрос?
Или величину (вес) каждой записи в таблице БД ?
Поясните, если можно...