Files
wnmj/Servers/服务器组件/内核引擎/AsynchronismEngine.cpp

371 lines
8.7 KiB
C++
Raw Normal View History

2026-02-13 14:34:15 +08:00
#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;
}
//////////////////////////////////////////////////////////////////////////