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

Вниз

TThread, Потоки, пример использования   Найти похожие ветки 

 
kaZaNoVa ©   (2005-01-09 10:41) [0]

Вдоволь поюзав BeginThread, я решил попробовать TThread потоки =)

Я так делаю, подскажите, правильно?


type
TTest1=class(TThread)
   a:integer;
   b:integer;
   c:integer;
        constructor create(a0,b0:integer);
        destructor free;
protected
  procedure Execute;override;
public
  procedure SomeProc;
end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

Var T1Thread:TTest1;

constructor TTest1.create(a0,b0:integer);
begin
  inherited create(false);
  a:=a0;
  b:=b0;
  FreeOnTerminate:=true;
end;

destructor TTest1.free;
begin
  inherited free;
end;

procedure TTest1.SomeProc;
begin
Form1.Caption:="Test "+Inttostr(b);
end;

procedure TTest1.Execute;
begin
repeat
   Synchronize(SomeProc);
until Terminated;
end;

------

procedure TForm1.Button1Click(Sender: TObject);
begin
T1Thread:=TTest1.Create(0,2);
end;


 
DiamondShark ©   (2005-01-09 10:44) [1]

Не смешно.


 
kaZaNoVa ©   (2005-01-09 10:47) [2]

я серьёзно, например конструктор, Execute в protected
- я в ООП очень плохо разбираюсь, API моя стихия ;)))


 
uw ©   (2005-01-09 10:54) [3]

Если серьезно, то выброси free.


 
kaZaNoVa ©   (2005-01-09 10:55) [4]

uw ©   (09.01.05 10:54) [3]
а остальное правильно?
код procedure TTest1.Execute;
begin
repeat
  Synchronize(SomeProc);
until Terminated;
end;

просьба не пинать, он пашет, и я знаю, как он работает, так как это просто пример :)))


 
DiamondShark ©   (2005-01-09 10:57) [5]

Флудер.


 
uw ©   (2005-01-09 10:57) [6]

Правильно, но для SomeProc самое место - private.


 
kaZaNoVa ©   (2005-01-09 10:57) [7]

DiamondShark ©   (09.01.05 10:57) [5]
неа, мы же в потрепаться ;))


 
kaZaNoVa ©   (2005-01-09 10:58) [8]

uw ©   (09.01.05 10:57) [6]
а в чём отличие, если он в Public, или  в Private ?


 
uw ©   (2005-01-09 10:59) [9]

Отличие - в F1.


 
kaZaNoVa ©   (2005-01-09 11:00) [10]

uw ©   (09.01.05 10:59) [9]
=(


 
250   (2005-01-09 11:04) [11]

>kaZaNoVa ©   (09.01.05 10:58) [8]
Promt говорит :
Публика, или в Частный
последнее мне понравилось :)


 
DiamondShark ©   (2005-01-09 11:15) [12]


> constructor TTest1.create(a0,b0:integer);
> begin
>   inherited create(false);
>   a:=a0;
>   b:=b0;
>   FreeOnTerminate:=true;
> end;

Имеем все шансы получить в Execute недоинициализированные поля.

constructor TTest1.create(a0,b0:integer);
begin
  inherited create(true);
  a:=a0;
  b:=b0;
  FreeOnTerminate:=true;
  Resume;
end;


> destructor TTest1.free;
> begin
>   inherited free;
> end;

Это зачем? Он и не вызовется никогда.

TObject.Free -- не деструктор, а процедура. Да ещё и статическая.
Виртуальный деструктор называется Destroy.


 
kaZaNoVa ©   (2005-01-09 11:22) [13]

DiamondShark ©   (09.01.05 11:15) [12]
ок, спасибо за грамотный анализ =)

но я не совсем понял про

> Имеем все шансы получить в Execute
>недоинициализированные поля.
>
>constructor TTest1.create(a0,b0:integer);
>begin
>  inherited create(true);
>  a:=a0;
>  b:=b0;
>  FreeOnTerminate:=true;
>  Resume;
> end;

