![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Создание обекта в потоке (Thread)
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] написан нормально?