121 lines
3.2 KiB
C++
121 lines
3.2 KiB
C++
/////////////////////////////////////////////////////////////////////////////
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// //
|
|
// Copyright (c) 1998-1999 Microsoft Corporation
|
|
//
|
|
// CWorkerThread & CWorkItem classes //
|
|
// //
|
|
// utilities for scheduling work in a separate thread //
|
|
// //
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
class CWorkItem
|
|
{
|
|
public:
|
|
virtual void DoTask() = 0;
|
|
|
|
virtual ~CWorkItem(){}
|
|
};
|
|
|
|
class CWorkerThread
|
|
{
|
|
//
|
|
// Helper class
|
|
//
|
|
class CAutoLock
|
|
{
|
|
public:
|
|
CAutoLock(CRITICAL_SECTION &hCritSec) : m_hCritSec(hCritSec)
|
|
{ ::EnterCriticalSection(&m_hCritSec); }
|
|
~CAutoLock()
|
|
{ ::LeaveCriticalSection(&m_hCritSec); }
|
|
CRITICAL_SECTION &m_hCritSec;
|
|
};
|
|
|
|
public:
|
|
CWorkerThread() : m_fShutDown(false), m_hThread(NULL)
|
|
{
|
|
InitializeCriticalSection(&m_hCritSec);
|
|
m_hSemStart = CreateSemaphore(NULL, 0, 1, NULL);
|
|
m_hSemDone = CreateSemaphore(NULL, 0, 1, NULL);
|
|
}
|
|
|
|
virtual ~CWorkerThread()
|
|
{
|
|
CAutoLock l(m_hCritSec);
|
|
|
|
if (m_hThread != NULL)
|
|
{
|
|
//
|
|
// Shut down the worker thread. Using the control
|
|
// signaling mechanism.
|
|
//
|
|
m_fShutDown = true;
|
|
::ReleaseSemaphore(m_hSemStart, 1L, NULL);
|
|
|
|
//
|
|
// Now wait for the thread to terminate.
|
|
//
|
|
WaitForSingleObject(m_hThread, INFINITE);
|
|
}
|
|
CloseHandle(m_hSemDone);
|
|
CloseHandle(m_hSemStart);
|
|
}
|
|
|
|
//
|
|
// Operations
|
|
//
|
|
HRESULT AsyncWorkItem(CWorkItem *pItem);
|
|
private:
|
|
//
|
|
// Syncronization
|
|
//
|
|
CRITICAL_SECTION m_hCritSec;
|
|
HANDLE m_hSemStart;
|
|
HANDLE m_hSemDone;
|
|
|
|
//
|
|
// Normal thread data
|
|
//
|
|
HANDLE m_hThread;
|
|
DWORD m_dwThreadID;
|
|
|
|
//
|
|
// Control
|
|
//
|
|
bool m_fShutDown;
|
|
CWorkItem* m_pItem;
|
|
|
|
//
|
|
// Thread Proceduce
|
|
//
|
|
static DWORD WINAPI WorkerThreadProc( LPVOID pv );
|
|
};
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Work items from above go here
|
|
|
|
// plays
|
|
class CStreamMessageWI : public CWorkItem
|
|
{
|
|
public:
|
|
CStreamMessageWI()
|
|
: m_pPlayStreamTerm(NULL),
|
|
m_pRecordStreamTerm(NULL)
|
|
{}
|
|
|
|
BOOL Init(ITTerminal *pPlayStreamTerm, ITTerminal *pRecordStreamTerm);
|
|
|
|
virtual void DoTask();
|
|
|
|
virtual ~CStreamMessageWI();
|
|
|
|
protected:
|
|
ITTerminal *m_pPlayStreamTerm;
|
|
ITTerminal *m_pRecordStreamTerm;
|
|
};
|
|
|
|
|