а Resume зачем там?


 
VMcL ©   (2005-01-09 11:23) [14]

>>DiamondShark ©  (09.01.05 11:15) [12]

>Имеем все шансы получить в Execute недоинициализированные поля.

Это то D6 было. Начиная с D6 всё ОК.

constructor TThread.Create(CreateSuspended: Boolean);
{$IFDEF LINUX}
var
 ErrCode: Integer;
{$ENDIF}
begin
 inherited Create;
 AddThread;
 FSuspended := CreateSuspended;
 FCreateSuspended := CreateSuspended;
{$IFDEF MSWINDOWS}
 FHandle := BeginThread(nil, 0, @ThreadProc, Pointer(Self), CREATE_SUSPENDED, FThreadID);
 if FHandle = 0 then
   raise EThread.CreateResFmt(@SThreadCreateError, [SysErrorMessage(GetLastError)]);
{$ENDIF}
{$IFDEF LINUX}
 sem_init(FCreateSuspendedSem, False, 0);
 ErrCode := BeginThread(nil, @ThreadProc, Pointer(Self), FThreadID);
 if ErrCode <> 0 then
   raise EThread.CreateResFmt(@SThreadCreateError, [SysErrorMessage(ErrCode)]);
{$ENDIF}
end;

procedure TThread.AfterConstruction;
begin
 if not FCreateSuspended then
   Resume;
end;


 
VMcL ©   (2005-01-09 11:25) [15]

>Это то D6 было.

Это до D6 было.


 
DiamondShark ©   (2005-01-09 11:28) [16]


> а Resume зачем там?

У TThread.Create параметр -- флаг создания в "подвешенном" состоянии.
Поток создаётся в остановленном состоянии, а после инициализации полей запускается.


 
DiamondShark ©   (2005-01-09 11:31) [17]


> VMcL ©   (09.01.05 11:23) [14]

Не знал.


 
kaZaNoVa ©   (2005-01-09 11:32) [18]

а так, лучше, правильнее?
Constructor TTest1.create(a0,b0:integer);
begin
  inherited create(True);
  a:=a0;
  b:=b0;
  FreeOnTerminate:=true;
  Resume;
end;


 
kaZaNoVa ©   (2005-01-09 11:33) [19]

Constructor TTest1.create(a0,b0:integer);
begin
  inherited create(True);
  a:=a0;
  b:=b0;
  FreeOnTerminate:=true;
 Resume;
end;


 
kaZaNoVa ©   (2005-01-09 13:17) [20]

кстати, по сабжу, метод Synchronize не очень медленный?


 
хм ©   (2005-01-09 19:16) [21]

kaZaNoVa, ты точно знаешь, как работает

procedure TTest1.Execute;
begin
repeat
  Synchronize(SomeProc);
until Terminated;
end;
?


 
kaZaNoVa ©   (2005-01-09 19:17) [22]

хм ©   (09.01.05 19:16) [21]
ага :))))

тока не спрашивай, как :)))

я его дАсконально изучил ))))

//неправильно работает, поток завязнет в Synchronize



Страницы: 1 вся ветка

Текущий архив: 2005.01.23;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.028 c
1-1104913176
Sanich
2005-01-05 11:19
2005.01.23
Как сделать чтоб в TDBGridEh выбиралось значние для TDBGridEh


4-1102363223
z_man
2004-12-06 23:00
2005.01.23
Как поместить программу в автозагрузку?


14-1105109952
Василий
2005-01-07 17:59
2005.01.23
нужен человек, хотя бы средне знающий Delphi


1-1105359653
Scorpio
2005-01-10 15:20
2005.01.23
Как в поле MEMO добавить запись


1-1105301899
Nevil.eXe
2005-01-09 23:18
2005.01.23
Прозрачность TEdit а...