RSS registrovat login
Navigace: předchozí stranaúvodní strana
Ukázka použití eventů a threadů

V diskuzi na builderu se kdosi ptal, jak má z vlákna předávat data do hlavního vlákna a jak by se to dělalo přes události (neboli eventy). Napsal jsem proto v rychlosti tento malý příklad.

Někomu by se ještě mohlo hodit přečíst pár dalších informací o threadech.

unit
Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
// data predavana z eventu
type
TData =
record
value:integer;
end
;
// definice eventu
type
TMyEvent =
procedure
(Sender:TObject;data:TData)
of
object
;
// definice formulare
type
TForm1 =
class
(TForm) Button1: TButton;
procedure
Button1Click(Sender: TObject); private
// obsluha eventu
procedure
OnSomething(Sender:TObject; data:TData); public
{ Public declarations }
end
;
// definice vlakna
type
TMyThread =
class
(TThread) protected
// telo vlakna
procedure
Execute; override;
procedure
NotifySomething; public OnSomething : TMyEvent;
end
;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure
TForm1.Button1Click(Sender: TObject);
var
thread
:TMyThread;
begin
// vytvorime nove vlakno, true znamena, ze bude uspane
thread
:= TMyThread.Create(true);
// nastavime event
thread
.OnSomething := OnSomething;
// po dobehnuti se vlakno uvolni z pameti
thread
.FreeOnTerminate := true;
// spustime vlakno
thread
.Resume;
end
;
// obsluha eventu poslaneho z vlakna
procedure
TForm1.OnSomething(Sender: TObject; data: TData);
begin
Caption :=
'Thread dobehl s hodnotou '
+ IntToStr(data.value);
end
;
{ TMyThread }
// vlastni telo
procedure
TMyThread.Execute;
begin
inherited
; sleep(
2000
); Synchronize(NotifySomething);
end
;
procedure
TMyThread.NotifySomething;
var
data:TData;
begin
// pokud byl nastaven event, zavola se s odpovidajicimi argumenty
if
assigned(OnSomething)
then
begin
data.value := random(
100
); OnSomething(self, data);
end
;
end
;
end
.

Syntax higlighted by Syntax highlighter, available at www.4ITDevelopers.net and www.JakNaWin.com

Chování je celkem zřejmé - po stisku tlačítka se vytvoří vlákno v němž běží nějaký výpočet (to je simulované čekáním přes sleep) a na konci se vyvolá událost, v níž se nastaví titulek okna.

Tento kód určitě není dokonalý a pro praktické použití by se hodilo pár úprav - vlákno a definice eventu by měla být ve vlastní knihovně, deklarace eventu (tj v našem threadu OnSomething : TMyEvent;) bývá řešena přes property (OnSomething : TMyEvent read FOnSomething write FOnSomething). Tyto úpravy přenechávám čtenáři za domácí cvičení :-).

Informace ke stavu builder.cz zde


vytvořil Mi.Chal. 2.12. 2007 22:13, naposledy změněnil Mi.Chal. 2.12. 2007 22:45
přečteno: 3238x

Komentáře:
Žádné komentáře dosud nebyly vloženy.

Přidat komentář:
Jméno
E-mail
Web
Titulek
Obsah
thomas sabo rea mbt outlet thomas sabo charms sale louis vuitton taschen kaufen thomas sabo boutique mbt kaufen