Форум: "Основная";
Текущий архив: 2005.01.23;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.047 c