Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2006.08.27;
Скачать: [xml.tar.bz2];

Вниз

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

 
Пусик ©   (2006-07-04 17:25) [40]


> И какие мне нужны усилия, чтобы это объект вел себя неодинаково
> в зависимости от создавшего его потока?


TMyClass=class
 Canvas: TCanvas:
// и т.д.
end;


 
Пусик ©   (2006-07-04 17:29) [41]


> > Игорь Шевченко ©   (04.07.06 17:13) [35]


За пост [24] прошу прощения, конечно. Но не более того.
Хочу заметить, что букварь используют по назначению не только ламеры и чайники.
За сим можно закончить.


 
begin...end ©   (2006-07-04 17:30) [42]

> Пусик ©   (04.07.06 17:25) [40]

Ок, прекрасно. Итак, СОЗДАЁМ два экземпляра TMyClass в РАЗНЫХ потоках -- основном и дополнительном. Теперь ОБРАЩАЕМСЯ к этим объектам из ОДНОГО потока (главного).

Просьба описать различия в поведении объектов при этом. Если не трудно.


 
Пусик ©   (2006-07-04 18:19) [43]


> begin...end ©   (04.07.06 17:30) [42]
> > Пусик ©   (04.07.06 17:25) [40]Ок, прекрасно. Итак, СОЗДАЁМ
> два экземпляра TMyClass в РАЗНЫХ потоках -- основном и дополнительном.
>  Теперь ОБРАЩАЕМСЯ к этим объектам из ОДНОГО потока (главного).
>


Не пойдет.
Обращение к объекту должно быть из того потока, в котором он создан.


 
DrPass ©   (2006-07-04 18:21) [44]


> Пусик ©   (04.07.06 18:19) [43]

Delphi под рукой есть? Попробуй, а?


 
Пусик ©   (2006-07-04 18:35) [45]


> DrPass ©   (04.07.06 18:21) [44]
> > Пусик ©   (04.07.06 18:19) [43] Delphi под рукой есть?
>  Попробуй, а?


Попробовать что?


 
begin...end ©   (2006-07-04 18:38) [46]

> Пусик ©   (04.07.06 18:19) [43]

Это почему же "не пойдёт"?

Разве к объекту можно обращаться только из потока, в котором объект был создан? Вовсе необязательно.

Вы в [40] привели пример класса, экземпляры которого, по-Вашему, будут себя вести по-разному в зависимости от того, в каком потоке они созданы? Привели.

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


 
Пусик ©   (2006-07-04 18:45) [47]


> begin...end ©   (04.07.06 18:38) [46]
> > Пусик ©   (04.07.06 18:19) [43]Это почему же "не пойдёт"?
> Разве к объекту можно обращаться только из потока, в котором
> объект был создан? Вовсе необязательно.Вы в [40] привели
> пример класса, экземпляры которого, по-Вашему, будут себя
> вести по-разному в зависимости от того, в каком потоке они
> созданы? Привели.


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

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


 
DrPass ©   (2006-07-04 18:57) [48]


> Пусик ©   (04.07.06 18:45) [47]


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

Почему это вдруг? Можно создать объект в одном потоке и без проблем использовать его в любом другом. И это абсолютно нормально кроме тех редких случаев, когда используется непотокобезопасный код. Что вам и пытаются вдолбить на протяжении полусотни постов этой ветки


 
begin...end ©   (2006-07-04 18:57) [49]

> Пусик ©   (04.07.06 18:45) [47]

> Есть разница между созданы и используются, не так ли?

Совершенно верно. Есть.

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

Не имеет значения.

> И разговор идет именно об этом.

Разговор идёт о том, что, по-Вашему, объекты, СОЗДАННЫЕ в разных потоках, ведут себя (при прочих равных условиях) ПО-РАЗНОМУ. Вопрос от DrPass в [36] был задан чётко и конкретно: речь шла о месте СОЗДАНИЯ объектов, а не о месте их ИСПОЛЬЗОВАНИЯ. И Ваш ответ на него [40] тоже абсолютно конкретен.

Поэтому просьба привести ПРИМЕР, подтверждающий Вашу точку зрения. Либо признать, что в [40] (а может быть, и кое-где ранее) Вы ошибались.


 
Пусик ©   (2006-07-04 19:07) [50]


