在一次项目过程中,当执行一个任务前,需要暂停一段时间,该时间可配置,在暂停的过程中,需要接收相关的命令,比如终止、暂停、继续命令。
如果用类似的库函数sleep并不能解决该问题,那么就需要用到while循环这样的暂停模式。无论是sleep还是while的方式程序都是阻塞的。实现方式如下所示。
time_t start_time, cur_time;
time(&start_time);
do
{
} while((cur_time - start_time) < CGDManager::GD_EXE_STEP_DELAY);
有了while循环,便可以在这个循环里处理消息,例子如下:
time_t start_time, cur_time;
time(&start_time);
do
{
CHAR* m_buf = (CHAR *)malloc(8);
struct gd_buf_head a ;
if( (m_sysinfo->receive_message(a,m_buf)>=0) )
{
if( a.reponse_type == GD_REPORT_FRONT)
{
GetBuffer gBuf;
gBuf.set_buf_byte_order(a.rhead.byte_order);
CHAR type ;
CHAR *ptr = m_buf;
ptr += sizeof(INT32);
ptr += sizeof(CHAR);
memcpy((CHAR*)&type, ptr, sizeof(CHAR));
ptr += sizeof(CHAR);
if( type == GD_STOP_CMD_TYPE)
{
m_bKill = TRUE ;
ReportProcess(a,m_buf);//处理消息函数
free(m_buf);
m_buf = NULL;
return -1;
}
if( type == GD_PAUSE_CMD_TYPE )
{
MakeReport(2,type,0,CK_RUSULT_OK);//发送确认报文
free(m_buf);
m_buf = NULL;
m_bPause = true ;
m_iExecTimeout = 0;
m_iResultTimeout = 0;
m_iCheckTimeout = 0;
m_iCkStatus = GD_STATUS_WAIT_CONTINUE;
m_iPauseTimeout = CGDManager::GD_DEMO_EXE_TIMEOUT;
return -1;
}
if( type == GD_CONTINUE_CMD_TYPE )
{
ReportProcess(a,m_buf);
free(m_buf);
m_buf = NULL;
return -1;
}
}
}
free(m_buf );
m_buf = NULL;
time(&cur_time);
} while((cur_time - start_time) < CGDManager::GD_EXE_STEP_DELAY);