Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.10.25;
Скачать: CL | DM;

Вниз

Зависание в 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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.026 c
15-1251110503
02468
2009-08-24 14:41
2009.10.25
COM(delphi) + PHP


1-1220057367
Deltas
2008-08-30 04:49
2009.10.25
Как получить текст окна класса TRichView?


15-1250095032
Григорьев Антон
2009-08-12 20:37
2009.10.25
Осторожно! Новый вирус, специфичный для Delphi


15-1250873687
Student
2009-08-21 20:54
2009.10.25
WIN32.INDUC - шо за такое?


15-1251132830
Igor5
2009-08-24 20:53
2009.10.25
переход по формам в случайном порядке