> Поэтому просьба привести ПРИМЕР, подтверждающий Вашу точку
> зрения. Либо признать, что в [40] (а может быть, и кое-где
> ранее) Вы ошибались.


Пример приведен в [40].
Если есть возражения, прошу высказать.


 
Пусик ©   (2006-07-04 19:12) [51]


> > Пусик ©   (04.07.06 18:45) [47] > Если объект создан в
> одном потоке, то странно было бы не > использовать его именно
> в этом потоке. Так?Почему это вдруг? Можно создать объект
> в одном потоке и без проблем использовать его в любом другом.
>


Можно. Но это как раз тот случай, который не имеет смысла рассматривать, потому что "Объекты просто хранятся в памяти процесса", и вне контекста потока их рассматривать не имеет смысла(учитывая тему ветки). Смысл имеет только использование объекта( в том числе и его методов) в контексте конкретного потока. Думаю, что это ясно?


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


Совершенно нормально. Но в этот случай как раз выпадает из темы обсуждения.


> Что вам и пытаются вдолбить на протяжении полусотни постов
> этой ветки


Не надо мне ничего "вдалбливать". Все это мне известно не  хуже, чем тебе.
Как и begin...end, ты пытаешься увести разговор в сторону.


 
begin...end ©   (2006-07-04 19:13) [52]

> Пусик ©   (04.07.06 19:07) [50]

Возражения есть. Экземпляры класса из [40] будет вести себя при прочих равных условиях абсолютно одинаково, независимо от того, в каком потоке они были созданы.

Однако Вы привели пример [40] в ответ на вопрос о том, в каких случаях объекты ведут себя по-разному в зависимости от того, в каком потоке они созданы.

Вот такая вот нестыковочка.


 
begin...end ©   (2006-07-04 19:21) [53]

> Пусик ©   (04.07.06 19:12) [51]

> Совершенно нормально.

То есть как это? Только что (в [47]) Вы утверждали, что использовать объект за пределами потока, в котором он был создан -- "странно". А теперь Вы считаете это "нормальным".

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


 
Пусик ©   (2006-07-04 19:36) [54]


> Вот такая вот нестыковочка.
</I
> Определитесь, пожалуйста.

>

Нет уж, это ты определись, о чем ведешь дискуссию. Либо о том, куда вы с DRPass пытаетесь пытаетесь увести разговор, либо о том, что сказано в [21]
Хочу заметить, что пост № [40] связан контекстом всей дискуссии, и с этого поста он не началась. Тогда продолжим обсуждение.

Так что соизволь не выдергивать фразы из контекста обсуждения.
Это как не стыкуется с последними требованиями о стыковочках.


 
begin...end ©   (2006-07-04 19:50) [55]

> Пусик ©   (04.07.06 19:36) [54]

> Нет уж, это ты определись, о чем ведешь дискуссию.

Я уже давно определился. Я хочу понять, почему Вы считаете, что поведение объекта зависит от того, в каком потоке он был создан. В [40] Вы привели пример описания класса, якобы подтверждающий это. А теперь я прошу Вас првиести соответствующий пример кода, показывающий различие в поведении.


 
Пусик ©   (2006-07-04 20:03) [56]


> В [40] Вы привели пример описания класса, якобы подтверждающий
> это. А теперь я прошу Вас првиести соответствующий пример
> кода, показывающий различие в поведении.


1. Еще раз прошу соизволить прочитать топик.
2. Пример в [40] был приведен именно в контексте обсуждения, а не после перевода его в сторону.

Если хочешь, могу привести и пример реализации объекта в потоке, который будет удовлетворять твоим требованиям(Заметь - не относящихся к теме топика).


 
Пусик ©   (2006-07-04 20:05) [57]

И, кстати, неполохо бы узнать -  

> Я уже давно определился.


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


 
begin...end ©   (2006-07-04 20:09) [58]

> Пусик ©   (04.07.06 20:03) [56]

Прошу принять во внимание, что топик я прочитал. Причём ещё до того, как написал в него своё первое сообщение.

> Если хочешь, могу привести и пример реализации объекта в
> потоке, который будет удовлетворять твоим требованиям

ОК, будет интересно посмотреть.


 
begin...end ©   (2006-07-04 20:10) [59]

> Пусик ©   (04.07.06 20:05) [57]

> с чем же ты все-таки определился

Я определился с тем, "о чём я веду дискуссию".


 
Пусик ©   (2006-07-04 20:16) [60]


