Главная страница
    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.038 c
1-1105360466
Yurij-7
2005-01-10 15:34
2005.01.23
Два действия на одной кнопке


3-1103367985
Серый
2004-12-18 14:06
2005.01.23
Вычисляемое поле


1-1105437597
ssla
2005-01-11 12:59
2005.01.23
Взаимосвязь fsMDIForm - fsMDIChild


14-1104652466
YurikGL
2005-01-02 10:54
2005.01.23
Выбираю мобилу....


4-1102393341
dr Tr0jan
2004-12-07 07:22
2005.01.23
Как узнать хендл активного окна?





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