Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Компоненты";
Текущий архив: 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
15-1148256877
vagra
2006-05-22 04:14
2006.06.18
Конец строки в Windows и Unix


2-1149081372
Fiallo4ka
2006-05-31 17:16
2006.06.18
базы на Delphi


15-1148359025
egert
2006-05-23 08:37
2006.06.18
Отправка письма через прокси


15-1148327115
evdiscovery
2006-05-22 23:45
2006.06.18
[работа] требуется программист Delphi на удаленную работу


15-1147329255
pavel_guzhanov
2006-05-11 10:34
2006.06.18
23.05.2006 Москва. Borland Developers Studio 2006: продуктивность





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский