Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.033 c
8-1097753412
Black
2004-10-14 15:30
2005.01.23
Частота звука


9-1097696674
rydmi
2004-10-13 23:44
2005.01.23
Вращение спрайтов


14-1105195274
Kerk
2005-01-08 17:41
2005.01.23
Весьма полезная вещь....


1-1104931359
Artlav
2005-01-05 16:22
2005.01.23
ppmd компонент или dll


6-1099551315
Фагот
2004-11-04 09:55
2005.01.23
TServerSocket в консольном приложении





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