Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.045 c
15-1250800206
Юрий
2009-08-21 00:30
2009.10.25
С днем рождения ! 21 августа 2009 пятница


15-1250935575
El
2009-08-22 14:06
2009.10.25
Предварительный просмотр сообщения


3-1201334641
mega
2008-01-26 11:04
2009.10.25
DirectMysqlObjects (TMySQLClient, TMysqlResult) + Jpeg


2-1251374237
cyber-pilot
2009-08-27 15:57
2009.10.25
Пропадают вкладки в PageControl е


1-1221818257
Jolik
2008-09-19 13:57
2009.10.25
Как передать форму по сети :)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский