Главная страница
    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.04 c
15-1251457955
TUser
2009-08-28 15:12
2009.10.25
Законы физики нарушаются


15-1251318607
Юрий
2009-08-27 00:30
2009.10.25
С днем рождения ! 27 августа 2009 четверг


2-1251798189
Franzy
2009-09-01 13:43
2009.10.25
Запуск расчета сразу после отрисовки формы


15-1251452949
xayam
2009-08-28 13:49
2009.10.25
Подскажите есть ли для php библиотека для роботы с д-ми Word .doc


2-1250874124
id_984fa940
2009-08-21 21:02
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский