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

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

Создание обекта в потоке (Thread)


Страницы:   1 2 3 4 5 6

Tonich ©   (2006-07-04 01:26:00) 

Доброй ночи..
Такой вопрос, а в чем собственно различие между созданием объекта в Create и Execute класса TThread. При создании объекта в том или ином месте на выходе имею различные результаты.

Спасибо...


Игорь Шевченко   (2006-07-04 16:19:00) [81]

Пусик ©   (04.07.06 16:13) [24]


> Может быть стоит вспомниить базовые понятия ООП, в частности,
>  инкапсуляцию?
> Объект - это не только его поля-свойства, но и его методы.
>
> Соответственно, под объектом нужно понимать и его поведение.
>
> И не имеет значения то, что в объекте инкапсулированы методы,
>  использующие особенности операционной системы. Объект от
> этогоне перестает быть объектом.


Это все хорошо, но каким образом это относится к сабжу ?


> Надо почаще освежать в памяти базовые понятия.


Да, спасибо. Совет учтен.


DrPass   (2006-07-04 16:16:00) [82]


> Пусик ©   (04.07.06 13:47) [17]
> >DrPass ©
> Кстати, вот это поясни:
>
> >  Поток - это не сущность, в которой что-либо живет, а
> просто
> > состояние процессора.

Поясняю - не существует такого понятия, как код потока. Код в программе один общий для всех, использует одну и ту же память, и одни и те же данные в этой памяти. Объект - это тоже код+данные. А поток - это именно состояние процессора. Грубо говоря, набор параметров, который описывает исполняемый в настоящий момент участок кода.
P.S. А причем здесь

> Использование Mutex в объекте - вот тебе второе условие

это?


Пусик   (2006-07-04 16:13:00) [83]


> Игорь Шевченко ©   (04.07.06 15:23) [23]
> Пусик ©   (04.07.06 15:07) [22] > А разве разговор был про
> ВСЕ и ЛЮБЫЕ объекты?В постах [8] и [9] или до них был очерчен
> круг объектов, о которых ведется разговор ? Или я что-то
> пропустил ?


А это аргумент в чью пользу?

Если ты аргументируешь свою позицию, то в [8] как раз неверное обобщение и этот пост не в твою пользу.


> Если объекты используют особенности операционной системы,
>  относящиеся к разным потокам, то да, отличия будут. Но
> сами объекты разве сильно зависят от того, в каком потоке
> они созданы ?


Может быть стоит вспомниить базовые понятия ООП, в частности, инкапсуляцию?
Объект - это не только его поля-свойства, но и его методы.
Соответственно, под объектом нужно понимать и его поведение.
И не имеет значения то, что в объекте инкапсулированы методы, использующие особенности операционной системы. Объект от этогоне перестает быть объектом.

То же касается и


> Конечно, сообщения, о которых упоминал Romkin, приходят
> к каждому потоку не смешиваясь. Но причем тут объекты ?


PS.
Надо почаще освежать в памяти базовые понятия.


Игорь Шевченко   (2006-07-04 15:23:00) [84]

Пусик ©   (04.07.06 15:07) [22]


> А разве разговор был про ВСЕ и ЛЮБЫЕ объекты?


В постах [8] и [9] или до них был очерчен круг объектов, о которых ведется разговор ? Или я что-то пропустил ?

Пусик ©   (04.07.06 15:06) [21]


> Не просто объект, а некоторые из объектов.


Если объекты используют особенности операционной системы, относящиеся к разным потокам, то да, отличия будут. Но сами объекты разве сильно зависят от того, в каком потоке они созданы ?


> в частности - одной из причин (от Romkin) вполне достаточно
> для того, чтобы видеть эти различия.


Конечно, сообщения, о которых упоминал Romkin, приходят к каждому потоку не смешиваясь. Но причем тут объекты ?


Пусик   (2006-07-04 15:07:00) [85]


> Игорь Шевченко ©   (04.07.06 14:51) [20]
> Вот есть небольшой код, вроде там объекты несильно зависят
> от места их создания:


А разве разговор был про ВСЕ и ЛЮБЫЕ объекты?


Пусик   (2006-07-04 15:06:00) [86]


> Если не секрет, чем объект, созданный внутри TThread отличается
> от объекта, созданного в основном потоке VCL ?


Не просто объект, а некоторыеиз объектов.

Поведение некоторых объектов будет отличаться при работе в основном и дополнительных потоках, в частности - одной из причин (от Romkin) вполне достаточно для того, чтобы видеть эти различия.


Игорь Шевченко   (2006-07-04 14:51:00) [87]

Вот есть небольшой код, вроде там объекты несильно зависят от места их создания:

unit main;

interface
uses
 Classes, Forms, StdCtrls, Foo, Controls;

type
 TfMain = class(TForm)
   Button1: TButton;
   Button2: TButton;
   Button3: TButton;
   Label1: TLabel;
   Label2: TLabel;
   procedure FormDestroy(Sender: TObject);
   procedure Button1Click(Sender: TObject);
   procedure Button3Click(Sender: TObject);
   procedure Button2Click(Sender: TObject);
 public
   FFoo1: TFoo;
   FFoo2: TFoo;
 end;

var
 fMain: TfMain;

implementation
uses
 Bar;

{$R *.DFM}

procedure TfMain.FormDestroy(Sender: TObject);
begin
 FFoo1.Free;
 FFoo2.Free;
end;

