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

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

Зависание в 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;


Наверх

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