return0;
}
}
}
return1;
}
2.3模块三
#ifndefPROCESS_CONSUMER_H
#definePROCESS_CONSUMER_H
#include"Global_Define.h"
#include"Message_Queue.h"
#include"IM_Message_Block.h"
#include"Account_DB_Access.h"
#include"User_Manager.h"
externMessage_Queueg_rcv_msg_queue;
externMessage_Queueg_send_msg_queue;
externAccount_DB_Accessg_account_db;
externUser_Managerg_user_manager;
classProcess_Consumer
{
public:
Process_Consumer(intprocess_num);
~Process_Consumer(void);
public:
boolstart();//开始线程
boolstop();//停止线程
voidstatus();//线程状态
private:
staticunsignedintserver(void*pParam);//线程函数,要求多线程安全
staticvoidhandle_msg(IM_Message_Block*blk);//消息处理函数,要求多线程安全
staticinthandle_blk_account_register(IM_Message_Block*blk);//处理注册消息
//处理更新信息消息
staticinthandle_blk_account_set_info(IM_Message_Block*blk);
staticinthandle_blk_session_login(IM_Message_Block*blk);//处理登录消息
//处理改变状态消息
staticinthandle_blk_session_change_status(IM_Message_Block*blk);
staticinthandle_blk_session_hearbeat(IM_Message_Block*blk);//处理心跳消息
staticinthandle_blk_session_logout(IM_Message_Block*blk);//处理登出消息
//处理查找在线用户消息
staticinthandle_blk_contact_search(IM_Message_Block*blk);
staticinthandle_blk_contact_add(IM_Message_Block*blk);//处理新增好友消息
staticinthandle_blk_contact_del(IM_Message_Block*blk);//处理删除好友消息
//处理获取好友列表消息
staticinthandle_blk_contact_get_list(IM_Message_Block*blk);
//处理获取好友在线信息消息
staticinthandle_blk_get_online_info(IM_Message_Block*blk);
staticinthandle_blk_schat_msg(IM_Message_Block*blk);//处理聊天消息
staticunsignedintcreate_blk_seq();//生成消息号
staticunsignedintcreate_uid();//生成用户id
private:
int_process_consumer_num;//处理线程数量
staticint_blk_consumer;//处理的消息条数
staticunsignedint_seq_count;//消息号计数器
staticunsignedint_uid_count;//用户id计数器
staticunsignedint_uid_base;//记录每次服务器启动时数据库中最大的uid
staticAccount_DB*_account_db;//数据库操作对象
staticUser_Manager*_user_manager;//在线用户管理对象
//接收消息队列
staticMessage_Queue*_rcv_msg_queue;
//发送消息队列
staticMessage_Queue*_send_msg_queue;
staticCCriticalSection_lock;//同步全局对象的操作
};
#endif//PROCESS_CONSUMER_H
#include
#include
#include"Process_Consumer.h"
//初始化接收消息队列
Message_Queue*Process_Consumer:
:
_rcv_msg_queue=&g_rcv_msg_queue;
//初始化发送消息队列
Message_Queue*Process_Consumer:
:
_send_msg_queue=&g_send_msg_queue;
intProcess_Consumer:
:
_blk_consumer=0;//处理线程数量
unsignedintProcess_Consumer:
:
_seq_count=0;//消息号计数器
unsignedintProcess_Consumer:
:
_uid_count=0;//用户id计数器
unsignedintProcess_Consumer:
:
_uid_base=0;
Account_DB*Process_Consumer:
:
_account_db=&g_account_db;//数据库操作对象
User_Manager*Process_Consumer:
:
_user_manager=&g_user_manager;//在线用户管理对象
CCriticalSectionProcess_Consumer:
:
_lock;
Process_Consumer:
:
Process_Consumer(intprocess_num)
:
_process_consumer_num(process_num)
{
}
Process_Consumer:
:
~Process_Consumer(void)
{
}
boolProcess_Consumer:
:
start()//开始线程
{
for(inti=0;i<_process_consumer_num;i++)
AfxBeginThread(Process_Consumer:
:
server,NULL);
returntrue;
}
boolProcess_Consumer:
:
stop()//停止线程
{
returntrue;
}
voidProcess_Consumer:
:
status()//线程状态
{
cout<<"消息处理线程当前状态:
"<cout<<"已经处理的消息条数:
"<<_blk_consumer<cout<<"等候处理的消息条数:
"<<_rcv_msg_queue->get_size()<cout<<"等候发送的消息条数:
"<<_send_msg_queue->get_size()<}
unsignedintProcess_Consumer:
:
server(void*pParam)//线程函数,要求多线程安全
{
IM_Message_Block*blk=NULL;
for(;;)
{
blk=(IM_Message_Block*)_rcv_msg_queue->get_msg();
if(!
blk)
{
cout<<"消息处理线程退出:
从消息队列获取到退出消息。
"<//将这条空消息又放回去,因为有可能会有多个处理消息线程,这样才能
//保证其它处理消息线程也能退出
_rcv_msg_queue->push_msg(blk);
break;
}
if(blk->length_{
deleteblk;
continue;
}
handle_msg(blk);
_blk_consumer++;
}
return1;
}
voidProcess_Consumer:
:
handle_msg(IM_Message_Block*blk)//消息处理函数,要求多线程安全
{
//根据协议处理各种消息
IM_Header*header=blk->get_header();
unsignedshortcmd=ntohs(header->cmd);
switch(cmd)
{
caseIM_ACCOUNT_REGISTER:
{
handle_blk_account_register(blk);
break;
}
caseIM_ACCOUNT_SET_INFO:
{
handle_blk_account_set_info(blk);
break;
}
caseIM_SESSION_LOGIN:
{
handle_blk_session_login(blk);
break;
}
caseIM_SESSION_STATUS_CHANGE:
{
handle_blk_session_change_status(blk);
break;
}
caseIM_SESSION_HEARTBEAT:
{
handle_blk_session_hearbeat(blk);
break;
}
caseIM_SESSION_LOGOUT:
{
handle_blk_session_logout(blk);
break;
}
caseIM_CONTACT_SEARCH:
{
handle_blk_contact_search(blk);
break;
}
c