Форум: "Основная";
Текущий архив: 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.048 c