Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.08.27;
Скачать: CL | DM;

Вниз

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

 
Tonich ©   (2006-07-04 01:26) [0]

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

Спасибо...


 
Пусик ©   (2006-07-04 01:32) [1]

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


 
Tonich ©   (2006-07-04 01:38) [2]

мм бонятно пасибо ))


 
Джо ©   (2006-07-04 01:38) [3]

> При создании объекта в том или ином месте на выходе имею
> различные результаты.

Какие результаты, в чем они различны и на выходе из чего?


 
Tonich ©   (2006-07-04 01:46) [4]


> Какие результаты
-  результата выполнения отдельного потока

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

> на выходе из чего

- ну я не имел ввиду буквально, как на пример на выходе функции получаем результат. Я имел ввиду, по окончанию выполнения потока.


 
Германн ©   (2006-07-04 02:14) [5]


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


Вот и ищи различия, которые могут получиться в вычислении тех самых определенных величин (которые вычисляются
тем объектом который создается)
.
Причём ищи в своём тексте программы. Само создание объекта - всегда одинаково. Если его поля не привязаны к переменным программы.


 
evvcom ©   (2006-07-04 08:11) [6]

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

Наиболее вероятная причина - отсутствие/нарушение синхронизации доступа к этим "определенным величинам" и/или "начальным условиям".


 
Tonich ©   (2006-07-04 11:49) [7]


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

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

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


 
DrPass ©   (2006-07-04 12:35) [8]


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

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


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


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


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


 
Romkin ©   (2006-07-04 13:12) [10]

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


 
DrPass ©   (2006-07-04 13:30) [11]


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


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

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

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

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


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


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


Не факт


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


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

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

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


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

DrPass ©   (04.07.06 13:40) [13]


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


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


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


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



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


Уверен?

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

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

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

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


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


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


И это не факт.


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

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

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


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

>DrPass ©

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

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


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

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


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


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


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

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

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 15:06) [21]


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


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

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


 
Пусик ©   (2006-07-04 15:07) [22]


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


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


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

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


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


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

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


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


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


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


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


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


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


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

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


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


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

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


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


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


 
DrPass ©   (2006-07-04 16:16) [25]


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

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

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

это?


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

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


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


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


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


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


 
Пусик ©   (2006-07-04 16:43) [27]


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


А все таким же. Те же самые и все о том же. Вместо конкретного опровержения опять словоблудие.

Объект есть данные и реализация обработки их.
И использование некоторых объектов в доп. потоке отличается от использования в основном потоке вследствие именно реализации обработки данных и в взаимодействия с другими объектами.

Сколько раз эту фразу повторить?


 
Пусик ©   (2006-07-04 16:48) [28]

>DrPass ©   (04.07.06 16:16) [25]

> А поток - это именно состояние процессора.


Не буду писать от себя, проще процитировать того же Рихтера:

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


 
Пусик ©   (2006-07-04 16:49) [29]

>DrPass ©   (04.07.06 16:16) [25]
Описание несколько отличается от твоего. Верно?


 
Пусик ©   (2006-07-04 16:50) [30]

+ "В главе 4 я говорил, что процесс фактически состоит из двух компонентов объекта ядра "процесс" и адресного пространства так вот, любой поток тожс состоит из двух компонентов.

объекта ядра, через который операционная система управляет потоком Там же хранится статистическая информация о потоке;
стека потока, который содержит параметры всех функций и локальные пере менные, необходимые потоку для выполнения кода (О том, как система управ ляет стеком потока, я расскажу в главе 16) "


 
DrPass ©   (2006-07-04 16:53) [31]


> Пусик ©   (04.07.06 16:43) [27]


> использование некоторых объектов в доп. потоке отличается
> от использования в основном потоке

Хм... и как по-твоему, это какое-то отношение имеет к самим объектам, или все-таки является причиной сознательного коверканья кода программы?
Твое утверждение равноценно утверждению "использование объектов в процедурах на букву А отличается от использования объектов в процедурах на букву В". Да, можно специально написать такой объект, использующий глобальную переменную, которой будет присваиваться разное значение в разных процедурах... но к общим правилам использования объектов это никакого отношения не имеет. Это просто "кривые ручки программиста".
Здесь не суд, поэтому выискивать "юридические лазейки" в определениях и правилах не стоит.


 
DrPass ©   (2006-07-04 16:57) [32]


> Пусик ©   (04.07.06 16:49) [29]
> >DrPass ©   (04.07.06 16:16) [25]
> Описание несколько отличается от твоего. Верно?

И чем оно противоречит моему? Тем, что Рихтер сказал "потоки исполняют код и манипулируют данными"? Это допущение для более простого понимания. Не более того. Поток физически ничем не манипулирует. Манипулирует процессор, а поток описывает его состояние.


 
Пусик ©   (2006-07-04 17:08) [33]


> DrPass ©   (04.07.06 16:53) [31]


Начну с последнего предложения:


> Здесь не суд, поэтому выискивать "юридические лазейки" в
> определениях и правилах не стоит.


