//  --------------------------------------------------------------------------
//  Module Name: Thread.h
//
//  Copyright (c) 1999-2000, Microsoft Corporation
//
//  Base class that implements thread functionality. Subclass this class and
//  implement the virtual ThreadEntry function. When you instantiate this
//  class a thread gets created which will call ThreadEntry and when that
//  function exits will call ThreadExit. These objects should be created using
//  operator new because the default implementation of ThreadExit does
//  "->Release()". You should override this function if you don't want this
//  behavior. The threads are also created SUSPENDED. You make any changes
//  that are required in the subclass' constructor. At the end of the
//  constructor or from the caller of operator new a "->Resume()" can be
//  invoked to start the thread.
//
//  History:    1999-08-24  vtan        created
//              2000-02-01  vtan        moved from Neptune to Whistler
//  --------------------------------------------------------------------------

#ifndef     _Thread_
#define     _Thread_

#include "CountedObject.h"

//  --------------------------------------------------------------------------
//  CThread
//
//  Purpose:    A base class to manage threads.
//
//  History:    1999-08-24  vtan        created
//              2000-02-01  vtan        moved from Neptune to Whistler
//  --------------------------------------------------------------------------

class   CThread : public CCountedObject
{
    public:
                                CThread (DWORD stackSpace = 0, DWORD createFlags = 0, HANDLE hToken = NULL);
        virtual                 ~CThread (void);

                                operator HANDLE (void)                      const;

                bool            IsCreated (void)                            const;

                void            Suspend (void)                              const;
                void            Resume (void)                               const;
                NTSTATUS        Terminate (void);

                bool            IsCompleted (void)                          const;
                DWORD           WaitForCompletion (DWORD dwMilliseconds)    const;
                DWORD           GetResult (void)                            const;

                int             GetPriority (void)                          const;
                void            SetPriority (int newPriority)               const;
    protected:
        virtual DWORD           Entry (void) = 0;
        virtual void            Exit (void);

                NTSTATUS        SetToken (HANDLE hToken);
    private:
        static  DWORD   WINAPI  ThreadEntryProc (void *pParameter);
    protected:
                HANDLE          _hThread;
                bool            _fCompleted;
};

#endif  /*  _Thread_    */