371 lines
8.7 KiB
C++
371 lines
8.7 KiB
C++
|
|
#include "StdAfx.h"
|
|||
|
|
#include "TraceService.h" // #include "EventService.h"
|
|||
|
|
#include "AsynchronismEngine.h"
|
|||
|
|
|
|||
|
|
//////////////////////////////////////////////////////////////////////////
|
|||
|
|
//<2F>궨<EFBFBD><EAB6A8>
|
|||
|
|
|
|||
|
|
#define WM_ASYN_REQUEST WM_USER+10 //<2F>첽<EFBFBD><ECB2BD><EFBFBD><EFBFBD>
|
|||
|
|
|
|||
|
|
//////////////////////////////////////////////////////////////////////////
|
|||
|
|
|
|||
|
|
BEGIN_MESSAGE_MAP(CControlWnd, CWnd)
|
|||
|
|
ON_MESSAGE(WM_ASYN_REQUEST, OnAsynRequest)
|
|||
|
|
END_MESSAGE_MAP()
|
|||
|
|
|
|||
|
|
//////////////////////////////////////////////////////////////////////////
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD>캯<EFBFBD><ECBAAF>
|
|||
|
|
CControlWnd::CControlWnd()
|
|||
|
|
{
|
|||
|
|
m_pAsynchronismEngine = NULL;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
CControlWnd::~CControlWnd()
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
|
|||
|
|
HRESULT CControlWnd::OnAsynRequest(WPARAM wParam, LPARAM lParam)
|
|||
|
|
{
|
|||
|
|
//Ч<><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
ASSERT(m_pAsynchronismEngine != NULL);
|
|||
|
|
|
|||
|
|
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
|
|||
|
|
WORD wRequestID = (WORD)wParam;
|
|||
|
|
IAsynchronismEngineSink * pIAsynchronismEngineSink = (IAsynchronismEngineSink *)lParam;
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
ASSERT(pIAsynchronismEngineSink != NULL);
|
|||
|
|
m_pAsynchronismEngine->OnAsynchronismRequest(wRequestID, pIAsynchronismEngineSink);
|
|||
|
|
|
|||
|
|
return 0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//////////////////////////////////////////////////////////////////////////
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD>캯<EFBFBD><ECBAAF>
|
|||
|
|
CMessageThread::CMessageThread()
|
|||
|
|
{
|
|||
|
|
m_pAsynchronismEngine = NULL;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
CMessageThread::~CMessageThread()
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD>к<EFBFBD><D0BA><EFBFBD>
|
|||
|
|
bool CMessageThread::OnEventThreadRun()
|
|||
|
|
{
|
|||
|
|
MSG Message;
|
|||
|
|
if (GetMessage(&Message, NULL, 0, 0))
|
|||
|
|
{
|
|||
|
|
TranslateMessage(&Message);
|
|||
|
|
DispatchMessage(&Message);
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//ֹͣ<CDA3>߳<EFBFBD>
|
|||
|
|
bool CMessageThread::StopThread(DWORD dwWaitSeconds)
|
|||
|
|
{
|
|||
|
|
PostThreadMessage(WM_QUIT, 0, 0);
|
|||
|
|
return __super::ConcludeThread(dwWaitSeconds);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><>ֹ<EFBFBD>߳<EFBFBD>
|
|||
|
|
bool CMessageThread::TerminateThread(DWORD dwExitCode)
|
|||
|
|
{
|
|||
|
|
PostThreadMessage(WM_QUIT, 0, 0);
|
|||
|
|
return __super::ConcludeThread(INFINITE);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><>ʼ<EFBFBD>¼<EFBFBD>
|
|||
|
|
bool CMessageThread::OnThreadStratEvent()
|
|||
|
|
{
|
|||
|
|
ASSERT(m_pAsynchronismEngine != NULL);
|
|||
|
|
return m_pAsynchronismEngine->OnMessageThreadStart();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//ֹͣ<CDA3>¼<EFBFBD>
|
|||
|
|
bool CMessageThread::OnThreadStopEvent()
|
|||
|
|
{
|
|||
|
|
ASSERT(m_pAsynchronismEngine != NULL);
|
|||
|
|
return m_pAsynchronismEngine->OnMessageThreadStop();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//////////////////////////////////////////////////////////////////////////
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD>캯<EFBFBD><ECBAAF>
|
|||
|
|
CAsynchronismEngine::CAsynchronismEngine(void)
|
|||
|
|
{
|
|||
|
|
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
|
|||
|
|
m_bService = false;
|
|||
|
|
memset(m_cbBuffer, 0, sizeof(m_cbBuffer));
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
m_ControlWnd.m_pAsynchronismEngine = this;
|
|||
|
|
m_MessageThread.m_pAsynchronismEngine = this;
|
|||
|
|
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
CAsynchronismEngine::~CAsynchronismEngine(void)
|
|||
|
|
{
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F>ӿڲ<D3BF>ѯ
|
|||
|
|
void * CAsynchronismEngine::QueryInterface(const IID & Guid, DWORD dwQueryVer)
|
|||
|
|
{
|
|||
|
|
QUERYINTERFACE(IAsynchronismEngine, Guid, dwQueryVer);
|
|||
|
|
QUERYINTERFACE_IUNKNOWNEX(IAsynchronismEngine, Guid, dwQueryVer);
|
|||
|
|
return NULL;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
bool CAsynchronismEngine::StartService()
|
|||
|
|
{
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>߳<EFBFBD>
|
|||
|
|
if (m_MessageThread.StartThread() == false) return false;
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
|
|||
|
|
m_bService = true;
|
|||
|
|
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//ֹͣ<CDA3><D6B9><EFBFBD><EFBFBD>
|
|||
|
|
bool CAsynchronismEngine::ConcludeService()
|
|||
|
|
{
|
|||
|
|
//<2F><><EFBFBD>ñ<EFBFBD><C3B1><EFBFBD>
|
|||
|
|
m_bService = false;
|
|||
|
|
|
|||
|
|
//ֹͣ<CDA3>߳<EFBFBD>
|
|||
|
|
m_MessageThread.ConcludeThread(INFINITE);
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
m_DataStorage.RemoveData(false);
|
|||
|
|
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
bool CAsynchronismEngine::InsertRequest(WORD wRequestID, void * const pBuffer, WORD wDataSize, IUnknownEx * pIUnknownEx)
|
|||
|
|
{
|
|||
|
|
//Ч<><D0A7>״̬
|
|||
|
|
ASSERT(wDataSize <= sizeof(m_cbBuffer));
|
|||
|
|
if (m_bService == false) return false;
|
|||
|
|
if (wDataSize > sizeof(m_cbBuffer)) return false;
|
|||
|
|
|
|||
|
|
//<2F><>ѯ<EFBFBD>ӿ<EFBFBD>
|
|||
|
|
IAsynchronismEngineSink * pIAsynchronismEngineSink = QUERY_OBJECT_PTR_INTERFACE(pIUnknownEx, IAsynchronismEngineSink);
|
|||
|
|
ASSERT(pIAsynchronismEngineSink != NULL);
|
|||
|
|
if (pIAsynchronismEngineSink == NULL) return false;
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
CWHDataLocker lcok(m_CriticalSection); // CWHDataLockerHandle ThreadLockHandle(&m_ThreadLock);
|
|||
|
|
if (m_DataStorage.InsertData(wRequestID, pBuffer, wDataSize) == false) return false;
|
|||
|
|
|
|||
|
|
//Ͷ<><CDB6><EFBFBD><EFBFBD>Ϣ
|
|||
|
|
PostMessage(m_ControlWnd.m_hWnd, WM_ASYN_REQUEST, wRequestID, (LPARAM)pIAsynchronismEngineSink);
|
|||
|
|
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD>и<EFBFBD><D0B8><EFBFBD>
|
|||
|
|
bool CAsynchronismEngine::GetBurthenInfo( tagBurthenInfo & BurthenInfo )
|
|||
|
|
{
|
|||
|
|
ASSERT(TRUE);ASSERT(FALSE);
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//ע<>ṳ<EFBFBD><E1B9B3>
|
|||
|
|
bool CAsynchronismEngine::SetAsynchronismSink(IUnknownEx * pIUnknownEx)
|
|||
|
|
{
|
|||
|
|
//<2F><>ȡ<EFBFBD>ӿ<EFBFBD>
|
|||
|
|
IAsynchronismEngineSink * pIAsynchronismEngineSink = QUERY_OBJECT_PTR_INTERFACE(pIUnknownEx, IAsynchronismEngineSink);
|
|||
|
|
ASSERT(pIAsynchronismEngineSink != NULL);
|
|||
|
|
if (pIAsynchronismEngineSink == NULL) return false;
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD>
|
|||
|
|
IAsynchronismEngineSink * pIAsynchronismEngineSinkTemp = NULL;
|
|||
|
|
for (INT_PTR i = 0; i < m_AsynchronismEngineSinkArray.GetCount(); i++)
|
|||
|
|
{
|
|||
|
|
pIAsynchronismEngineSinkTemp = m_AsynchronismEngineSinkArray[i];
|
|||
|
|
ASSERT(pIAsynchronismEngineSinkTemp != NULL);
|
|||
|
|
if (pIAsynchronismEngineSinkTemp == pIAsynchronismEngineSink) return false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//ע<>ṳ<EFBFBD><E1B9B3>
|
|||
|
|
m_AsynchronismEngineSinkArray.Add(pIAsynchronismEngineSink);
|
|||
|
|
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//Ͷ<><CDB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
bool CAsynchronismEngine::PostAsynchronismData(WORD wIdentifier, VOID * pData, WORD wDataSize)
|
|||
|
|
{
|
|||
|
|
//Ч<><D0A7>״̬
|
|||
|
|
ASSERT(wDataSize <= sizeof(m_cbBuffer));
|
|||
|
|
if (m_bService == false) return false;
|
|||
|
|
if (wDataSize > sizeof(m_cbBuffer)) return false;
|
|||
|
|
|
|||
|
|
// //<2F><>ѯ<EFBFBD>ӿ<EFBFBD>
|
|||
|
|
// IAsynchronismEngineSink * pIAsynchronismEngineSink = QUERY_ME_INTERFACE(IAsynchronismEngineSink);
|
|||
|
|
// ASSERT(pIAsynchronismEngineSink != NULL);
|
|||
|
|
// if (pIAsynchronismEngineSink == NULL) return false;
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
CWHDataLocker lcok(m_CriticalSection); // CWHDataLockerHandle ThreadLockHandle(&m_ThreadLock);
|
|||
|
|
if (m_DataStorage.InsertData(wIdentifier, pData, wDataSize) == false) return false;
|
|||
|
|
|
|||
|
|
//Ͷ<><CDB6><EFBFBD><EFBFBD>Ϣ
|
|||
|
|
PostMessage(m_ControlWnd.m_hWnd, WM_ASYN_REQUEST, (WPARAM)pData, /*(LPARAM)pIAsynchronismEngineSink*/0);
|
|||
|
|
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//Ͷ<><CDB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
bool CAsynchronismEngine::PostAsynchronismData( WORD wIdentifier, tagDataBuffer DataBuffer[], WORD wDataCount )
|
|||
|
|
{
|
|||
|
|
ASSERT(TRUE);ASSERT(FALSE);
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//ȡ<><C8A1>ע<EFBFBD><D7A2>
|
|||
|
|
bool CAsynchronismEngine::UnRegisterAsynchronismEngineSink(IUnknownEx * pIUnknownEx)
|
|||
|
|
{
|
|||
|
|
//<2F><>ȡ<EFBFBD>ӿ<EFBFBD>
|
|||
|
|
IAsynchronismEngineSink * pIAsynchronismEngineSink = QUERY_OBJECT_PTR_INTERFACE(pIUnknownEx, IAsynchronismEngineSink);
|
|||
|
|
ASSERT(pIAsynchronismEngineSink != NULL);
|
|||
|
|
if (pIAsynchronismEngineSink == NULL) return false;
|
|||
|
|
|
|||
|
|
//ɾ<><C9BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
IAsynchronismEngineSink * pIAsynchronismEngineSinkTemp = NULL;
|
|||
|
|
for (INT_PTR i = 0; i < m_AsynchronismEngineSinkArray.GetCount(); i++)
|
|||
|
|
{
|
|||
|
|
pIAsynchronismEngineSinkTemp = m_AsynchronismEngineSinkArray[i];
|
|||
|
|
ASSERT(pIAsynchronismEngineSinkTemp != NULL);
|
|||
|
|
if (pIAsynchronismEngineSinkTemp == pIAsynchronismEngineSink)
|
|||
|
|
{
|
|||
|
|
m_AsynchronismEngineSinkArray.RemoveAt(i);
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F>߳<EFBFBD><DFB3><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
bool CAsynchronismEngine::OnMessageThreadStart()
|
|||
|
|
{
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
if (m_ControlWnd.m_hWnd == NULL)
|
|||
|
|
m_ControlWnd.Create(NULL, NULL, WS_CHILD, CRect(0, 0, 0, 0), CWnd::GetDesktopWindow(), 10);
|
|||
|
|
|
|||
|
|
//<2F>¼<EFBFBD>֪ͨ
|
|||
|
|
bool bSuccsee = true;
|
|||
|
|
IAsynchronismEngineSink * pIAsynchronismEngineSink = NULL;
|
|||
|
|
for (INT_PTR i = 0; i < m_AsynchronismEngineSinkArray.GetCount(); i++)
|
|||
|
|
{
|
|||
|
|
pIAsynchronismEngineSink = m_AsynchronismEngineSinkArray[i];
|
|||
|
|
ASSERT(pIAsynchronismEngineSink != NULL);
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
if (!pIAsynchronismEngineSink->OnAsynchronismEngineStart())
|
|||
|
|
{
|
|||
|
|
bSuccsee = false;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
catch (...)
|
|||
|
|
{
|
|||
|
|
bSuccsee = false;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return bSuccsee;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F>߳<EFBFBD>ֹͣ
|
|||
|
|
bool CAsynchronismEngine::OnMessageThreadStop()
|
|||
|
|
{
|
|||
|
|
//<2F>رմ<D8B1><D5B4><EFBFBD>
|
|||
|
|
m_ControlWnd.DestroyWindow();
|
|||
|
|
|
|||
|
|
//<2F>¼<EFBFBD>֪ͨ
|
|||
|
|
bool bSuccsee = true;
|
|||
|
|
IAsynchronismEngineSink * pIAsynchronismEngineSink = NULL;
|
|||
|
|
for (INT_PTR i = 0; i < m_AsynchronismEngineSinkArray.GetCount(); i++)
|
|||
|
|
{
|
|||
|
|
pIAsynchronismEngineSink = m_AsynchronismEngineSinkArray[i];
|
|||
|
|
ASSERT(pIAsynchronismEngineSink != NULL);
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
if (!pIAsynchronismEngineSink->OnAsynchronismEngineConclude())
|
|||
|
|
{
|
|||
|
|
bSuccsee = false;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
catch (...)
|
|||
|
|
{
|
|||
|
|
bSuccsee = false;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return bSuccsee;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F>첽<EFBFBD><ECB2BD><EFBFBD><EFBFBD>
|
|||
|
|
void CAsynchronismEngine::OnAsynchronismRequest(WORD wRequestID, IAsynchronismEngineSink * pIAsynchronismEngineSink)
|
|||
|
|
{
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Դ
|
|||
|
|
CWHDataLocker lcok(m_CriticalSection);
|
|||
|
|
|
|||
|
|
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
|
|||
|
|
tagDataHead DataHead;
|
|||
|
|
if (m_DataStorage.DistillData(DataHead, m_cbBuffer, sizeof(m_cbBuffer)))
|
|||
|
|
{
|
|||
|
|
//<2F><>Ϣ<EFBFBD><CFA2><EFBFBD><EFBFBD>
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
ASSERT(DataHead.wIdentifier == wRequestID);
|
|||
|
|
pIAsynchronismEngineSink->OnAsynchronismEngineData(wRequestID, m_cbBuffer, DataHead.wDataSize);
|
|||
|
|
}
|
|||
|
|
catch (...)
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//////////////////////////////////////////////////////////////////////////
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
extern "C" __declspec(dllexport) void * CreateAsynchronismEngine(const GUID & Guid, DWORD dwInterfaceVer)
|
|||
|
|
{
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
CAsynchronismEngine * pAsynchronismEngine = NULL;
|
|||
|
|
try
|
|||
|
|
{
|
|||
|
|
pAsynchronismEngine = new CAsynchronismEngine();
|
|||
|
|
if (pAsynchronismEngine == NULL) throw TEXT("<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><EFBFBD>");
|
|||
|
|
void * pObject = pAsynchronismEngine->QueryInterface(Guid, dwInterfaceVer);
|
|||
|
|
if (pObject == NULL) throw TEXT("<EFBFBD>ӿڲ<EFBFBD>ѯʧ<EFBFBD><EFBFBD>");
|
|||
|
|
return pObject;
|
|||
|
|
}
|
|||
|
|
catch (...) {}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
SafeDelete(pAsynchronismEngine);
|
|||
|
|
return NULL;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//////////////////////////////////////////////////////////////////////////
|