Delphi - Thread komponens

forráskód letöltése
Több szálon futó alkalmazások készítésekor az új szál leprogramozása csupán forráskód szinten történhet a TThread objektumból való származtatással. Mennyivel egyszerűbb lenne a helyzet, ha lenne egy komponens, mely egy-egy szálat képviselne és ahol a property-ken keresztül beállíthatnánk az adott szál tulajdonságait, illetve eseményein keresztül megadhatnánk, hogy ténylegesen mit is tegyen az adott szál. A mellékelt példaprogram megnyitása előtt a ThreadComponent.pas-ban lévő komponenst telepítenie kell a Delphi alá.

A komponens egy Form-on történő elhelyezésekor a szál rögtön létrejön, de a Resume eljárás hívásáig nem fog futni.

A Suspend eljárással ismét felfüggeszthetjük a szál futását. A Suspend property igazra állítása egyenértékű a Suspend hívásával.

A Terminate hívásával lezárhatjuk szálat. Ekkor, illetve ha a szál végzett a munkával a Terminated property igaz értéket ad vissza.

Amikor elindul a szál, akkor jön létre az OnExecute esemény. Ezt felhasználva adhatjuk meg a szál tényleges munkáját.

A hagyományos szálak használatakor megszokott VCL objektumokhoz való hozzáférés most is csak a Synchronize eljáráson keresztül történhet. Itt paraméterként kell megadnunk azt az eljárást, mely a szükséges munkát elvégzi a VCL objektumokkal.

Ha a FreeOnTerminate property-t igazra állítjuk, akkor a szál lefutása után automatikusan fel is szabadul a szál által lefoglalt memória terület.

A Priority property-n keresztül a szál prioritása adható meg. Az itt lévő értékek megfelelnek a TThread objektum Priority property-énél találhatókkal.

A szál visszatérési értéke a ReturnValue property-ben adható meg.

Amikor egy szál futása véget ér, akkor erről az OnTerminate esemény értesít bennünket.


A komponens megvalósítása viszonylag egyszerű, csupán létre kell hoznunk egy objektumot TThread-ből származtatva, melynek property-eit a komponensünk property-ei alapján állítjuk be.

Mivel a TThread-ben az Execute eljárás hívásakor kellene megadnunk a szükséges kódot, így ehhez itt most egy OnExecute eljárást készítünk. Ugyanezzel a névvel a komponenshez is készítünk egy ilyen eseményt, így most már megadható a kód a komponensen kívülről is.