界面UI和客户端交互用的是windows消息机制,PostMessage();是异步的,操作之后就会返回结果,客户端与数据库链接是长连接,异步的,根据报文多少设置心跳包时间长短。为了让一个操作能连贯,在中间加一个时间保护机制。当UI传消息给客户端时,交互结束,增加一个时间保护,等到数据库传输结束。
注意要针对异常操作加时间保护释放。
代码片段
void CDB::StartProtect(bool bEnableMsgPump, unsigned int nTimeLimit)
{
if (s_bEnableMsgPump || s_nTimeLimit)
throw soci::soci_error("server is busy", soci::soci_error::DBE_CMD_BUSY);
ResetProtect(bEnableMsgPump, nTimeLimit);
}
void CDB::ResetProtect(bool bEnableMsgPump, unsigned int nTimeLimit)
{
s_bEnableMsgPump = bEnableMsgPump;
s_nTimeLimit = nTimeLimit;
if (s_nTimeLimit)
m_Session.timelimit(s_nTimeLimit);
if (s_bEnableMsgPump)
m_Session.msg_pump(true);
}
//
void CDB::EndProtect()
{
if (s_nTimeLimit)
m_Session.timelimit(0);
if (s_bEnableMsgPump)
m_Session.msg_pump(false);
s_bEnableMsgPump = false;
s_nTimeLimit = 0;
}