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. При создании объекта в том или ином месте на выходе имею различные результаты.

Спасибо...


Alexander Panov   (2006-07-17 09:40:00) [1]


Шпиён   (2006-07-06 15:01:00) [2]


> Так почему бы не привести нормальный код и не проанализировать
> его, вместо того, чтобы на кривых примерах пытаться что-
> то доказать ?

Анализируй "генофонд" Delphi.
Мне на работе за написание анализа денег не заплатят.
Нормальный код имеет весьма приличный объем.

> Буковки все съедены ? :)

Не смешно. Хамские шуточки оставь себе.


Игорь Шевченко   (2006-07-06 14:41:00) [3]

Шпиён   (06.07.06 14:37) [102]


> Не вижу смысла продолжать.


Буковки все съедены ? :)

Ты же правильно говоришь в одном из постов, что за подобный код в реальном проекте руки надо вырывать ? Так почему бы не привести нормальный код и не проанализировать его, вместо того, чтобы на кривых примерах пытаться что-то доказать ?


Fay   (2006-07-06 14:38:00) [4]

> Не вижу смысла продолжать.
УРА!


Шпиён   (2006-07-06 14:37:00) [5]


> Пусик ©   (04.07.06 22:19) [77]
>
> > Что значит "живёт"?
> Образное выражение.
> Означает, что для работы с объектом в потоке не требуется
> дополнительных усилий.


> Игорь Шевченко ©   (06.07.06 14:28) [101]

Учет тех самых особенностей - и есть "дополнительные усилия". IMHO.

Не вижу смысла продолжать.


Игорь Шевченко   (2006-07-06 14:28:00) [6]

Шпиён   (06.07.06 14:18) [100]

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


Шпиён   (2006-07-06 14:18:00) [7]

Кроме того фраза "при прочих равных условиях" достаточно расплывчата для того, чтобы каждый мог понимать ёё "в меру своей испорченности".

Естественно, что для "сферического коня в вакууме" (класс ничего не делает, не получает данных снаружи, не используются средства разграничения доступа к потокам, нет выборки системных сообщений, и т.д. и т.п.) утверждение будет верным.


Шпиён   (2006-07-06 14:11:00) [8]


> Игорь Шевченко ©   (06.07.06 13:42) [98]

Я не удивлен.

А разве в сообщении [8], [11] или [36] были указаны какие-то исключения и "прочие равные условия"?
Более того,в [11] "поток с выборкой системных сообщений из очереди" назван "единственным условием".


Игорь Шевченко   (2006-07-06 13:42:00) [9]

Шпиён   (06.07.06 12:44) [96]

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

"Поэтому при прочих равных условиях объекты (т.е. их поля и методы) одного и того же класса, созданные в различных потоках, друг от друга ничем не отличаются. А возможные отличия в поведении этих объектов вызваны отнюдь не различиями самих объектов, а различиями потоков, исполняющих их методы."

Убери особенности реализации методов и(или) полей, и вся иллюстрация пропадет.


Шпиён   (2006-07-06 12:47:00) [10]

еще можно [8] посмотреть.

> DrPass ©   (04.07.06 12:35) [8]
> Объект не может жить в вызывающем потоке. Поток - это не
> сущность, в которой что-либо живет, а просто состояние процессора.
>  Объект находится в памяти, и он один и тот же для любого
> потока, независимо от того, где он был создан.


Шпиён   (2006-07-06 12:44:00) [11]


> Игорь Шевченко ©   (06.07.06 12:24) [95]

см. [79].


Игорь Шевченко   (2006-07-06 12:24:00) [12]

Шпиён   (06.07.06 11:28) [94]

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


Шпиён   (2006-07-06 11:28:00) [13]

Посмотрел еще раз на "дискуссию"... Подумал...
Написал простенький код...


program TLSDemo;
{$APPTYPE CONSOLE}
uses Classes, Windows;
Type
TJOPS=class
   WhoAmI:string;
   Constructor Create(Name:string);