> Я определился с тем, "о чём я веду дискуссию".


И о чем же?
Выбор невелик. Прошу известить. Уже знать хочется.


 
begin...end ©   (2006-07-04 20:18) [61]

> Пусик ©   (04.07.06 20:16) [60]

Сорри, но на Ваш вопрос я уже ответил в [55]. Повторяться не хочется.


 
Пусик ©   (2006-07-04 20:41) [62]

Хочу заметить, что пример ниже лишь демонстрация того, что так жаждет 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.


Демонстрация второй части  - создание объекта в основном потоке, а использование его в дополнительным - снизойди, проверь сам.


 
DrPass ©   (2006-07-04 20:42) [63]

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


 
Пусик ©   (2006-07-04 20:48) [64]

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


 
Пусик ©   (2006-07-04 20:53) [65]

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


 
Leonid Troyanovsky ©   (2006-07-04 20:54) [66]

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


 
Leonid Troyanovsky ©   (2006-07-04 20:59) [67]

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


 
Пусик ©   (2006-07-04 21:00) [68]

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


 
Пусик ©   (2006-07-04 21:01) [69]

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


 
Игорь Шевченко ©   (2006-07-04 21:02) [70]

Пусик ©   (04.07.06 21:00) [68]

Оно тебе сильно надо, а ? Остынь.


 
Пусик ©   (2006-07-04 21:03) [71]


> Игорь Шевченко ©   (04.07.06 21:02) [70]
> Пусик ©   (04.07.06 21:00) [68] Оно тебе сильно надо, а
> ? Остынь.


Хорошо.


 
begin...end ©   (2006-07-04 21:44) [72]

> Пусик ©   (04.07.06 20:41) [62]

> Темой является:
> ОТЛИЧИЕ В ПОВЕДЕНИИ ОБЪЕКТОВ В ОСНОВНОМ И ДОПОЛНИТЕЛЬНЫХ
> ПОТОКАХ.

Должен Вас несколько поправить: ТЕМОЙ является вопрос: "В чём различие между СОЗДАНИЕМ объекта в Create и в Execute потока?"

> Ниже пример показывает именно то, что желает видеть оппонент:
> Разное поведение объекта в зависимости от того, где этот
> объект создается.

К сожалению, это не то, что я желаю видеть. Во-первых, класс в Вашем примере не является классом из [40], для которого я просил иллюстрацию. А во-вторых, Вы упустили из виду существенный момент (см. [46], [49]) -- должно быть несколько объектов, и они должны находиться при прочих равных условиях. Ваш пример этому не удовлетворяет.


 
Шпиён   (2006-07-04 21:48) [73]

Не знаю насчет разного поведения (СОМ из рассмотрения исключим), но вот простой пример "кривого" класса, при котором будет иллюзия разного поведения привести могу.
Если автор вопроса еще не сбежал из этой ветки - может, будет повод к размышлению -)


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.



 
Пусик ©   (2006-07-04 21:56) [74]


> begin...end ©   (04.07.06 21:44) [72]
>Во-первых, класс в Вашем примере не является
> классом из [40],


Во-первых, я внятно и ясно сказала в [56], к чему относится тот класс. Так что не надо передергивать.


> Должен Вас несколько поправить: ТЕМОЙ является вопрос: "В
> чём различие между СОЗДАНИЕМ объекта в Create и в Execute
> потока?"


Увы, поправка уже была дана(про пост [4]). Так что не стоит мусолить пустое.


> должно быть несколько объектов, и они должны находиться
> при прочих равных условиях. Ваш пример этому не удовлетворяет.
>


Каким условиям не удовлетворяет? Можно поточнее?

Только не надо про [40]. Уже все сказано про тот пример.

Я привела пример именно по твоим требованиям.
Будь добр точно сформулировать эти требования.


 
Пусик ©   (2006-07-04 22:02) [75]


> "В чём различие между СОЗДАНИЕМ объекта в Create и в Execute
> потока?


На этот вопрос ответит любой начинающий. Для этого и спор не нужен.
Ответ на этот вопрос дан был уже в

Пусик ©   (04.07.06 01:32) [1]

Конструктор выполняется в контексте вызывающего потока. объект, соответственно, создается в нем же. При создании в поточной функции объект "живет" в этом потоке.


 
begin...end ©   (2006-07-04 22:09) [76]

> Пусик ©   (04.07.06 21:56) [74]

