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