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

Спасибо...


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] привели
> пример класса, экземпляры которого, по-Вашему, будут себя
> вести по-разному в зависимости от того, в каком потоке они
> созданы? Привели.


Есть разница между созданыи используются, не так ли?
Если объект создан в одном потоке, то странно было бы не использовать его именно в этом потоке. Так?

И разговор идет именно об этом. Не надо переводить в другое русло дискуссию.


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

Наверх

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