Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как правильно отображать ход долгих процессов? [D7]


Страницы:   1 2

Anthony ©   (2010-12-29 01:30:00) 

Вношу из Delphi изменения в таблицу SQL-сервера, касающиеся каждой строки, коих более 90000, - процесс занимает около 2-3 минут.
Что-бы пользователь не переживал, не зависла ли программа -
отображаю ход процесса с помощью ProgressBar.
Проблема в том - что после того как начал отображаться данный длительный процесс - если уйти с данного окна на другую Windows-задачу, а потом вернуться (или же просто начать мышью кликать на окне исполняемой программы), то Windows начинает отображать окно работающей пограммы - как зависшее, и ProgressBar - больше не отображает свой ход.
Подскажите - как правильно писать код при отображении длительных процессов?


Inovet   (2010-12-29 18:07:00) [21]

> [8] Anthony ©   (29.12.10 17:55)
> А как ещё можно отображать ??

А где

> [2] WRWRWR   (29.12.10 05:59)
> Application.ProcessMessages в цикле

Не на каждой итерации
или где

> [7] 12 ©   (29.12.10 12:17)
> http://www.delphimaster.ru/cgi-bin/forum.pl?id=1282149795&n=3

А говоришь всё пробовал.

Ну и это

> [8] Anthony ©   (29.12.10 17:55)
> UPDATE SET = 0

от техники зависит, только не железа а программирования. Параметры надо.


sniknik   (2010-12-29 18:04:00) [22]

> что Windows обозначает мою программу во время длительного процесса как зависшую, и если кто знает - пожалуйста подскажите, как именно этого избежать.
сказали во 2 и 7 постах.

> 10 секунд на машине с частотой 2,5 Ггц.
... я проверял на 2Ггц. ХП 32 разрядная, база mdb (Access)

> делаешь какие-то нетривиальные вычисления
вычисления, даже самые нетривиальные обычно занимают где то десятое место после неправильной работы с компонентами/базой.


Anthony   (2010-12-29 17:55:00) [23]

Большое спасибо всем, кто откликнулся помочь!..

И всё же именно мой вопрос остался без ответа, наверное я не сумел его донести. Меня интересует именно то обстоятельство, что Windows обозначает мою программу во время длительного процесса как зависшую, и если кто знает - пожалуйста подскажите, как именно этого избежать.

Всё остальное, что на эту тему подсказали, я уже применяю: увеличиваю шаг перерисовки ProgressBar, отображаю перед операцией курсор как crSQLWait,
подсказки же, что апдейт 172 тысяч записей занимает 4 секунды - наверное
это просто на другой SQL базе и на другой технике такие скорости.

У меня Delphi обращается к базе Firebird через компоненты FIBPlus. И SQL-команда: UPDATE <имя таблицы> SET <имя целочисленного поля> = 0
- идёт на 90000 записей примерно 10 секунд на машине с частотой 2,5 Ггц.

Поэтому, когда идёшь по всей таблице, и для каждой записи делаешь какие-то нетривиальные вычисления, перед тем как обновить данные - это требует время. Пусть не 2-3 минуты, но даже минута - этого уже хватает для того
неприятного обстоятельства, о котором я упоминал: при переключении в другую задачу и возвращении - программа НЕ виснет, но перестаёт отображать процесс!

А вопрос Германна:
> Плохо/неправильно отображаешь.
> Покажи как.
честно говоря немного не понял..

while not Eof do
 {опрации над текущей записью}
 ProgressBar.Position := ...;
 Next;
end;
А как ещё можно отображать ??


12   (2010-12-29 12:17:00) [24]

http://www.delphimaster.ru/cgi-bin/forum.pl?id=1282149795&n=3


WRWRWR   (2010-12-29 08:11:00) [25]

>использование в длинных циклах "притормозит" программу еще больше.

Ну это как делать, можно вообще делать проверку на прибавление счетчика на 1000 и особых задержек выполнения не будит, но и интерфейс не подвиснет.


Ega23   (2010-12-29 08:10:00) [26]

Screen.Cursor := crSQLWait;
try
 Execute 90000 raz
finally
 Screen.Cursor := crDefault;
end;


sniknik   (2010-12-29 07:55:00) [27]

> Application.ProcessMessages
использование в длинных циклах "притормозит" программу еще больше.


sniknik   (2010-12-29 07:53:00) [28]

> коих более 90000, - процесс занимает около 2-3 минут.
посмотрел тут, апдейт 171832 записей (увеличение цены товара на 10%) занимает 4.181(первая проверка)/3.250(вторая) сек. 90000 должно и того меньше... прогресс не нужен, если запрос оптимизировать.


WRWRWR   (2010-12-29 05:59:00) [29]

Application.ProcessMessages в цикле

реализовать можно так

If Odd(I) Then Application.ProcessMessages

где I - счетчик цикла или другая переменная - что там используется?


Германн   (2010-12-29 02:10:00) [30]


> Проблема в том - что после того как начал отображаться данный
> длительный процесс - если уйти с данного окна на другую
> Windows-задачу, а потом вернуться (или же просто начать
> мышью кликать на окне исполняемой программы), то Windows
> начинает отображать окно работающей пограммы - как зависшее,
>  и ProgressBar - больше не отображает свой ход.
>

Плохо/неправильно отображаешь.
Покажи как.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо