![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Останавливается информация о ходе выполнения процесса [D7, XP]
kyn66 © (2009-11-06 13:11:00)Добрый день, мастера. Во время загрузки данных в таблицу(процесс занимает определенное время) информирую пользователя о ходе выполнения процесса через ProgressBar и цифровую информацию в процентах http://yurec66.narod.ru/Vopros/proc.jpg. Если не совершать никаких действий, все идет нормально. Вот код обработки:
SL := TStringList.Create;
SL.LoadFromFile(ImportPath + FName);
PB1.Max := SL.Count;
PB1.Position := 0;
Nzap := 0;
NzapV := 0;
NzapC := Trunc(SL.Count/100);
for i := 0 to SL.Count - 1 do
begin
SS := SL[i];
...
// ряд некоторых операций
...
PB1.Position := PB1.Position + 1;
Inc(Nzap);
if Nzap >= NzapC then
begin
Inc(NzapV);
ProcLab.Caption := IntToStr(NzapV) + ' %';
ProcLab.Update;
Nzap := 0;
end;
// еще одна операция некоторая
end;
SL.Destroy;
PB1.Position := 0;
Стоит только перключиться на другое окно или это в фоне сделает любая юругая программа(т.е. окно с прогрессом теряет фокус) - прогресс сразу же замирает, цифры процентов не меняются. СОздается впечатление, что прога зависла, хотя процесс обработки данных выполняется. Как это выличить? ЧТобы и при потере фокуса прогресс с процентами не переставали информировать юзера?
Сергей М. (2009-11-07 23:51:00) [21]
> Нет, стандартно все
И никакой XP-манифест тоже не используется ?
Сергей М. (2009-11-07 23:50:00) [22]А вот так
SplashFrm := TSplashFrm.Create(Application);
SplashFrm.Lab1.Caption := 'Выполняется удаление, ожидайте...';
SplashFrm.Show;
while true do Application.ProcessMessages;
тикают ?
kyn66 (2009-11-07 23:49:00) [23]
> А тема раб.стола у тебя какая-либо установлена ?
Нет, стандартно все. Это каким то боком тоже может влиять? Так глубоко?
kyn66 (2009-11-07 23:48:00) [24]
...
SplashFrm := TSplashFrm.Create(Application);
SplashFrm.Lab1.Caption := 'Выполняется удаление, ожидайте...';
SplashFrm.Show;
// SplashFrm.Update;
Application.ProcessMessages;
while true do
(*
tir := DM1.SvodTSLTblTir.Value;
...
Ничего не меняется.
Внутри SplashFrm есть этот кусочек (для справки)
procedure TSplashFrm.FormShow(Sender: TObject);
begin
SplashFrm.Width := Lab1.Width + 100;
end;
Может это как влияет?
Сергей М. (2009-11-07 23:42:00) [25]
> Странно
Я ж тебе сказал уже три раза - замениUpdate после Show на Processmessages
Сергей М. (2009-11-07 23:41:00) [26]А тема раб.стола у тебя какая-либо установлена ?
kyn66 (2009-11-07 23:40:00) [27]
> а если все что после TSplashFrm.Update до end заменить на
> while true do - картина меняется ?
Тоже молчат... Странно...
Сергей М. (2009-11-07 23:40:00) [28]Да по барабану что он там делал)
Принципиальна лишь занятость осн.потока какой либо (не важно какой) блокирующей операцией, изменяющей или не изменяющей приоритеты потоков ..
kyn66 (2009-11-07 23:35:00) [29]Для справки:
Вышеприведенный код удалял 121'421 запись из 2'693'521 . Затраченное время - 98.156 сек. Celeron 2400, 1Гб
Сергей М. (2009-11-07 23:33:00) [30]а если все что после TSplashFrm.Update до end заменить на while true do - картина меняется ?
kyn66 (2009-11-07 23:21:00) [31]
> Тогда зачем в твоей редакции стоит MesFrm.Update ?
Для перерисовки метки. Первый раз наверное.
Сергей, короче проверил сейчас аничасики на другой затяжной операции по удалении данных из таблицы. Так вот, при таком раскладе, как показано ниже, часики НЕ ТИКАЮТ. Ваш выход, Мастер!
procedure TTiragSLFrm.DelBtnClick(Sender: TObject);
Var
tir : Integer;
begin
if VoprosMsg('Вы действительно хотите удалить тираж "' +
DM1.SvodTSLTblTir.AsString + '" ?', 2) then
begin
Screen.Cursor := crHourGlass;
SplashFrm := TSplashFrm.Create(Application);
SplashFrm.Lab1.Caption := 'Выполняется удаление, ожидайте...';
SplashFrm.Show;
SplashFrm.Update;
tir := DM1.SvodTSLTblTir.Value;
with TAdsQuery.Create(nil) do
try
AdsConnection := DM1.AdsConnection1;
ParamCheck := True;
SQL.Add('DELETE FROM TiragSL WHERE Tir = :p0');
Params[0].Value := tir;
ExecSQL;
finally
Free;
end;
If DM1.SvodTSLTbl.FindKey([Tir]) then
begin
DM1.SvodTSLTbl.Delete;
DM1.SvodTSLTbl.Refresh;
DelTir := True;
end;
CountRec;
SplashFrm.Hide;
SplashFrm.Free;
Screen.Cursor := crDefault;
end;
end;
Только в данном куске уже SplashFrmиграет роль инфо-формы, на которой расположены аничасики.
Сергей М. (2009-11-07 22:48:00) [32]
> к ней претензий нету, не исчезает
Тогда зачем в твоей редакции стоит MesFrm.Update ?
kyn66 (2009-11-07 22:36:00) [33]
> А какая м.б. разница, кроме собственно различных анимированных
> сцен, видимых юзером ?
Вот и я так подумал. Ок, Сергей, на время прервем осуждение. Хочу потестировать со слипом.
Сергей М. (2009-11-07 22:31:00) [34]
> Хотелось бы сравнить, есть ли какая разница
А какая м.б. разница, кроме собственно различных анимированных сцен, видимых юзером ?
kyn66 (2009-11-07 22:27:00) [35]
> Ну так и говори - потока, занимающегося этой операцией..
Да... с мастерами пообщаешься, начнешь хоть грамотно изъясняться... ;) (Заставят, блин... :))
> Ты же сам перед визуализацией записал туда 'Формируется
> документ, ожидайте...' !
Но к ней претензий нету, не исчезает. Сейчас смотрю про GetTickCount. Но он считает в миллисекундах. Сейчас хочу привести к секундам...
Не знаю где найти каких других анимационных персонажей для сопровождения выполнения операции. Хотелось бы сравнить, есть ли какая разница. Или ими всеми в конечном итоге управляет один TAnimation?
Сергей М. (2009-11-07 22:16:00) [36]
> инфа в нем не меняется
Как это не меняется ?
Ты же сам перед визуализацией записал туда 'Формируется документ, ожидайте...' !
> Операции выбора данных для отчета
Ну так и говори - потока, занимающегося этой операцией..
kyn66 (2009-11-07 22:06:00) [37]
> Вот он как раз и требует обновления
Для перерисовки? Так ведь инфа в нем не меняется. Это же не меняющиеся проценты...
> Процесса или потока ?Разные же разницы ..
Операции выбора данных для отчета. Так скажем.
> тикет - это билет)а тик - это тик)
:) Именно это и имел ввиду :)
Igorishe (2009-11-07 22:02:00) [38]
> тикет - это билет)
смешно...шутник вы эткий сударь)))
Сергей М. (2009-11-07 22:00:00) [39]
> Там простр лабел
Вот он как раз и требует обновления
> как подсчитать время выполнения процесса
Процесса или потока ?
Разные же разницы ..
> через тикеты
тикет - это билет)
а тик - это тик)
см. GetTickCount
kyn66 (2009-11-07 21:57:00) [40]
> Так у тебя де на форме не только Animate, но и какие-то
> другие виз.контролы !Их то надо обновить..
Там простр лабел информационный MesFrm.Lab1.Caption := 'Формируется документ, ожидайте...';
> А поскольку анимация выполнаяется в дополнительном, слип
> основного потока не должен никак на нее повлиять
Ща проверю. А могет чуть позже.....
У меня есть одно место в программе, я уже как то описывал здесь на форуме, при удалении SQL-ем из таблицы затрачивается определенное кол-во времени. Не понятно почему так долго происходит удаление, но речь ща не об этом, просто это то место, где можно проверит анимационность.ДА и еще, Сергей, не подскажежь как подсчитать время выполнения процесса, через тикеты как то помню вроде...