Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2006.08.27;
Скачать: [xml.tar.bz2];

Вниз

Создание обекта в потоке (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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.58 MB
Время: 0.044 c
9-1133447973
Cash
2005-12-01 17:39
2006.08.27
OpenGL - Создание текстур


11-1131824315
Владимир
2005-11-12 22:38
2006.08.27
Добрый день, подскажите как в RichEdit добавлять строки


15-1153576090
vidiv
2006-07-22 17:48
2006.08.27
Эталон мужской красоты :)


9-1116212592
Xeno
2005-05-16 07:03
2006.08.27
Экшн с элементами RTS - ЭДЕМ


15-1154088626
test'er
2006-07-28 16:10
2006.08.27
Помогите с кодом





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