秘密在此:
GetQueuedCompletionStatus(m_hCompletionPort,&dwThancferred,(PULONG_PTR)&pQueueService,&pOverLapped,INFINITE)
m_hCompletionPort是通过线程参数传递进来的,dwThancferred和pQueueService是在之前CQueueService::AddToQueue()中Post过来的参数,,, // 加入数据
bool __cdecl CQueueService::AddToQueue(WORD wIdentifier, void * const pBuffer, WORD wDataSize)
{
CThreadLockHandle LockHandle(&m_ThreadLock);
m_DataStorage.AddData(wIdentifier,pBuffer,wDataSize);
PostQueuedCompletionStatus(m_hCompletionPort,wDataSize,(ULONG_PTR)this,NULL);
return true;
}
数据经过完成端口在CQueueServiceThread绕一圈以后会回到CQueueService::OnQueueServiceThread() // 数据消息
void CQueueService::OnQueueServiceThread( const tagDataHead & DataHead, void * pBuffer, WORD wDataSize)
{
ASSERT(m_pIQueueServiceSink!=NULL);
try
{
m_pIQueueServiceSink->OnQueueServiceSink(DataHead.wIdentifier,pBuffer,DataHead.wDataSize,DataHead.dwInsertTime);
}
catch () {}
return;
}
这样队列服务就完成了他的使命,将执行的消息,异步的交给指定接口去处理,,, 稍后将对列队列服务做个宏观上的的分析,,,下班时间到,,,回去继续,,, 用一句话来描述QueueService模块就是: 将队列的插入和处理通过关联到完成端口上以实现在IOCP线程池管理下异步处理; Add以后投递完成消息,在完成端口上监听的线程受到消息以后读取数据并处理; |