![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
TThread, Потоки, пример использования
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.