end;

TThread1 = class(TThread)
   Constructor Create(suspended:boolean);
   protected
       procedure Execute; override;
end;

threadvar A,B:TJOPS;

Constructor TJOPS.Create(Name:string);
begin
   WhoAmI := Name;
end;

Constructor TThread1.Create(suspended:boolean);
begin
   inherited Create(suspended);
   A:=TJOPS.Create('A');
end;

procedure TThread1.Execute;
begin
 B:=TJOPS.Create('B');
 Writeln('InThread:');
 if Assigned(A) then Writeln(A.WhoAmI)
   else Writeln('A not assigned');
 if Assigned(B) then Writeln(B.WhoAmI)
   else Writeln('B not assigned');
 while True do sleep(1);
end;

var
T1 : TThread1;
begin
       Writeln('TLS Demo');
       T1:=TThread1.Create(True);
       T1.FreeOnTerminate := True;
       T1.Resume;

       WriteLn('OutThread: ');
       if Assigned(A) then Writeln(A.WhoAmI)
           else Writeln('A not assigned');
       if Assigned(B) then Writeln(B.WhoAmI)
           else Writeln('B not assigned');
       ReadLn;
       TerminateThread(T1.Handle,0);
end.



Результаты работы:

TLS Demo
OutThread:
A
B not assigned
InThread:
A not assigned
B


Шпиён   (2006-07-05 11:58:00) [14]

Даже не проигнорировано,а ,наоборот, учтено и правильно использовано  (если не забывать про цель написания кода в [62])


Шпиён   (2006-07-05 11:36:00) [15]

"Это" действительно задокоментировано. В любой мало-мальски приличной лиитературе по СОМ. И в [62] "проигнорировано" намеренно


evvcom   (2006-07-05 11:29:00) [16]

> [89] Шпиён   (05.07.06 11:09)

Игорь Шевченко уже ответил. Полностью поддерживаю.
А эффект из [62] можно воспроизвести и в своих примерах, но это вовсе не означает, что ЭТА кривость зарыта в IE. Кривость в том, что программистом-юзером не учтены особенности создания данного COM-объекта. Наверняка это где-то задокументировано и в [62] успешно проигнорировано.


Игорь Шевченко   (2006-07-05 11:18:00) [17]


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


Есть предложение писать прямой код. Кривой код может породить массу интересных эффектов во многих областях, но разве стоит их обсуждать ? Иногда достаточно просто выпрямить.


Шпиён   (2006-07-05 11:09:00) [18]


> evvcom ©   (05.07.06 10:58) [87]

> Или хочешь сказать, что [62] написан нормально?


Не учтена цель, с которой написан код.
[62] Выполняет свою задачу - демонстрация эффекта. Для этой цели - вполне нормален.
Так же как и мой абсолютно кривой класс выполняет свою задачу - прозрачно продемонстрировать, где может быть ошибка у автора ветки. И с этой точки зрения - тоже нормален. Хотя за такой код в реальной программе - руки бы оторвал.


Игорь Шевченко   (2006-07-05 11:02:00) [19]

Шпиён   (05.07.06 10:41) [86]

Зная внутреннее устройство TLS, можно сделать то, о чем сожалеет Рихтер, но стандартных средств, как он верно отмечает, нет, да и ни к чему они. TLS представляет из себя обычную память, доступную для чтения/записи, так как владельцем всего адресного пространства является процесс, то чтение/запись доступна всем потокам. "Локальность" памяти по отношению к потоку обеспечиватся использованием соответствующих API-функций, только и всего.


evvcom   (2006-07-05 10:58:00) [20]

> [85] Шпиён   (05.07.06 10:35)

Что не понравилось? Вступать мне в пустую дискуссию не хотелось, но не высказать своего мнения не смог. Или хочешь сказать, что [62] написан нормально?


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

Наверх

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