Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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


Страницы:   1 2 3 4 5 6

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]

Удалено модератором


Страницы:   1 2 3 4 5 6

Наверх

Титульная страница Поиск, карта сайта Написать письмо