HPR库实现心跳线程

1.定义成员变量m_quit_event事件并赋初值。//用来结束心跳线程
2.创建心跳线程,并定义成员变量m_handle保存心跳线程句柄。//用来判断心跳线程是否结束
3.定义结束心跳线程的函数

 

1.创建一个事件,用于结束线程。
if (HPR_INVALID_HANDLE == m_quit_event)
{
    m_quit_event = HPR_CreateEvent(HPR_FALSE);//事件用来结束心跳线程
}
2.创建心跳线程,并保存线程句柄(用于检测心跳线程是否关闭)
m_handle = ::CreateThread(NULL, 0, ThreadProc, this, 0 , NULL);
3.心跳线程函数
DWORD WINAPI ThreadProc (PVOID pParam)//参数为2中的this指针
{
    //判断pParam是否为空,为空直接返回-1
    //强制类型转换pParam为存放1中事件变量的类
    
    //开始while循环,下面开始while循环实现
    //设置等待时间,等待m_quit_event事件是否发生,发生的话结束心跳线程,没有的话继续执行心跳线程
    //拼接心跳报文,发送给接收心跳方并获取返回值,如果返回值错误则结束心跳线程
    //解析返回值,解析成功进行下一次while循环,如果解析失败则结束心跳线程
}
4.结束心跳线程的函数
void CMainPanel::HandleStopHeartBeatThread(),以下为执行步骤:
1)判断结束心跳事件是否为空,不为空表示已经创建了事件,那么启动事件结束心跳线程;为空表示事件未被创建,不启动事件,继续执行2)中代码
2)判断心跳线程句柄是否为空,
①不为空表示创建了心跳线程,使用WaitForSingleObject设置一段时间等待心跳线程结束,如果这段时间内心跳线程句柄被触发,那么心跳线程结束了,继续执行3)中代码;如果这段时间内心跳线程句柄没有被触发,那么说明心跳线程还没有结束,则打印错误信息并继续执行3)中代码;
②为空表示没有创建心跳线程或心跳线程创建失败,那么继续执行3)中代码;
3)判断结束心跳事件是否为空,不为空表示已经创建了事件,那么关闭结束心跳事件;为空表示事件未被创建,直接return。

 

/*******************************************************************/
代码:

心跳线程:
DWORD WINAPI ThreadProc (PVOID pParam)
{
    if(NULL == pParam)
    {
        return -1;
    }
    CMainPanel* pHomePage = (CMainPanel*)pParam;
    while(TRUE)
    {
        HPR_UINT32 local_num_wait = HPR_WaitForSingleObject(pHomePage->m_quit_event, 30*1000);
        if (HPR_WAIT_OBJECT_0 == local_num_wait)
        {
            LOG_INFO("心跳连接线程退出.");
            break;
        }
        std::string strRequest = CBuildLpcUri::BuildHeartBeatUri(theApp.GetLoginRes().strSession);
        std::string strResponse;
        bool bRet = g_clientComm.SendMsgWithResponse(strRequest, strResponse);
        if(!bRet || strResponse.empty())
        {
            ::PostMessage(pHomePage->GetParent(),WM_IPC_COMMU_ERROR,0,0);
            LOG_ERROR("心跳连接失败");
            break;
        }
        CJsonParse json;
        if (!json.ParseNormalResponse(strResponse))
        {
            ::PostMessage(pHomePage->GetParent(),WM_IPC_COMMU_ERROR,0,0);
            LOG_ERROR("心跳连接失败 rsp:[%s]", strResponse.c_str());
            break;
        }
        LOG_DEBUG("心跳连接成功");
    }
    return 0;
}

结束心跳线程的函数:
void CMainPanel::HandleStopHeartBeatThread()
{
    if (HPR_INVALID_HANDLE != m_quit_event)
    {
        HPR_SetEvent(m_quit_event);
    }
    if(NULL != m_handle)
    {
        DWORD dw = WaitForSingleObject(m_handle, 10000);
        if(WAIT_OBJECT_0 != dw)
        {
            LOG_ERROR("WaitForSingleObject 10000ms error[%d], lasterror=[%u]",dw, GetLastError());
        }
    }

    if (HPR_INVALID_HANDLE != m_quit_event)
    {
        HPR_CloseEvent(m_quit_event);
    }
    return;
}

你可能感兴趣的:(C++)