![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Создание обекта в потоке (Thread)
Tonich © (2006-07-04 01:26:00)Доброй ночи..
Такой вопрос, а в чем собственно различие между созданием объекта в Create и Execute класса TThread. При создании объекта в том или ином месте на выходе имею различные результаты.
Спасибо...
Шпиён (2006-07-05 10:41:00) [21]
> > Игорь Шевченко © (05.07.06 10:25) [84]
ИМелось в виду то, что у Рихтера (гл.21) названо "Локальная память потока (thread-local storage, TLS) "
Обращаясь к TlsSetValue, поток изменяет только свой PVOID-массив. Он не может что-то изменить в локальной памяти другого потока. Лично мне хотелось бы видеть какую-нибудь TLS-функцию, которая позволила бы одному потоку записывать данные в массив другого потока, но такой нет.
(с)
Шпиён (2006-07-05 10:35:00) [22]
> evvcom © (05.07.06 08:58) [82]
> > [62] Пусик © (04.07.06 20:41)
>
> Мрак. И с таким кодом бить себя в грудь "Да я, да я..."?
>
Вам пора присвоить значок "мастера". Одно из качеств "только что омастеренного" уже созрело.
ps Прошу прощения у тех мастеров, которых это "заболевание" миновало. Наболело.
> Игорь Шевченко © (05.07.06 10:25) [84]
Спасибо за ответ по существу (без всякой иронии).
Игорь Шевченко (2006-07-05 10:25:00) [23]
> Я дико извиняюсь, но разве TLS тоже принадлежит процессу?
А что имеется в виду под TLS в твоем вопросе ? Структура управления TLS, составная, часть принадлежит процессу, часть потоку
Шпиён (2006-07-05 10:00:00) [24]
> А какой смысл обсуждать кривой код? Если код написан криво,
> то по-разному он может вести себя при всяком новом создании
> объекта даже в одном потоке. :) Потому, код даже не смотрел.
>
Тебе может и нет смысла. Но, процентов на 50 в этом коде - ответ на вопрос автора ветки (см. Tonich © (04.07.06 01:46) [4] )
evvcom (2006-07-05 08:58:00) [25]> [62] Пусик © (04.07.06 20:41)
Мрак. И с таким кодом бить себя в грудь "Да я, да я..."?
Кто сказал, что бесполезно
Биться головой об стену?... (с) В.Бутусов
Видимо, Бутусов не прав.
> но вот простой пример "кривого" класса, при котором будет иллюзия разного поведения
А какой смысл обсуждать кривой код? Если код написан криво, то по-разному он может вести себя при всяком новом создании объекта даже в одном потоке. :) Потому, код даже не смотрел.
Шпиён (2006-07-05 01:04:00) [26]
> С памятью, конечно, более-менее гладко, бо она прнадлежит
> процессу
> ("контейнеру").
Я дико извиняюсь, но разве TLS тоже принадлежит процессу?
Leonid Troyanovsky (2006-07-04 23:28:00) [27]
> begin...end © (04.07.06 23:00) [79]
> целей). Относится ли эта память к какому-либо потоку? Конечно,
> нет. А к какому-либо экземпляру? Да, разумеется.
С памятью, конечно, более-менее гладко, бо она прнадлежит процессу
("контейнеру").
Ну, а как быть с тем, что принадлежит самому потоку, скажем,
окна, хуки, акселераторы и др.?
Т.е., при прочих равных, (подобные) поля объектов, созданные
разными потоками, могут отличаться и сущ-но.
> отличия в поведении этих объектов вызваны отнюдь не различиями
> самих объектов, а различиями потоков, исполняющих их методы.
Ну, а если сказать, что различия объектов вызваны различием
потоков, исполняющих их методы (вкл. тот же конструктор)?
А отличия поведения вызваны, все же, различием объектов?
--
Regards, LVT.
begin...end (2006-07-04 23:00:00) [28]В заключение более развёрнуто сформулирую свою точку зрения, поскольку сейчас уже поздно, а завтра участвовать в обсуждении возможности нет.
Что такое вообще экземпляр класса aka объект? Это поля, методы и свойства.
Свойства -- это механизм доступа к полям.
Что такое поля? Это часть памяти, выделенной при создании экземпляра (оставшаяся часть памяти используется для служебных целей). Относится ли эта память к какому-либо потоку? Конечно, нет. А к какому-либо экземпляру? Да, разумеется.
Что такое методы? Это набор участков кода, которые, кстати, существовали в памяти ещё до создания экземпляра. Относится ли этот код сам по себе к какому-либо потоку, или какому-либо экземпляру? Конечно, нет. Сколько бы ни работало потоков, сколько бы ни было создано экземпляров класса -- методы останутся там же, где они и были, и в том же количестве, в каком они и были.
Что происходит при создании объекта? Выделяется память для полей и служебных данных. Имеет ли значение, в каком именно потоке эта память выделилась? Нет, не имеет.
Поэтому при прочих равных условиях объекты (т.е. их поля и методы) одного и того же класса, созданные в различных потоках, друг от друга ничем не отличаются. А возможные отличия в поведении этих объектов вызваны отнюдь не различиями самих объектов, а различиями потоков, исполняющих их методы.
Кому надо -- тот поймёт.
begin...end (2006-07-04 22:28:00) [29]> Пусик © (04.07.06 22:19) [77]
> Образное выражение.
> Означает, что для работы с объектом в потоке не требуется
> дополнительных усилий.
Это выражение не менее образно. Непонятно, о каких усилиях идёт речь.
> Учитывая [42] видно, что в [42] ты резко увел туму использования
> объектов в потоке в сторну ИСКЛЮЧИТЕЛЬНО СОЗДАНИЯ объектов
> в потоке.
Я ничего и никуда не уводил. Вы (а не я) в [40] отвечали примером класса на вопрос о различиях в поведении его экземпляров в зависимости от того, в каких потоках они были созданы .
> См. [74] по поводу требований.
Требования уже были сформулированы ранее.
Пусик (2006-07-04 22:19:00) [30]
> Что значит "живёт"?
Образное выражение.
Означает, что для работы с объектом в потоке не требуется дополнительных усилий.
> Он относится к ответу на вопрос из [36].
Давай уже будь тогда точнее?
[21]
[33]
Учитывая [42] видно, что в [42] ты резко увел туму использования объектов в потоке в сторну ИСКЛЮЧИТЕЛЬНО СОЗДАНИЯ объектов в потоке.
> > Я привела пример именно по твоим требованиям.
>Нет.
См. [74] по поводу требований.
begin...end (2006-07-04 22:09:00) [31]> Пусик © (04.07.06 21:56) [74]
> Во-первых, я внятно и ясно сказала в [56], к чему относится
> тот класс.
Он относится к ответу на вопрос из [36].
> Я привела пример именно по твоим требованиям.
Нет.
> Пусик © (04.07.06 22:02) [75]
> При создании в поточной функции объект "живет" в этом потоке.
Что значит "живёт"?
Пусик (2006-07-04 22:02:00) [32]
> "В чём различие между СОЗДАНИЕМ объекта в Create и в Execute
> потока?
На этот вопрос ответит любой начинающий. Для этого и спор не нужен.
Ответ на этот вопрос дан был уже в
Пусик © (04.07.06 01:32) [1]
Конструктор выполняется в контексте вызывающего потока. объект, соответственно, создается в нем же. При создании в поточной функции объект "живет" в этом потоке.
Пусик (2006-07-04 21:56:00) [33]
> begin...end © (04.07.06 21:44) [72]
>Во-первых, класс в Вашем примере не является
> классом из [40],
Во-первых, я внятно и ясно сказала в [56], к чему относится тот класс. Так что не надо передергивать.
> Должен Вас несколько поправить: ТЕМОЙ является вопрос: "В
> чём различие между СОЗДАНИЕМ объекта в Create и в Execute
> потока?"
Увы, поправка уже была дана(про пост [4]). Так что не стоит мусолить пустое.
> должно быть несколько объектов, и они должны находиться
> при прочих равных условиях. Ваш пример этому не удовлетворяет.
>
Каким условиям не удовлетворяет? Можно поточнее?
Только не надо про [40]. Уже все сказано про тот пример.
Я привела пример именно по твоим требованиям.
Будь добр точно сформулировать эти требования.
Шпиён (2006-07-04 21:48:00) [34]Не знаю насчет разного поведения (СОМ из рассмотрения исключим), но вот простой пример "кривого" класса, при котором будет иллюзияразного поведения привести могу.
Если автор вопроса еще не сбежал из этой ветки - может, будет повод к размышлению -)
program Demo;
{$APPTYPE CONSOLE}
uses Classes, Windows;
var Sum: Integer;
Type
TJOPS=class
// Sum:Integer; забудем вот эту строчку написать....
//фокус-покус.... теперь будем иметь иллюзию разного поведения класса
Constructor Create;
procedure AddNumber(Number: Integer);
function GetSum: Integer;
end;
Constructor TJOPS.Create;
begin
Sum := 0;
end;
procedure TJOPS.AddNumber(Number: Integer);
begin
Sum := Sum + Number;
end;
function TJOPS.GetSum: Integer;
begin
Result := Sum;
end;
type
TSumThread1 = class(TThread)
jops:TJOPS;
Constructor Create(suspended:boolean);
protected
procedure Execute; override;
end;
type
TSumThread2 = class(TThread)
jops:TJOPS;
protected
procedure Execute; override;
end;
Constructor TSumThread1.Create(suspended:boolean);
begin
jops:=TJOPS.Create;
inherited Create(suspended);
end;
procedure TSumThread1.Execute;
var I: Integer;
begin
for I:=1 to 1000 do
begin
jops.AddNumber(1);
end;
WriteLn ( 'Sum=', jops.GetSum ) ;
end;
procedure TSumThread2.Execute;
var I: Integer;
begin
jops:=TJOPS.Create;
for I:=1 to 1000 do
begin
jops.AddNumber(1);
end;
WriteLn ( 'Sum=', jops.GetSum ) ;
end;
var
I: Integer ;
ThreadHandles : Integer ;
T1 : TSumThread1;
T2 : TSumThread2;
begin
T1:=TSumThread1.Create(True);
T1.FreeOnTerminate := True;
ThreadHandles := T1.Handle;
Sum:=3;
T1.Resume;
WaitForMultipleObjects(1, @ThreadHandles, True, INFINITE);
T2:=TSumThread2.Create(True);
T2.FreeOnTerminate := True;
ThreadHandles := T2.Handle;
Sum:=3;
T2.Resume;
WaitForMultipleObjects(1, @ThreadHandles, True, INFINITE);
Write('Press Enter...');
ReadLn;
end.
begin...end (2006-07-04 21:44:00) [35]> Пусик © (04.07.06 20:41) [62]
> Темой является:
> ОТЛИЧИЕ В ПОВЕДЕНИИ ОБЪЕКТОВ В ОСНОВНОМ И ДОПОЛНИТЕЛЬНЫХ
> ПОТОКАХ.
Должен Вас несколько поправить: ТЕМОЙ является вопрос: "В чём различие между СОЗДАНИЕМ объекта в Create и в Execute потока?"
> Ниже пример показывает именно то, что желает видеть оппонент:
> Разное поведение объекта в зависимости от того, где этот
> объект создается.
К сожалению, это не то, что я желаю видеть. Во-первых, класс в Вашем примере не является классом из [40], для которого я просил иллюстрацию. А во-вторых, Вы упустили из виду существенный момент (см. [46], [49]) -- должно быть несколько объектов, и они должны находиться при прочих равных условиях . Ваш пример этому не удовлетворяет.
Пусик (2006-07-04 21:03:00) [36]
> Игорь Шевченко © (04.07.06 21:02) [70]
> Пусик © (04.07.06 21:00) [68] Оно тебе сильно надо, а
> ? Остынь.
Хорошо.
Игорь Шевченко (2006-07-04 21:02:00) [37]Пусик © (04.07.06 21:00) [68]
Оно тебе сильно надо, а ? Остынь.
Пусик (2006-07-04 21:01:00) [38]Удалено модератором
Пусик (2006-07-04 21:00:00) [39]Удалено модератором
Leonid Troyanovsky (2006-07-04 20:59:00) [40]Удалено модератором