//+---------------------------------------------------------------------------
//
//  Microsoft Windows
//  Copyright (C) Microsoft Corporation, 2000.
//
//  File:       U P T H R E A D . H 
//
//  Contents:   Threading support code
//
//  Notes:      
//
//  Author:     mbend   29 Sep 2000
//
//----------------------------------------------------------------------------

#pragma once

class CWorkItem
{
public:
    CWorkItem();
    virtual ~CWorkItem();

    HRESULT HrStart(BOOL bDeleteOnComplete);
protected:
    virtual DWORD DwRun() = 0;
    virtual ULONG GetFlags();
private:
    CWorkItem(const CWorkItem &);
    CWorkItem & operator=(const CWorkItem &);

    BOOL m_bDeleteOnComplete;

    static DWORD WINAPI DwThreadProc(void * pvParam);
};

class CThreadBase
{
public:
    CThreadBase();
    virtual ~CThreadBase();

    HRESULT HrStart(BOOL bDeleteOnComplete, BOOL bCreateSuspended);

    HRESULT HrGetExitCodeThread(DWORD * pdwExitCode);
    HRESULT HrResumeThread();
    HRESULT HrSuspendThread();
    HANDLE GetThreadHandle();
    DWORD GetThreadId();
    HRESULT HrWait(DWORD dwTimeoutInMillis, BOOL * pbTimedOut);
protected:
    virtual DWORD DwRun() = 0;
private:
    CThreadBase(const CThreadBase &);
    CThreadBase & operator=(const CThreadBase &);

    HANDLE m_hThread;
    DWORD m_dwThreadId;
    BOOL m_bDeleteOnComplete;

    static DWORD WINAPI DwThreadProc(void * pvParam);
};