15,472
社区成员
发帖
与我相关
我的任务
分享
BOOL CMsgQueue::StopRevMsgThread(void)
{
if(m_hRevMsgThread)
{
//m_bThreadExit = TRUE;
CMsgQueue cMsgQueue(L"MsgQueueTest",1024,WriteMode);
// 往消息队列写数据
cMsgQueue.Write("__EXIT__",9);
cMsgQueue.Close();
// 等待线程成功退出
WaitForSingleObject(m_hRevMsgThread,INFINITE);
CloseHandle(m_hRevMsgThread);
m_hRevMsgThread = NULL;
m_hRevMsgThread = FALSE;
lpBuffer?free(lpBuffer),lpBuffer=0:0;
}
return ((m_hRevMsgThread==NULL) ? TRUE : FALSE);
}
DWORD WINAPI CMsgQueue::RevMsgThread(LPVOID pParam)
{
CMsgQueue *pMsgQueue=(CMsgQueue*)pParam;
DWORD dwReadNums=0;
while(!pMsgQueue->m_bThreadExit)
{
if(!pMsgQueue->m_hMsgQueue )
break;
// 从消息队列中读取一条消息(阻塞模式)
BOOL ret=pMsgQueue->Read(pMsgQueue->lpBuffer,pMsgQueue->m_dwQueueSize,&dwReadNums,INFINITE);
printf("Read ret=%d,dwReadNums=%d/n",ret,dwReadNums);
if(dwReadNums>0)
{
// 调用回调函数
if(strcmp("__EXIT__",(char*)pMsgQueue->lpBuffer)){
if(pMsgQueue->m_MsgCallBack)
pMsgQueue->m_MsgCallBack(pMsgQueue->lpBuffer,dwReadNums);
}else{
break;
}
}
}
printf("RevMsgThread exit...\r\n");
::ExitThread(0);
return 0;
}
#include <windows.h>
#include "EsMessage.h"
CMsgQueue::CMsgQueue()
{
m_hMsgQueue = NULL;
m_dwQueueSize = 0;
m_hRevMsgThread = NULL;
m_bThreadExit = FALSE;
m_MsgCallBack = NULL;
}
CMsgQueue::CMsgQueue(LPCWSTR lpQueueName,DWORD dwSize,ACCESSMODE accessMode)
{
m_hMsgQueue = NULL;
m_dwQueueSize = 0;
m_hRevMsgThread = NULL;
m_bThreadExit = FALSE;
m_MsgCallBack = NULL;
Create(lpQueueName,dwSize,accessMode);
}
CMsgQueue::~CMsgQueue()
{
Close();
}
BOOL CMsgQueue::Create(LPCWSTR lpQueueName,DWORD dwSize,ACCESSMODE accessMode)
{
if(!m_hMsgQueue)
{
m_hRevMsgThread = NULL;
m_bThreadExit = FALSE;
m_MsgCallBack = NULL;
m_dwQueueSize = dwSize;
// 创建消息队列
MSGQUEUEOPTIONS options;
options.dwSize = sizeof(options);
options.dwFlags = MSGQUEUE_NOPRECOMMIT|MSGQUEUE_ALLOW_BROKEN;
options.dwMaxMessages = 0;
options.cbMaxMessage = dwSize;
options.bReadAccess = (accessMode==ReadMode) ? TRUE : FALSE;
m_hMsgQueue =::CreateMsgQueue(lpQueueName,&options);
}
return TRUE;
}
void CMsgQueue::Close(void)
{
// 注销回调函数
SetMsgCallBack(NULL,NULL);
if(m_hMsgQueue)
{
::CloseMsgQueue(m_hMsgQueue);
m_hMsgQueue = NULL;
}
}
BOOL CMsgQueue::Read(LPVOID lpBuffer,DWORD dwSize,LPDWORD lpNumberOfBytesRead,DWORD dwTimeout)
{
if(m_hMsgQueue == NULL || lpBuffer == NULL)
{
return FALSE;
}
DWORD dwFlag = 0;
// 从消息队列头部读出数据
if(!::ReadMsgQueue(m_hMsgQueue,lpBuffer,dwSize,lpNumberOfBytesRead,dwTimeout,&dwFlag))
{
return FALSE;
}
return TRUE;
}
BOOL CMsgQueue::Write(LPVOID lpBuffer,DWORD dwSize)
{
if(m_hMsgQueue == NULL || lpBuffer == NULL)
{
return FALSE;
}
// 向消息队列尾部写入数据
if(!::WriteMsgQueue(m_hMsgQueue,lpBuffer,dwSize,0,0))
{
return FALSE;
}
return TRUE;
}
BOOL CMsgQueue::SetMsgCallBack(MsgQueueCallBack pCallBackFun, PVOID pParam)
{
m_MsgCallBack = pCallBackFun;
if (m_MsgCallBack)
{
if (m_hRevMsgThread == NULL)
{
// 开启读取线程
return StartRevMsgThread();
}
}
else
{
if (m_hRevMsgThread)
{
// 关闭读取线程
return StopRevMsgThread();
}
}
return TRUE;
}
BOOL CMsgQueue::StartRevMsgThread(void)
{
if(m_hRevMsgThread == NULL)
{
// 创建读取消息线程
lpBuffer=(LPVOID)malloc(m_dwQueueSize);
m_hRevMsgThread=CreateThread(NULL, 0,CMsgQueue::RevMsgThread, this, 0, NULL);
}
return (m_hRevMsgThread ? TRUE : FALSE);
}
BOOL CMsgQueue::StopRevMsgThread(void)
{
if(m_hRevMsgThread)
{
//m_bThreadExit = TRUE;
CMsgQueue cMsgQueue(L"MsgQueueTest",1024,WriteMode);
// 往消息队列写数据
cMsgQueue.Write("__EXIT__",9);
cMsgQueue.Close();
// 等待线程成功退出
WaitForSingleObject(m_hRevMsgThread,INFINITE);
CloseHandle(m_hRevMsgThread);
m_hRevMsgThread = NULL;
lpBuffer?free(lpBuffer),lpBuffer=0:0;
}
return ((m_hRevMsgThread==NULL) ? TRUE : FALSE);
}
DWORD WINAPI CMsgQueue::RevMsgThread(LPVOID pParam)
{
CMsgQueue *pMsgQueue=(CMsgQueue*)pParam;
DWORD dwReadNums=0;
while(!pMsgQueue->m_bThreadExit)
{
if(!pMsgQueue->m_hMsgQueue )
break;
// 从消息队列中读取一条消息(阻塞模式)
BOOL ret=pMsgQueue->Read(pMsgQueue->lpBuffer,pMsgQueue->m_dwQueueSize,&dwReadNums,INFINITE);
printf("Read ret=%d,dwReadNums=%d/n",ret,dwReadNums);
if(dwReadNums>0)
{
// 调用回调函数
if(strcmp("__EXIT__",(char*)pMsgQueue->lpBuffer)){
if(pMsgQueue->m_MsgCallBack)
pMsgQueue->m_MsgCallBack(pMsgQueue->lpBuffer,dwReadNums);
}else{
break;
}
}
}
printf("RevMsgThread exit...\r\n");
return 0;
}