Форум: "Компоненты";
Текущий архив: 2006.06.18;
Скачать: [xml.tar.bz2];
Вниз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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.012 c