#include "StdAfx.h"
|
#include "SWorkThread.h"
|
|
CSWorkThread::CSWorkThread(ISWorkThread2Parent *pSWSTP, int nThreadCount) : m_pSWT2P(pSWSTP), CSThreadControl(nThreadCount)
|
{
|
m_pWork = NULL;
|
m_pWorkCallback = WorkCallback;
|
}
|
|
CSWorkThread::~CSWorkThread(void)
|
{
|
CloseWorkThread();
|
}
|
|
VOID CALLBACK CSWorkThread::WorkCallback(PTP_CALLBACK_INSTANCE pInstance, PVOID pParameter, PTP_WORK pWork)
|
{
|
// Instance, Parameter, and Work not used in this example.
|
UNREFERENCED_PARAMETER(pInstance);
|
UNREFERENCED_PARAMETER(pParameter);
|
UNREFERENCED_PARAMETER(pWork);
|
|
// Do something when the work callback is invoked.
|
CSWorkThreadData *pDataPtr = static_cast<CSWorkThreadData*>(pParameter);
|
if (pDataPtr)
|
{
|
CSWorkThread *pThreadPtr = static_cast<CSWorkThread*>(pDataPtr->pCallerPtr);
|
pThreadPtr->RunWorkThread(pParameter);
|
}
|
|
return;
|
}
|
|
BOOL CSWorkThread::CreateWorkThread(PVOID pParameter)
|
{
|
if (NULL==m_pPool || NULL==m_pCleanupGroup) return FALSE;
|
|
m_pWork = CreateThreadpoolWork((PTP_WORK_CALLBACK)WorkCallback, pParameter, &m_CallBackEnviron);
|
if (NULL==m_pWork) return FALSE;
|
|
SubmitThreadpoolWork(m_pWork);
|
|
return TRUE;
|
}
|
|
void CSWorkThread::CloseWorkThread()
|
{
|
if (NULL==m_pWork) return;
|
|
WaitForThreadpoolWorkCallbacks(m_pWork, TRUE);
|
|
CloseThreadpoolWork(m_pWork);
|
|
m_pWork = NULL;
|
}
|
|
void CSWorkThread::RunWorkThread(PVOID pParameter)
|
{
|
CSWorkThreadData *pDataPtr = static_cast<CSWorkThreadData*>(pParameter);
|
if (pDataPtr==NULL) return;
|
|
CSWorkThread *pThreadPtr = static_cast<CSWorkThread*>(pDataPtr->pCallerPtr);
|
if (pThreadPtr)
|
{
|
pThreadPtr->WorkThreadProcess(pParameter);
|
}
|
|
delete pDataPtr;
|
}
|
|
void CSWorkThread::WorkThreadProcess( PVOID pParameter )
|
{
|
if (m_pSWT2P==NULL) return;
|
|
CSWorkThreadData *pDataPtr = static_cast<CSWorkThreadData*>(pParameter);
|
if (pDataPtr==NULL) return;
|
|
m_pSWT2P->ISWT2P_SendSignalData(pDataPtr->nSignalType, pDataPtr->nSignalIndex, pDataPtr->nSignalValue, pDataPtr->dwDelayTime, pDataPtr->dwHoldTime);
|
}
|
|
BOOL CSWorkThread::AddThreadData( int nType, int nIndex, int nValue, DWORD dwDelay, DWORD dwHold )
|
{
|
if (m_pSWT2P==NULL) return FALSE;
|
|
CSWorkThreadData *pThreadData = new CSWorkThreadData(this);
|
if (pThreadData==NULL) return FALSE;
|
|
pThreadData->nSignalType = nType;
|
pThreadData->nSignalIndex = nIndex;
|
pThreadData->nSignalValue = nValue;
|
pThreadData->dwDelayTime = dwDelay;
|
pThreadData->dwHoldTime = dwHold;
|
|
return CreateWorkThread(pThreadData);
|
}
|