Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.06.18;
Скачать: CL | DM;

Вниз

Svyaz mejdu komponentami v odom unite   Найти похожие ветки 

 
Adil ©   (2005-12-03 00:28) [0]

Zdravstvuyte mastera.
Ya natvoril durackiy vesh. Voobshim odin komponent na base image.
i vnutri etoqo unita est Thread:


type
 TAdilRunButtonThread = class(TThread)
 protected
   procedure Execute; override;
 end;

type
 TAdilRunButton = class(TImage)
 private
   { Private declarations }
 protected
   { Protected declarations }
   destructor Destroy; override;
   constructor Create(AOwner: TComponent); override;
 public
   { Public declarations }
 published
   { Published declarations }
 end;

Kak mne chto v "procedure TAdilRunButtonThread.Execute; " dobratsa v TAdilRunButton ??
Toest naprimer iz procedure TAdilRunButtonThread.Execute; na kanvas TAdilRunButton-a narisovat kakuyu nibud liniyu.

Thanks


 
Adil ©   (2005-12-03 00:45) [1]

Mojno TAdilRunButtonThread postavit v TAdilRunButton???


 
gdaujk ©   (2005-12-04 02:09) [2]

type
 TAdilRunButton = class;

 TAdilRunButtonThread = class(TThread)
 private
   FOwner: TAdilRunButton;
   procedure SetOwner(Value: TAdilRunButton);
 protected
   procedure Execute; override;
 public
   property Owner: TAdilRunButton read FOwner write SetOwner;
 end;

 TAdilRunButton = class(TImage)
 private
   FTread: TAdilRunButtonThread;
 public
   constructor Create(AOwner: TComponent); override;
   destructor Destroy; override;
   procedure CreateAdilTread;
 end;

implementation

{ TAdilRunButton }

constructor TAdilRunButton.Create(AOwner: TComponent);
begin
 inherited;

end;

destructor TAdilRunButton.Destroy;
begin

 inherited;
end;

procedure TAdilRunButton.CreateAdilTread;
begin
 FTread := TAdilRunButtonThread.Create(False);
 FTread.Owner := Self;
end;

{ TAdilRunButtonThread }

procedure TAdilRunButtonThread.Execute;
begin
 inherited;

end;

procedure TAdilRunButtonThread.SetOwner(Value: TAdilRunButton);
begin
 FOwner := Value;
end;


PS: конструкторы и деструкторы должны быть в public секции...


 
gdaujk ©   (2005-12-04 02:16) [3]

>Kak mne chto v "procedure TAdilRunButtonThread.Execute; " dobratsa v TAdilRunButton ??

...

procedure TAdilRunButtonThread.Execute;
begin
 inherited;
 FOwner.Picture.LoadFromFile("Колобок.bmp");  //<= доступ к TAdilRunButton, породившему треад
end;


 
gdaujk ©   (2005-12-04 02:27) [4]

gdaujk ©   (04.12.05 02:16) [3]

Блин, по-моему так делать нельзя. Код, обновляющий данные пользовательского интерфейса, должен выполнятся в контексте основного потока. Т. е. надо вот так (результат не гарантирую):

...
 TAdilRunButtonThread = class(TThread)
 private
   FOwner: TAdilRunButton;
   procedure SetOwner(Value: TAdilRunButton);
 protected
   procedure Execute; override;
   procedure OwnerChange();
 public
   property Owner: TAdilRunButton read FOwner write SetOwner;
 end;

...

implementation

...

procedure TAdilRunButtonThread.Execute;
begin
 inherited;
 Syncronize(OwnerChange);
end;

procedure TAdilRunButtonThread.OwnerChange;
begin
 FOwner.Picture.LoadFromFile("Колобок.bmp");
end;

...


 
gdaujk ©   (2005-12-04 02:29) [5]

gdaujk ©   (04.12.05 02:27) [4]

Syncronize => Synchronize :-)

PS: извиняюсь за флуд...


 
Юрий Зотов ©   (2005-12-04 02:41) [6]

procedure TAdilRunButtonThread.Execute;
begin
 inherited; // Здесь получим Abstract Error
 Syncronize(OwnerChange); // Смысла в таком потоке нет никакого
end;


 
gdaujk ©   (2005-12-04 07:03) [7]

Юрий Зотов ©   (04.12.05 02:41) [6]

Это пример. А если предположить, что перед помеченной вами строкой что-то очень долго делается? Да хотя бы:

procedure TAdilRunButtonThread.Execute;
begin
inherited; // Здесь получим Abstract Error
Sleep(60000);         //сюда вставлять то, что надо сделать в треаде...
Syncronize(OwnerChange);
end;


 
gdaujk ©   (2005-12-04 07:09) [8]

Юрий Зотов ©   (04.12.05 02:41) [6]

Хм, а про Abstract Error вы абсолютно правы, недосмотрел... Надо что-то типа:

procedure TAdilRunButtonThread.Execute;
var
 I: Integer;
begin
 FreeOnTerminate := True;
 for I := 0 to 100 do
 begin
   if Terminated then Break;
   //do something
   Synchronize(OwnerChange);
 end;
end;


 
jack128 ©   (2005-12-04 10:08) [9]

Юрий Зотов ©   (04.12.05 2:41) [6]
inherited; // Здесь получим Abstract Error

только на пятерке и ниже.


 
gdaujk ©   (2005-12-04 12:04) [10]

jack128 ©   (04.12.05 10:08) [9]

Даже если ошибки и нет, вызывать абстрактный медод предка не имеет смысла...


 
jack128 ©   (2005-12-04 12:13) [11]

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


 
gdaujk ©   (2005-12-04 13:48) [12]

jack128 ©   (04.12.05 12:13) [11]

Врядли что-то изменится в треаде. Execute в принципе абстрактный метод, предоставленный разработчику...

PS: а чё автор скажет, работает мой код, или нет... Я сам то не запускал :-)))



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

Текущий архив: 2006.06.18;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.038 c
11-1128580798
Zoom
2005-10-06 10:39
2006.06.18
FindReplaceDialog


1-1147443885
parovoZZ
2006-05-12 18:24
2006.06.18
Результат функции по событию в dll


2-1149105731
Тимофеич
2006-06-01 00:02
2006.06.18
работа с текстом


15-1147976599
Nic
2006-05-18 22:23
2006.06.18
Как можно себя поддержать в рабочем состоянии


1-1147437914
SergeNew
2006-05-12 16:45
2006.06.18
TStringGrid