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

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

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


Страницы:   1 2

kaZaNoVa ©   (2005-01-09 10:41:00) 

Вдоволь поюзав 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;


kaZaNoVa   (2005-01-09 19:17:00) [1]

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

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

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

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


хм   (2005-01-09 19:16:00) [2]

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

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


kaZaNoVa   (2005-01-09 13:17:00) [3]

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


kaZaNoVa   (2005-01-09 11:33:00) [4]

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


kaZaNoVa   (2005-01-09 11:32:00) [5]

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


DiamondShark   (2005-01-09 11:31:00) [6]


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

Не знал.


DiamondShark   (2005-01-09 11:28:00) [7]


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

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


VMcL   (2005-01-09 11:25:00) [8]

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

Это до D6 было.


VMcL   (2005-01-09 11:23:00) [9]

>> 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;


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

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 зачем там?


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


> 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.


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

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


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

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


uw   (2005-01-09 10:59:00) [14]

Отличие - в F1.


kaZaNoVa   (2005-01-09 10:58:00) [15]

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


kaZaNoVa   (2005-01-09 10:57:00) [16]

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


uw   (2005-01-09 10:57:00) [17]

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


DiamondShark   (2005-01-09 10:57:00) [18]

Флудер.


kaZaNoVa   (2005-01-09 10:55:00) [19]

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

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


uw   (2005-01-09 10:54:00) [20]

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


Страницы:   1 2

Наверх

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