在处理HTTP收发消息的时候,如果将收发消息都放在同一个线程里面,当收发消息的量非常大的时候就很有可能会出现阻塞。这么做显然是不合理的,所以我们需要将他们分开来,将收发的操作分别放到两个线程里,就可以避免收消息或者发消息的时候阻塞了。
下面来介绍一下创建线程的过程:
1、首先在头文件里添加线程函数
struct CameraItem
{
std::string strUrl;
std::string strXml;
std::string strFmt;
};
void HttpWorker();
bool m_bHttpFlag;
std::thread *m_pHttpWorker;
std::list<CameraItem> m_listItems;
std::mutex m_mutexItems;
int m_nSendCnt;
std::mutex m_mutexCnt;
2、开启线程
CTerror CHttp2CommModule::OnConnected()
{
m_bHttpFlag = true;
m_pHttpWorker = new std::thread(&CHttp2CommModule::HttpWorker, this);
if (!m_pHttpWorker) {
PrintConsole(LogLevel_Error, GOR_HTTP2COMM, "create HTTP worker fail.\n");
return CT_errorFAIL;
}
return CT_errorOK;
}
3、在关闭的时候删除线程:
CTerror CHttp2CommModule::Stop(void)
{
m_bHttpFlag = false;
if (!m_pHttpWorker) {
m_pHttpWorker->join();
delete m_pHttpWorker;
m_pHttpWorker = nullptr;
}
return TCTModule::Stop();
}
4、编写线程内容
void CHttp2CommModule::HttpWorker()
{
while (m_bHttpFlag) {
bool bEmpty = true;
CameraItem item;
{
std::lock_guard<std::mutex> lock(m_mutexItems);
if (!m_listItems.empty()) {
item = m_listItems.front();
m_listItems.pop_front();
bEmpty = false;
}
}
if (bEmpty) {
Sleep(100);
continue;
}
int cnt = 0;
int ret = SendHttpMessage(item.strUrl, item.strXml, item.strFmt);
{
std::lock_guard<std::mutex> lock(m_mutexCnt);
m_nSendCnt++;
cnt = m_nSendCnt;
}
PrintConsole(LogLevel_Info, GOR_HTTP2COMM, "FUNC[%s] send message, messageNum: %d, ret: %d \n", __FUNCTION__, cnt, ret);
PrintConsole(LogLevel_Info, GOR_HTTP2COMM, "FUNC[%s] send message : %s \n", __FUNCTION__, item.strXml.c_str());
}
}
5、将发消息的内容放到list里面httpwork线程就会发送出去了
CameraItem item;
item.strUrl = url;
item.strXml = strSendMsg;
item.strFmt = strContentType;
{
std::lock_guard<std::mutex> lock(m_mutexItems);
m_listItems.push_back(item);
}