procedure TfMain.Button1Click(Sender: TObject);
begin
 FFoo1 := TFoo.Create ('Main thread');
end;

procedure TfMain.Button3Click(Sender: TObject);
begin
 if Assigned(FFoo1) then
   Label1.Caption := FFoo1.Prop;
 if Assigned(FFoo2) then
   Label2.Caption := FFoo2.Prop;
end;

procedure TfMain.Button2Click(Sender: TObject);
begin
 TBar.Create (Self);
end;

end.


unit Foo;

interface

type
 TFoo = class
 private
   FProp: string;
 public
   constructor Create (const AProp: string);
   property Prop: string read FProp;
 end;

implementation

{ TFoo }

constructor TFoo.Create(const AProp: string);
begin
 FProp := AProp;
end;

end.


unit Bar;

interface
uses
 Classes, main;

type
 TBar = class(TThread)
 private
   FOwner: TfMain;
 protected
   procedure Execute; override;
 public
   constructor Create (Owner: TfMain);
 end;

implementation
uses
 Foo;

{ TBar }

constructor TBar.Create(Owner: TfMain);
begin
 FOwner := Owner;
 inherited Create (false);
end;

procedure TBar.Execute;
begin
 FOwner.FFoo2 := TFoo.Create ('TThread');
end;

end.


Игорь Шевченко   (2006-07-04 14:34:00) [88]

Пусик ©   (04.07.06 13:10) [9]


> Ошибаешься. Могу согласиться с обычными потоками, но не
> с потоками VCL (TTherad).


Если не секрет, чем объект, созданный внутри TThread отличается от объекта, созданного в основном потоке VCL ?


Пусик   (2006-07-04 13:49:00) [89]

>DrPass ©

Еще добавлю, что есть принципиальные вопросы, а есть буквоедство.
Есть юмор, а есть ошибки.

Хочешь поговорить о потоках? Давай поговорим.


Пусик   (2006-07-04 13:47:00) [90]

>DrPass ©
Кстати, вот это поясни:

>  Поток - это не сущность, в которой что-либо живет, а просто
> состояние процессора.


Пусик   (2006-07-04 13:44:00) [91]


> DrPass ©   (04.07.06 13:30) [11]



>  Единственное условие - см.


Уверен?

Использование Mutex в объекте - вот тебе второе условие.

Еще спорить будешь?

Или скажешь, что это второе и одно из двух единственных условий?

Надо будет, можно еще примеры привести.


Пусик   (2006-07-04 13:44:00) [92]


> DrPass ©   (04.07.06 13:40) [13]
> > Игорь Шевченко ©   (04.07.06 13:38) [12] > > Не фактобращения
> к созданным в главном потоке объектам VCL в определенных
> случаях приведут к AVТак понятнее? :-)


И это не факт.


Игорь Шевченко   (2006-07-04 13:43:00) [93]

DrPass ©   (04.07.06 13:40) [13]


> обращения к созданным
> в главном потоке объектам VCL в определенных случаях приведут
> к AV
>
> Так понятнее? :-)


Безусловно. А главное - точнее :)


DrPass   (2006-07-04 13:40:00) [94]


> Игорь Шевченко ©   (04.07.06 13:38) [12]
>
> Не факт

обращения к созданным
в главном потоке объектам VCL в определенных случаях приведут к AV

Так понятнее? :-)


Игорь Шевченко   (2006-07-04 13:38:00) [95]


> Компоненты VCL непотокобезопасные, и обращения к созданным
> в главном потоке объектам VCL приведут к AV


Не факт


DrPass   (2006-07-04 13:30:00) [96]


> Пусик ©   (04.07.06 13:10) [9]


> Могу согласиться с обычными потоками, но не с потоками VCL
> (TTherad)

Хочешь поспорить? Тогда просто докажи :) Единственное условие - см.

> Romkin ©   (04.07.06 13:12) [10]

...но это известный факт. Компоненты VCL непотокобезопасные, и обращения к созданным в главном потоке объектам VCL приведут к AV


Romkin   (2006-07-04 13:12:00) [97]

Вот только если объект обрабатывает сообщения, то разница где создавать есть, и существенная. Пример - TTimer. Его точно нужно создавать в execute ;)


Пусик   (2006-07-04 13:10:00) [98]


>  Поток - это не сущность, в которой что-либо живет, а просто
> состояние процессора. Объект находится в памяти, и он один
> и тот же для любого потока, независимо от того, где он был
> создан.


Ошибаешься. Могу согласиться с обычными потоками, но не с потоками VCL (TTherad).


DrPass   (2006-07-04 12:35:00) [99]


> Конструктор выполняется в контексте вызывающего потока.
> объект, соответственно, создается в нем же. При создании
> в поточной функции объект "живет" в этом потоке.

Объект не может жить в вызывающем потоке. Поток - это не сущность, в которой что-либо живет, а просто состояние процессора. Объект находится в памяти, и он один и тот же для любого потока, независимо от того, где он был создан.


Tonich   (2006-07-04 11:49:00) [100]


> Германн ©   (04.07.06 02:14) [5]

да откуда возьмутся различия в вычислениях величин, если это один и тот же объект с одними и теми же методами и полями..ощибка в начальных условиях тоже исключена так как они берутся из одних и тех же переменных, определенных до создания самого объекта.
А что
> Пусик ©   (04.07.06 01:32) [1]

не правельный, я почему-то склоняюсь именно к этому


Страницы:   1 2 3 4 5 6

Наверх

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