Форум: "Начинающим";
Текущий архив: 2009.10.25;
Скачать: [xml.tar.bz2];
ВнизЗависание в THread Найти похожие ветки
← →
Риг (2009-08-26 10:02) [0]Имеется код:
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 - прогресс бар.
В чем может быть проблема? Заранее благодарю за ответ.
← →
DrPass © (2009-08-26 10:05) [1]Конкретно этом коде ничего зависающего нет. Я бы посмотрел отладчиком, что происходит во время присваивания List_Prog[pr_pj].Progs[pr_pi].PB.Max:=progress_max;
← →
Риг (2009-08-26 10:10) [2]Пошагово прогонял - подвисает в момент выполнения
← →
Риг (2009-08-26 10:17) [3]Если пытаемся посмотреть значение List_Prog[pr_pj].Progs[pr_pi].PB.Max
в watch - он его не показывает(пустая строка).
При этом PB - существует.
Наводим мышой на max прямо в коде - пишет [Evoluting...]
← →
Медвежонок Пятачок © (2009-08-26 10:21) [4]интересно, зачем здесь вообще вторичный поток при таком его использовании
← →
Риг (2009-08-26 10:33) [5]Ну компонент графический, и без synchronize форма "висит", если ее принудительно не обновлять(Refresh, Repaint).
При этом использовать application.ProcessMesages не получится, а постоянная перерисовка формы - приводит к мерцанию.
То же самое(мерцание) при перерисовке компонента, но при этом невозможно совершать никаких действий на форме.
← →
Leonid Troyanovsky © (2009-08-26 10:47) [6]
> Риг (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.
← →
Ega23 © (2009-08-26 10:54) [7]
> При вызове Synchronize программа подвисает.
"Меня терзают смутные сомнения...." (с)
А ну-ка, код TMyThread.Execute в студию...
← →
Ega23 © (2009-08-26 10:54) [8]
> При вызове Synchronize программа подвисает.
"Меня терзают смутные сомнения...." (с)
А ну-ка, код TMyThread.Execute в студию...
← →
Медвежонок Пятачок © (2009-08-26 11:16) [9]зачем вторичный поток, если у тебя все равно все выполняется в главном?
← →
Риг (2009-08-26 11:20) [10]
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:21) [11]какой ужас ....
← →
Ega23 © (2009-08-26 11:33) [12]Пипец....
А чей сумрачный гений такое выдумал:
while stop_inst<>false do
begin
sleep(10);
end;
?
← →
Риг (2009-08-26 11:42) [13]:) Просто в момент выполнения программы у нас могут создаваться несколько копий сего потока. Когда поток начинает выполняться, данный флаг устанавливается и другие потоки(если они создаются) ждут окончания потока, который копирует файл.
Но в любом случае это не источник проблемы, т.к. этот кусок кода выполняется нормально. Как я и говорил подвисает все, при выполнении Synchronize(init) и Synchronize(setprogress), в этих процедурах мы меняем позицию Прогресса.
Если же работать с прогрессом без Synchronize - код выполняется нормально, но подвисает форма. Если ее постоянно перерисовывать после присваивания прогрессу очередного значения - компоненты на форме - мерцают.
Вот в этом заключается проблема.
← →
Риг (2009-08-26 11:47) [14]кхм, а вот значение sleep надо бы увеличить.... :)
← →
Ega23 © (2009-08-26 11:51) [15]
> кхм, а вот значение sleep надо бы увеличить.... :)
Этот код надо выкинуть. Если stop_inst = True, то он никогда не выполнится, а если False - уйдёшь в бесконечный цикл.
← →
Медвежонок Пятачок © (2009-08-26 11:53) [16]вот это внутри execute не менее готично:
then
Form1.StatusBar2.Panels[4].Text:=inttostr(strtoint(Form1.StatusBar2.Panels[4].Te xt)+1);
← →
Leonid Troyanovsky © (2009-08-26 11:55) [17]
> Риг (26.08.09 11:47) [14]
> кхм, а вот значение sleep надо бы увеличить.... :)
Sleep(INFINITE)
--
Regards, LVT.
> Риг (26.08.09 11:42) [13]
> Но в любом случае это не источник проблемы
Ясное дело.
Если ее нет, то надо создать.
--
Regards, LVT.
← →
Ega23 © (2009-08-26 12:31) [18]
> вот это внутри execute не менее готично:
>
> then
> Form1.StatusBar2.Panels[4].Text:=inttostr(strtoint(Form1.
> StatusBar2.Panels[4].Te xt)+1);
>
Да там весь код - хоть на конкурс говнокодов "Имени IncDay" отправляй
← →
Anatoly Podgoretsky © (2009-08-26 15:41) [19]> Ega23 (26.08.2009 10:54:07) [7]
> "Меня терзают смутные сомнения...."
A
← →
Ega23 © (2009-08-27 10:54) [20]
> A
Он самый.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2009.10.25;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.036 c