// Implementacja funkcji wtku podzielona zostaa na dwie czci:
// 1. FunkcjaWatku() - funkcj wejciow;
// 2. FunkcjaWatkuL() - funkcj waciw , ktra moe wygenerowa wyjcie.

void FunkcjaWatkuL( TAny* aParametr )
{
    // Tworzymy oraz instalujemy instancj Zarzdcy Aktywnoci.
    CActiveScheduler* zarzAkt = new( ELeave ) CActiveScheduler();
    CleanupStack::PushL( zarzAkt );
    CActiveScheduler::Install( zarzAkt );
    
    // Przed wystartowaniem ptli Zarzdcy Aktywnoci musimy
    // utworzy przynajmniej jeden aktywny obiekt z uruchomion
    // usug asynchroniczn.
    CParametryWatku* parametry = static_cast< CParametryWatku* >( aParametr );
    CPlikTymczasowy* plik = CPlikTymczasowy::NewLC( parametry->iPlikTymczasowy );
    plik->ZapiszDane( *parametry->iDane );
    
    // Starujemy ptl Zarzdcy Aktywnoci.
    CActiveScheduler::Start();
    // Weryfikujemy wynik.
    User::LeaveIfError( plik->Blad() );
    
    // Zwalniamy obiekty.
    CleanupStack::PopAndDestroy( plik );
    CleanupStack::PopAndDestroy( zarzAkt );
}

TInt FunkcjaWatku( TAny* aParametr )
{
    // Definicja paniki.
    _LIT( KKategoria, "WatekDodatkowy" );
    const TInt KBrakStosuCleanupStack = 1;
    
    // Tworzymy stos CleanupStack.
    CTrapCleanup* cleanupStack = CTrapCleanup::New();
    __ASSERT_ALWAYS( cleanupStack != NULL, User::Panic( KKategoria, KBrakStosuCleanupStack ) );
    
    // Wykonujemy waciw funkcj wtku.
    TRAPD( blad, FunkcjaWatkuL( aParametr ) );
    
    // Zwalniamy stos CleanupStack i wychodzimy z funkcji.
    delete cleanupStack;
    return blad;
}

// ...

// Parametry przekazywane do funkcji wtku bd zgrupowane
// w obiekcie klasy CParametryWatku:
class CParametryWatku : public CBase
{
    public:    // Konstruktor/destruktor
        CParametryWatku(){}
        ~CParametryWatku(){ delete iDane; }
    
    public:    // Pola
        HBufC8* iDane;
        TFileName iPlikTymczasowy;
};

// ...

// Funkcja przygotowujca dane tymczasowe
HBufC8* PobierzDaneTymczasowe()
{
    HBufC8* dane = NULL;
    // Implementacja pominita
    return dane;
}

// ...

// Tworzymy wtek.
_LIT( KNazwaWatku, "WatekDanychTymczasowych" );
const TInt KMinRozmiarSterty = 4*1024;
const TInt KMazRozmiarSterty = 128*1024;

// Przygotowujemy parametry wtku.
iParametryWatku = new( ELeave ) CParametryWatku();
iParametryWatku->iDane = PobierzDaneTymczasowe();;
TAny* parametry = static_cast< TAny* >( iParametryWatku );

TInt blad = iWatek.Create( KNazwaWatku,
                FunkcjaWatku,
                KDefaultStackSize,    // stos 8 KB,
                KMinRozmiarSterty,    // 4 KB
                KMazRozmiarSterty,    // 128 KB
                parametry );

if( blad == KErrNone )
{
    // Uruchamiamy wtek.
    iWatek.Resume();
}
