RSS registrovat login
Navigace: předchozí stranaúvodní strana
Pár informací o vláknech (threadech) - v přípravě

Docela často se v konferenci řeší problémy s vláknami, zde se pokusím sepsat ty nejdůležitější informace, pokud si myslíte, že jsem na něco zapomněl, připište to do diskuze...

Dodatek: náhodou jsem narazil na celkem obsáhlý materiál s informacemi o threadech. Nečetl jsem to, ale je tam toho celkem dost - viz Semiho web.

K čemu jsou vlákna dobrá?
Pokud píšete aplikaci, tak některé operace mohou trvat relativně dlouho, během tohoho zpracování (pokud se například volá nějaká časově náročná operace v události OnClick tlačítka) aplikace "zatuhne" a na nic nereaguje. Řešením je použít vlákna - pak běží několik operací jakoby najednou, takže aplikaci lze dále ovládat a na pozadí běží časově náročný kód, který ale nebrzdí reakce aplikace.

Jak takové vlákno vypadá?
Obecná struktura může vypadat asi takhle:

type
TVlakno =
class
(TThread)
procedure
Execute;override;
end
;
{ TVlakno }
procedure
TVlakno.Execute;
begin
while
not
terminated
do
begin
Beep(); sleep(
2000
);
end
;
end
;
// vytvoreni a spusteni
procedure
TForm1.Button1Click(Sender: TObject);
var
vlakno:TVlakno;
begin
vlakno:=TVlakno.Create(true);
// true - po vytvoreni se hned nespusti...
vlakno.Resume;
end
;

Syntax higlighted by Syntax highlighter, available at www.4ITDevelopers.net and www.JakNaWin.com
Asi by se hodilo pár slov na vysvětlení - v Delphi lze vlákna jednoduše udělat tak, že vytvoříte vlastní třídu odděděnou od TThread (ta se nachází v classes). V této třídě se přepíše virtuální metoda execute, do které se napíše kód. V podstatě existují dva způsoby - buď se tam napíše dlouhotrvající kód po jehož doběhnutí se vlákno ukončí nebo relativně krátký kód, který se vykonává pořád dokola dokud se nezavolá metoda Terminate (jako v tomto příkladě). Po vytvoření vlákna a případném zavolání Resume (hlavně nevolejte Execute :-)) se začne kód ve vlákně vykonávat.

Na co si dát pozor, co se nesmí a musí...
V kódu vlákna se nesmí přímo přistupovat k VCL komponentám (tlačítka atd), obzvláště pro zápis. Pokud tam dáte třeba

form1.button1.caption:='titulek';

tak se to bude chovat dost blbě. Takovéto přístupy je potřeba dělat přes Synchronize, coz je metoda Threadu, jako parametr je vaše metoda bez parametrů. Pokud budete mít metodu třeba UdelejNeco, která změní něco na formuláři, tak se volá (v rámci metod vlákna) jako

Synchronize(DelejNeco);

Drobný nedostatek je, že se nedají přímo předat parametry, obejít se to dá třeba tak, že DelejNeco bude pracovat s atributy toho threadu...

Pokud vlákno běží delší dobu a opakuje nějakou relativně krátkou činnost, tak je vhodné / nutné ve vlákně volat sleep (nebo nějaký jiný způsob čekání, třeba WaitFor...). Pokud se to totiž neudělá, tak se kód volá pořád dokola, důsledek je třeba to,, že se zatěžuje procesor na 100% a hlavní vlákno obsluhující zprávy z windows (třeba překreslení komponent atd) se skoro nedostane ke slovu. Pak to vypadá, že aplikace je vytuhlá a nic se neděje...


Toto by bylo pro začátek asi všechno, pokračování zase někdy jindy... :-)

Informace ke stavu builder.cz zde


vytvořil Mi.Chal. 10.9. 2005 12:37, naposledy změněnil Mi.Chal. 25.4. 2007 20:14
přečteno: 9586x

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