1. В дискусси следует аргументировать свои слова по возможности как более точными высказываниями, причем желательно правдивывми.


> Хм... и как по-твоему, это какое-то отношение имеет к самим
> объектам, или все-таки является причиной сознательного коверканья
> кода программы?


Поведение объекта в разных потоках может отличаться. С этим будешь спорить?
Если нет, тогда продолжу.
Вопрос не о том, что для того, чтобы объект вел себя одинаково, нужно затратить дополнительные усилия при его использовании, а в том, что такие усилия вообще нужны.
И совсем необязательно коверкать код, чтобы получить подобные эффекты.


> Твое утверждение равноценно утверждению "использование объектов
> в процедурах на букву А отличается от использования объектов
> в процедурах на букву В"


Процедуры и потоки - суть разные вещи. Не надо передергивать.


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


Речь не идет о глобальных переменных, и ты это прекрасно понимаешь.
Классы могут быть разного назначения, в том числе и для взаимодействия с пользователем(к примеру), скрывающие в себе и использующие ACtiveX, Com-объекты..
И, естественно, кривые ручки программиста здесь ни при чем, так как разговор не об этом идет.


 
Пусик ©   (2006-07-04 17:10) [34]


> DrPass ©   (04.07.06 16:57) [32]
> > Пусик ©   (04.07.06 16:49) [29] > >DrPass ©   (04.07.06
> 16:16) [25]> Описание несколько отличается от твоего. Верно?
> И чем оно противоречит моему? Тем, что Рихтер сказал "потоки
> исполняют код и манипулируют данными"? Это допущение для
> более простого понимания. Не более того. Поток физически
> ничем не манипулирует. Манипулирует процессор, а поток описывает
> его состояние.


Хм. Как я понимаю, все зависит от процессора, а не от операционной системы?


 
Игорь Шевченко ©   (2006-07-04 17:13) [35]

Пусик ©   (04.07.06 16:43) [27]


>  Вместо конкретного опровержения опять словоблудие.


Да сдалось ты мне - опровергать тебя. Таблеток от хамства побольше купи, ламер.


 
DrPass ©   (2006-07-04 17:15) [36]


> Пусик ©   (04.07.06 17:08) [33]
> Вопрос не о том, что для того, чтобы объект вел себя одинаково,
>  нужно затратить дополнительные усилия при его использовании,
>  а в том, что такие усилия вообще нужны.
> И совсем необязательно коверкать код, чтобы получить подобные
> эффекты

Хотите аргументов? Да пожалуйста:
type
 TMyClass = class
 end;

И какие мне нужны усилия, чтобы это объект вел себя неодинаково в зависимости от создавшего его потока? Более того, я могу навернуть в него любую функциональность,  и он все равно будет вести себя одинаково.
А вот чтобы он вел себя неодинаково... вот тут уже нужно будет действительно прилагать усилия.

> Процедуры и потоки - суть разные вещи. Не надо передергивать

Вещи разные. А вот смысл утверждений в обоих случаях совершенно одинаков.
И еще раз, плиз, см.

> Здесь не суд, поэтому выискивать "юридические лазейки" в
> определениях и правилах не стоит


 
Пусик ©   (2006-07-04 17:15) [37]


> Игорь Шевченко ©   (04.07.06 17:13) [35]
> Пусик ©   (04.07.06 16:43) [27] >  Вместо конкретного опровержения
> опять словоблудие.Да сдалось ты мне - опровергать тебя.
> Таблеток от хамства побольше купи, ламер.


Спасибо на добром слове, модератор.

Просьба не соваться больше в подобные ветки, так как пользы от тебя в них нет, а только попытки с высоты своего положения давить на других.


 
Пусик ©   (2006-07-04 17:17) [38]


> Более того, я могу навернуть в него любую функциональность,
>   и он все равно будет вести себя одинаково.


Сомневаюсь насчет любой функциональности.


 
DrPass ©   (2006-07-04 17:19) [39]


> Пусик ©   (04.07.06 17:17) [38]
>
> Сомневаюсь насчет любой функциональности

Игорь Шевченко в отношении вас прав на 100% :-)


 
Пусик ©   (2006-07-04 17:25) [40]


> И какие мне нужны усилия, чтобы это объект вел себя неодинаково
> в зависимости от создавшего его потока?


TMyClass=class
 Canvas: TCanvas:
// и т.д.
end;



Страницы: 1 2 3 вся ветка

Текущий архив: 2006.08.27;
Скачать: CL | DM;

Наверх




Память: 0.6 MB
Время: 0.036 c
3-1150796690
N
2006-06-20 13:44
2006.08.27
Corrupt table index header


15-1153955958
Dust
2006-07-27 03:19
2006.08.27
Редактор исходного кода с аутлайнингом


15-1153978624
palva
2006-07-27 09:37
2006.08.27
Статья Н. Елмановой в Компьютер-пресс


4-1146820955
Dimich1978
2006-05-05 13:22
2006.08.27
получить handle окна по неполному имени


15-1154593000
ALEXD31
2006-08-03 12:16
2006.08.27
Мультизагрузочный диск