![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Зависание в THread [D7]
Риг © (2009-08-26 10:02:00)Имеется код:
S := TFileStream.Create(CS, fmOpenRead);
try
T := TFileStream.Create(CT, fmOpenWrite or fmCreate);
try
progress_max:=trunc(s.Size/pr)*2;
synchronize(init);
При вызове Synchronize программа подвисает.
Проседура Init:
procedure TMyThread.init;
begin
List_Prog[pr_pj].Progs[pr_pi].PB.Max:=progress_max;
end;
PB - прогресс бар.
В чем может быть проблема? Заранее благодарю за ответ.
Ega23 (2009-08-27 10:54:00) [1]
> A
Он самый.
Anatoly Podgoretsky (2009-08-26 15:41:00) [2]> Ega23 (26.08.2009 10:54:07) [7]
> "Меня терзают смутные сомнения...."
A
Ega23 (2009-08-26 12:31:00) [3]
> вот это внутри execute не менее готично:
>
> then
> Form1.StatusBar2.Panels[4].Text:=inttostr(strtoint(Form1.
> StatusBar2.Panels[4].Te xt)+1);
>
Да там весь код - хоть на конкурс говнокодов "Имени IncDay" отправляй
Leonid Troyanovsky (2009-08-26 11:55:00) [4]
> Риг (26.08.09 11:47) [14]
> кхм, а вот значение sleep надо бы увеличить.... :)
Sleep(INFINITE)
--
Regards, LVT.
> Риг (26.08.09 11:42) [13]
> Но в любом случае это не источник проблемы
Ясное дело.
Если ее нет, то надо создать.
--
Regards, LVT.
Медвежонок Пятачок (2009-08-26 11:53:00) [5]вот это внутри execute не менее готично:
then
Form1.StatusBar2.Panels[4].Text:=inttostr(strtoint(Form1.StatusBar2.Panels[4].Te xt)+1);
Ega23 (2009-08-26 11:51:00) [6]
> кхм, а вот значение sleep надо бы увеличить.... :)
Этот код надо выкинуть. Если stop_inst = True, то он никогда не выполнится, а если False - уйдёшь в бесконечный цикл.
Риг (2009-08-26 11:47:00) [7]кхм, а вот значение sleep надо бы увеличить.... :)
Риг (2009-08-26 11:42:00) [8]:) Просто в момент выполнения программы у нас могут создаваться несколько копий сего потока. Когда поток начинает выполняться, данный флаг устанавливается и другие потоки(если они создаются) ждут окончания потока, который копирует файл.
Но в любом случае это не источник проблемы, т.к. этот кусок кода выполняется нормально. Как я и говорил подвисает все, при выполнении Synchronize(init) и Synchronize(setprogress), в этих процедурах мы меняем позицию Прогресса.
Если же работать с прогрессом без Synchronize - код выполняется нормально, но подвисает форма. Если ее постоянно перерисовывать после присваивания прогрессу очередного значения - компоненты на форме - мерцают.
Вот в этом заключается проблема.
Ega23 (2009-08-26 11:33:00) [9]Пипец....
А чей сумрачный гений такое выдумал:
while stop_inst<>false do
begin
sleep(10);
end;
?
Медвежонок Пятачок (2009-08-26 11:21:00) [10]какой ужас ....
Риг (2009-08-26 11:20:00) [11]
procedure TMyThread.Execute;
var
S,T:TFileStream;
CS,CT,dir:string;
pr, FileExtract:integer;
begin
pred_start:=Tek_Pred;
pr:=4*1024;
CS:=C_Sourse;
CT:=C_Target;
pr_pi:=pi;
pr_pj:=pj;
fileextract:=length(List_Prog[pr_pj].Progs[pr_pi].Name.Caption);
while List_Prog[pr_pj].Progs[pr_pi].Name.Caption[fileextract]='_' do
fileextract:=fileextract-1;
progname:=copy(List_Prog[pr_pj].Progs[pr_pi].Name.Caption, 1, fileextract);
if stop_inst=true then
Form1.StatusBar2.Panels[4].Text:=inttostr(strtoint(Form1.StatusBar2.Panels[4].Te xt)+1);
while stop_inst<>false do
begin
sleep(10);
end;
stop_inst:=true;
if Form1.StatusBar2.Panels[4].Text<>'0' then
Form1.StatusBar2.Panels[4].Text:=inttostr(strtoint(Form1.StatusBar2.Panels[4].Te xt)-1);
while not terminated do
begin
editinformpanel;
List_Prog[pr_pj].Progs[pr_pi].install:=true;
S := TFileStream.Create(CS, fmOpenRead);
try
T := TFileStream.Create(CT, fmOpenWrite or fmCreate);
try
progress_max:=trunc(s.Size/pr)*2;
synchronize(init);
List_Prog[pr_pj].Progs[pr_pi].PB.Max:=progress_max;
while s.Size<>t.Size do
begin
if s.Size-t.Size<pr then
pr:=s.Size-t.Size;
T.CopyFrom(s,pr);
if s.Size-t.Size>4096 then
progress:=round(t.Size/pr);
if terminated then break; //остановка
synchronize(setprogress);
end;
FileSetDate(T.Handle, FileGetDate(S.Handle));
finally
T.Free;
end;
finally
S.Free;
end;
end;
Медвежонок Пятачок (2009-08-26 11:16:00) [12]зачем вторичный поток, если у тебя все равно все выполняется в главном?
Ega23 (2009-08-26 10:54:00) [13]
> При вызове Synchronize программа подвисает.
"Меня терзают смутные сомнения...." (с)
А ну-ка, код TMyThread.Execute в студию...
Ega23 (2009-08-26 10:54:00) [14]
> При вызове Synchronize программа подвисает.
"Меня терзают смутные сомнения...." (с)
А ну-ка, код TMyThread.Execute в студию...
Leonid Troyanovsky (2009-08-26 10:47:00) [15]
> Риг (26.08.09 10:33) [5]
> Ну компонент графический, и без synchronize форма "висит"
type
TMyFileStream = class (TFileStream)
private
FOnWrite: TNotifyEvent;
public
function Write(const Buffer; Count: Longint): Longint; override;
property OnWrite: TNotifyEvent read FOnWrite write FOnWrite;
end;
function TMyFileStream.Write;
begin
Result := inherited Write(Buffer, Count);
if Assigned (FOnWrite) then
FOnWrite(Self);
end;
--
Regards, LVT.
Риг (2009-08-26 10:33:00) [16]Ну компонент графический, и без synchronize форма "висит", если ее принудительно не обновлять(Refresh, Repaint).
При этом использовать application.ProcessMesages не получится, а постоянная перерисовка формы - приводит к мерцанию.
То же самое(мерцание) при перерисовке компонента, но при этом невозможно совершать никаких действий на форме.
Медвежонок Пятачок (2009-08-26 10:21:00) [17]интересно, зачем здесь вообще вторичный поток при таком его использовании
Риг (2009-08-26 10:17:00) [18]Если пытаемся посмотреть значение List_Prog[pr_pj].Progs[pr_pi].PB.Max
в watch - он его не показывает(пустая строка).
При этом PB - существует.
Наводим мышой на max прямо в коде - пишет [Evoluting...]
Риг (2009-08-26 10:10:00) [19]Пошагово прогонял - подвисает в момент выполнения
DrPass (2009-08-26 10:05:00) [20]Конкретно этом коде ничего зависающего нет. Я бы посмотрел отладчиком, что происходит во время присваивания List_Prog[pr_pj].Progs[pr_pi].PB.Max:=progress_max;