#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(pParameter); if (pDataPtr) { CSWorkThread *pThreadPtr = static_cast(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(pParameter); if (pDataPtr==NULL) return; CSWorkThread *pThreadPtr = static_cast(pDataPtr->pCallerPtr); if (pThreadPtr) { pThreadPtr->WorkThreadProcess(pParameter); } delete pDataPtr; } void CSWorkThread::WorkThreadProcess( PVOID pParameter ) { if (m_pSWT2P==NULL) return; CSWorkThreadData *pDataPtr = static_cast(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); }