/* libzzthread
 *
 * This program is distributed under the GNU General Public License, version 2.
 * A copy of this license is included with this source.
 *
 * Copyright 2000-2006, Toni Thomsson <toni@tonjac.org> 
*/

#ifndef zz_win_thread_h
#define zz_win_thread_h

#include <windows.h>
#include <zz_win_exception.h>

// Description: Exitkod som talar om att tråden "dödats hårt"
#define ZZ_THREAD_FORCED_STOP   0xFFFFFFFF

/*
    Description:
    Basklass för en windows tråd

    Remarks:
    Subklassa och implementera OnStart(). Skapa ett objekt av din klass
    och anropa Run() för att exekvera tråden, Run() anropar OnStart().
    Tråden avslutas när OnStart() har exekverat färdigt eller när Stop()
    anropas.

    Author: 
    Toni Thomsson, toni@tonjac.org

    Library:
    libzzthread.lib

    Platform:
    win32
*/
class ZZ_API CzzWinThread
{
public:

    /* 
        Description:
        Skapar en tråd

        Throws:
        CzzException
    */
    CzzWinThread();

    CzzWinThread( LPTHREAD_START_ROUTINE startf );
    
    // Remarks: Skapar en tråd med viss prioritet
    CzzWinThread( int prio );

    virtual ~CzzWinThread();

    // Description: Exekvera tråden
    // Throws: CzzException
    void Run( void );

    // Description: Kontrollerar om tråden exekverar
    bool Running( void );

    // Description: Stoppa tråden tillfälligt
    void Suspend( void );

    // Description: Starta tråden igen
    void Resume( void );

    /* 
        Description: 
        Stoppa tråden permanent

        Remarks:
        Tråden kan stoppas mjukt: den får göra klart det den håller på med
        och själv avgöra när den skall avslutas.
        Tråden kan stoppas hårt: avbryter oavsett vad tråden gör
    */
    void Stop( bool hard,       // IN, stoppflagga
                DWORD exitcode  // IN, exitkod
                );

    // Description: Exitkod
    DWORD ExitCode( void ) { return m_ExitCode; };

    // Description: Prioritet
    void SetPrio( int prio );
        
    /*
        Description:
        Anropas när tråden startar, jfr. ett vanligt programs main()

        Remarks:
        Skall implementeras i subklassen (överlagras) default
        implementationen gör inte något mer än sätter m_Running = false
    */
    virtual void OnStart( void ) { m_Running = false;
                                    m_ExitCode = 0; };
    
protected:

    // Description: Exitkod
    DWORD m_ExitCode;

    // Description: Flagga som talar om att tråden exekverat färdigt
    bool m_Running;

    // Description: Flagga som talar om att någon begärt att tråden skall stoppas
    bool m_StopRequest;

    unsigned long m_Id;
    DWORD m_SuspendCount;
    HANDLE m_Handle;
    int m_Prio;

    LPTHREAD_START_ROUTINE m_StartFunction;
 
private:
    static unsigned int WINAPI Begin( LPVOID param );

    void Cleanup(void);
};

#endif // zz_win_thread_h