typedef BOOL (* THREADCALLBACK)(PVOID pParam, DWORD dwParam);

// general purpose worker thread
// The thread exists in an alertable Wait state and does most of its work
// in APCs.

struct ThreadCallback
{
	THREADCALLBACK CallProc;
	PVOID pParam;
	DWORD dwParam;
};

class CEventThread
{
public:
	CEventThread();
	~CEventThread();
	int Start();
	int Stop();
	BOOL CallNow(THREADCALLBACK CallProc, PVOID pParam, DWORD dwParam);
	//BOOL WaitOnEvent(THREADCALLBACK OnEventProc, PVOID pParam, DWORD dwParam);
private:
#define CTHREADF_STOP		0x00000001
	static DWORD  __stdcall EventThreadProc(PVOID pObj)
	{
		return ((class CEventThread *)pObj)->ThreadMethod();
	}
	static void APIENTRY HandleCallNowAPC(DWORD dwArg);
	DWORD ThreadMethod();

	HANDLE m_hThread;
	DWORD m_idThread;
	UINT m_uRef;
	HANDLE m_hSignalEvent;	// signal to worker thread to do something
	HANDLE m_hAckEvent;		// ack from worker thread
	DWORD m_dwFlags;
	CRITICAL_SECTION m_cs;	// serializes client calls. Not used by worker thread
	ThreadCallback m_Callback;
};