![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Svyaz mejdu komponentami v odom unite [D7, WinXP]
Adil © (2005-12-03 00:28:00)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
gdaujk (2005-12-04 13:48:00) [1]jack128 © (04.12.05 12:13) [11]
Врядли что-то изменится в треаде. Execute в принципе абстрактный метод, предоставленный разработчику...
PS: а чё автор скажет, работает мой код, или нет... Я сам то не запускал :-)))
jack128 (2005-12-04 12:13:00) [2]В данном конкретном случае, с учетом того, что TThread - библиотечный класс, может и не имеет смысла, но в общем случае - лудше писать inherited; вдруг потом ты решишь в базовом класе сделать этот метод не абстрактным, а просто виртуальным? Тогда те придется искать всех потомком базового класса, а мой подход в некоторых случаях позволяет избежать этого.
gdaujk (2005-12-04 12:04:00) [3]jack128 © (04.12.05 10:08) [9]
Даже если ошибки и нет, вызывать абстрактный медод предка не имеет смысла...
jack128 (2005-12-04 10:08:00) [4]Юрий Зотов © (04.12.05 2:41) [6]
inherited; // Здесь получим Abstract Error
только на пятерке и ниже.
gdaujk (2005-12-04 07:09:00) [5]Юрий Зотов © (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;
gdaujk (2005-12-04 07:03:00) [6]Юрий Зотов © (04.12.05 02:41) [6]
Это пример. А если предположить, что перед помеченной вами строкой что-то очень долго делается? Да хотя бы:
procedure TAdilRunButtonThread.Execute;
begin
inherited; // Здесь получим Abstract Error
Sleep(60000); //сюда вставлять то, что надо сделать в треаде...
Syncronize(OwnerChange);
end;
Юрий Зотов (2005-12-04 02:41:00) [7]procedure TAdilRunButtonThread.Execute;
begin
inherited; // Здесь получим Abstract Error
Syncronize(OwnerChange); // Смысла в таком потоке нет никакого
end;
gdaujk (2005-12-04 02:29:00) [8]gdaujk © (04.12.05 02:27) [4]
Syncronize => Synchronize :-)
PS: извиняюсь за флуд...
gdaujk (2005-12-04 02:27:00) [9]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:16:00) [10]>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:09:00) [11]
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 секции...
Adil (2005-12-03 00:45:00) [12]Mojno TAdilRunButtonThread postavit v TAdilRunButton???