> Во-первых, я внятно и ясно сказала в [56], к чему относится
> тот класс.

Он относится к ответу на вопрос из [36].

> Я привела пример именно по твоим требованиям.

Нет.

> Пусик ©   (04.07.06 22:02) [75]

> При создании в поточной функции объект "живет" в этом потоке.

Что значит "живёт"?


 
Пусик ©   (2006-07-04 22:19) [77]


> Что значит "живёт"?


Образное выражение.
Означает, что для работы с объектом в потоке не требуется дополнительных усилий.


> Он относится к ответу на вопрос из [36].


Давай уже будь тогда точнее?
[21]
[33]

Учитывая [42] видно, что в [42] ты резко увел туму использования объектов в потоке в сторну ИСКЛЮЧИТЕЛЬНО СОЗДАНИЯ объектов в потоке.


> > Я привела пример именно по твоим требованиям.
>Нет.


См. [74] по поводу требований.


 
begin...end ©   (2006-07-04 22:28) [78]

> Пусик ©   (04.07.06 22:19) [77]

> Образное выражение.
> Означает, что для работы с объектом в потоке не требуется
> дополнительных усилий.

Это выражение не менее образно. Непонятно, о каких усилиях идёт речь.

> Учитывая [42] видно, что в [42] ты резко увел туму использования
> объектов в потоке в сторну ИСКЛЮЧИТЕЛЬНО СОЗДАНИЯ объектов
> в потоке.

Я ничего и никуда не уводил. Вы (а не я) в [40] отвечали примером класса на вопрос о различиях в поведении его экземпляров в зависимости от того, в каких потоках они были созданы.

> См. [74] по поводу требований.

Требования уже были сформулированы ранее.


 
begin...end ©   (2006-07-04 23:00) [79]

В заключение более развёрнуто сформулирую свою точку зрения, поскольку сейчас уже поздно, а завтра участвовать в обсуждении возможности нет.

Что такое вообще экземпляр класса aka объект? Это поля, методы и свойства.

Свойства -- это механизм доступа к полям.

Что такое поля? Это часть памяти, выделенной при создании экземпляра (оставшаяся часть памяти используется для служебных целей). Относится ли эта память к какому-либо потоку? Конечно, нет. А к какому-либо экземпляру? Да, разумеется.

Что такое методы? Это набор участков кода, которые, кстати, существовали в памяти ещё до создания экземпляра. Относится ли этот код сам по себе к какому-либо потоку, или какому-либо экземпляру? Конечно, нет. Сколько бы ни работало потоков, сколько бы ни было создано экземпляров класса -- методы останутся там же, где они и были, и в том же количестве, в каком они и были.

Что происходит при создании объекта? Выделяется память для полей и служебных данных. Имеет ли значение, в каком именно потоке эта память выделилась? Нет, не имеет.

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

Кому надо -- тот поймёт.


 
Leonid Troyanovsky ©   (2006-07-04 23:28) [80]


> begin...end ©   (04.07.06 23:00) [79]

> целей). Относится ли эта память к какому-либо потоку? Конечно,
>  нет. А к какому-либо экземпляру? Да, разумеется.


С памятью, конечно, более-менее гладко, бо она прнадлежит процессу
("контейнеру").

Ну, а как быть с тем, что принадлежит самому потоку, скажем,
окна, хуки, акселераторы и др.?

Т.е., при прочих равных, (подобные) поля объектов, созданные
разными потоками,  могут отличаться и сущ-но.

> отличия в поведении этих объектов вызваны отнюдь не различиями
> самих объектов, а различиями потоков, исполняющих их методы.


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

--
Regards, LVT.



Страницы: 1 2 3 вся ветка

Форум: "Основная";
Текущий архив: 2006.08.27;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.65 MB
Время: 0.05 c
3-1150575476
Glivera
2006-06-18 00:17
2006.08.27
Создание Alias a


4-1146597197
err0rFrost
2006-05-02 23:13
2006.08.27
изменение темы рабочего стола в ХР


15-1153778077
lakb/proxy/
2006-07-25 01:54
2006.08.27
Component и русский аналог


1-1152715844
oleggar
2006-07-12 18:50
2006.08.27
автоматизация Paint или другой путь ?


2-1155025590
ttt_111
2006-08-08 12:26
2006.08.27
Работа со сканером штрих-кода.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский