![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Создание обекта в потоке (Thread)
Tonich © (2006-07-04 01:26:00)Доброй ночи..
Такой вопрос, а в чем собственно различие между созданием объекта в Create и Execute класса TThread. При создании объекта в том или ином месте на выходе имею различные результаты.
Спасибо...
Leonid Troyanovsky (2006-07-04 20:54:00) [41]Удалено модератором
Пусик (2006-07-04 20:53:00) [42]Удалено модератором
Пусик (2006-07-04 20:48:00) [43]Удалено модератором
DrPass (2006-07-04 20:42:00) [44]Удалено модератором
Пусик (2006-07-04 20:41:00) [45]Хочу заметить, что пример ниже лишь демонстрация того, что так жаждет begin...end ©, и является полным оффтопиком.
Темой является:
ОТЛИЧИЕ В ПОВЕДЕНИИ ОБЪЕКТОВ В ОСНОВНОМ И ДОПОЛНИТЕЛЬНЫХ ПОТОКАХ.
(Если нужно буквоедство, то в [4] недвусмысленно сказано о том, что функция автора выполняется в доп. потоке.)
Ниже пример показывает именно то, что желает видеть оппонент: Разное поведение объекта в зависимости от того, где этот объект создается.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Unit2,OleCtrls,ComObj,ActiveX;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
TH: TThr;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
TH := TThr.Create(False);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
//Обращение к объекту из основного потока.
TH.Start;
end;
end.
unit Unit2;
interface
uses classes,windows,OleCtrls,ComObj,ActiveX;
type
TObj=class(TObject)
public
objIE:OleVariant;
constructor Create;
destructor Destroy; override;
procedure Navigate;
end;
TThr=class(TThread)
public
S: String;
FObj: TObj;
procedure Execute; override;
procedure Start;
end;
implementation
procedure TThr.Execute;
var
i: Integer;
begin
FObj := TObj.Create;
FreeOnTerminate := True;
//обращение к объекту из потока, в котором создан объект.
Start;
Suspend;
FObj.Free;
end;
procedure TThr.Start;
begin
FObj.Navigate;
S := FObj.objIE.document.links.Item(0);
MessageBox(0,PChar(s),' ',MB_OK);
end;
{ TObj }
constructor TObj.Create;
begin
inherited;
CoInitialize(nil);
objIE := CreateOLEObject('InternetExplorer.Application');
objIE.Visible := 0;
end;
destructor TObj.Destroy;
begin
CoUninitialize;
inherited;
end;
procedure TObj.Navigate;
begin
objIE.Navigate( ' http://www.yandex.ru');
while objIE.Busy do sleep(500);
end;
end.
Демонстрация второй части - создание объекта в основном потоке, а использование его в дополнительным - снизойди, проверь сам.
begin...end (2006-07-04 20:18:00) [46]> Пусик © (04.07.06 20:16) [60]
Сорри, но на Ваш вопрос я уже ответил в [55]. Повторяться не хочется.
Пусик (2006-07-04 20:16:00) [47]
> Я определился с тем, "о чём я веду дискуссию".
И о чем же?
Выбор невелик. Прошу известить. Уже знать хочется.
begin...end (2006-07-04 20:10:00) [48]> Пусик © (04.07.06 20:05) [57]
> с чем же ты все-таки определился
Я определился с тем, "о чём я веду дискуссию".
begin...end (2006-07-04 20:09:00) [49]> Пусик © (04.07.06 20:03) [56]
Прошу принять во внимание, что топик я прочитал. Причём ещё до того, как написал в него своё первое сообщение.
> Если хочешь, могу привести и пример реализации объекта в
> потоке, который будет удовлетворять твоим требованиям
ОК, будет интересно посмотреть.
Пусик (2006-07-04 20:05:00) [50]И, кстати, неполохо бы узнать -
> Я уже давно определился.
с чем же ты все-таки определился, чтобы разговор шел об одном и том же.
Пусик (2006-07-04 20:03:00) [51]
> В [40] Вы привели пример описания класса, якобы подтверждающий
> это. А теперь я прошу Вас првиести соответствующий пример
> кода, показывающий различие в поведении.
1. Еще раз прошу соизволить прочитать топик.
2. Пример в [40] был приведен именно в контексте обсуждения, а не после перевода его в сторону.
Если хочешь, могу привести и пример реализации объекта в потоке, который будет удовлетворять твоим требованиям(Заметь - не относящихся к теме топика).
begin...end (2006-07-04 19:50:00) [52]> Пусик © (04.07.06 19:36) [54]
> Нет уж, это ты определись, о чем ведешь дискуссию.
Я уже давно определился. Я хочу понять, почему Вы считаете, что поведение объекта зависит от того, в каком потоке он был создан. В [40] Вы привели пример описания класса, якобы подтверждающий это. А теперь я прошу Вас првиести соответствующий пример кода, показывающий различие в поведении.
Пусик (2006-07-04 19:36:00) [53]
> Вот такая вот нестыковочка.
</I
> Определитесь, пожалуйста.
>
Нет уж, это ты определись, о чем ведешь дискуссию. Либо о том, куда вы с DRPass пытаетесь пытаетесь увести разговор, либо о том, что сказано в [21]
Хочу заметить, что пост № [40] связан контекстом всей дискуссии, и с этого поста он не началась. Тогда продолжим обсуждение.
Так что соизволь не выдергивать фразы из контекста обсуждения.
Это как не стыкуется с последними требованиями о стыковочках.
begin...end (2006-07-04 19:21:00) [54]> Пусик © (04.07.06 19:12) [51]
> Совершенно нормально.
То есть как это? Только что (в [47]) Вы утверждали, что использовать объект за пределами потока, в котором он был создан -- "странно". А теперь Вы считаете это "нормальным".
Определитесь, пожалуйста. Когда человек вначале говорит одно, а через полчаса -- совсем другое, его бывает сложно понять.
begin...end (2006-07-04 19:13:00) [55]> Пусик © (04.07.06 19:07) [50]
Возражения есть. Экземпляры класса из [40] будет вести себя при прочих равных условиях абсолютно одинаково , независимо от того, в каком потоке они были созданы.
Однако Вы привели пример [40] в ответ на вопрос о том, в каких случаях объекты ведут себя по-разному в зависимости от того, в каком потоке они созданы.
Вот такая вот нестыковочка.
Пусик (2006-07-04 19:12:00) [56]
> > Пусик © (04.07.06 18:45) [47] > Если объект создан в
> одном потоке, то странно было бы не > использовать его именно
> в этом потоке. Так?Почему это вдруг? Можно создать объект
> в одном потоке и без проблем использовать его в любом другом.
>
Можно. Но это как раз тот случай, который не имеет смысла рассматривать, потому что "Объекты просто хранятся в памяти процесса", и вне контекста потока их рассматривать не имеет смысла(учитывая тему ветки). Смысл имеет только использование объекта( в том числе и его методов) в контексте конкретного потока. Думаю, что это ясно?
> И это абсолютно нормально кроме тех редких случаев, когда
> используется непотокобезопасный код.
Совершенно нормально. Но в этот случай как раз выпадает из темы обсуждения.
> Что вам и пытаются вдолбить на протяжении полусотни постов
> этой ветки
Не надо мне ничего "вдалбливать". Все это мне известно не хуже, чем тебе.
Как и begin...end, ты пытаешься увести разговор в сторону.
Пусик (2006-07-04 19:07:00) [57]
> Поэтому просьба привести ПРИМЕР, подтверждающий Вашу точку
> зрения. Либо признать, что в [40] (а может быть, и кое-где
> ранее) Вы ошибались.
Пример приведен в [40].
Если есть возражения, прошу высказать.
DrPass (2006-07-04 18:57:00) [58]
> Пусик © (04.07.06 18:45) [47]
> Если объект создан в одном потоке, то странно было бы не
> использовать его именно в этом потоке. Так?
Почему это вдруг? Можно создать объект в одном потоке и без проблем использовать его в любом другом. И это абсолютно нормально кроме тех редких случаев, когда используется непотокобезопасный код. Что вам и пытаются вдолбить на протяжении полусотни постов этой ветки
begin...end (2006-07-04 18:57:00) [59]> Пусик © (04.07.06 18:45) [47]
> Есть разница между созданы и используются, не так ли?
Совершенно верно. Есть.
> Если объект создан в одном потоке, то странно было бы не
> использовать его именно в этом потоке. Так?
Не имеет значения.
> И разговор идет именно об этом.
Разговор идёт о том, что, по-Вашему, объекты, СОЗДАННЫЕ в разных потоках, ведут себя (при прочих равных условиях) ПО-РАЗНОМУ. Вопрос от DrPass в [36] был задан чётко и конкретно: речь шла о месте СОЗДАНИЯ объектов, а не о месте их ИСПОЛЬЗОВАНИЯ. И Ваш ответ на него [40] тоже абсолютно конкретен.
Поэтому просьба привести ПРИМЕР, подтверждающий Вашу точку зрения. Либо признать, что в [40] (а может быть, и кое-где ранее) Вы ошибались.
Пусик (2006-07-04 18:45:00) [60]
> begin...end © (04.07.06 18:38) [46]
> > Пусик © (04.07.06 18:19) [43]Это почему же "не пойдёт"?
> Разве к объекту можно обращаться только из потока, в котором
> объект был создан? Вовсе необязательно.Вы в [40] привели
> пример класса, экземпляры которого, по-Вашему, будут себя
> вести по-разному в зависимости от того, в каком потоке они
> созданы? Привели.
Есть разница между созданыи используются, не так ли?
Если объект создан в одном потоке, то странно было бы не использовать его именно в этом потоке. Так?
И разговор идет именно об этом. Не надо переводить в другое русло дискуссию.