Главная страница
    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.01 c
15-1148280138
Denis
2006-05-22 10:42
2006.06.18
Программирование микроконтроллеров Atmel - AVR Assembler


3-1145339093
Alex_KKK
2006-04-18 09:44
2006.06.18
Смена пароля


1-1145964438
Alexandr
2006-04-25 15:27
2006.06.18
новая страница word


15-1148273802
Ega23
2006-05-22 08:56
2006.06.18
С Днём рождения! 21 мая


15-1148727021
guest2006
2006-05-27 14:50
2006.06.18
Помогите перевести C++ на Delphi





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