MFC 程序的延时操作

来源:互联网 发布:mac 怎么恢复safari 编辑:程序博客网 时间:2024/04/29 04:24
具体实现的目标:
1、延迟要执行的操作
2、下次延时操作到来时,判断上一次的延时操作是否已经完成,
     A:如果上一次操作还没开始做,结束上一次延时,本次延时开始;
     B:如果上一次操作正在执行中,执行完上一次操作,本次延时开始;
     C:如果已经完成,执行本次延时
     最近做了个项目,在项目中,我用了CEdit的EN_KILLFOCUS来执行一次改变图形状态的操作,但是,这样需要CEdit控件在推动焦点后去执行动作,老板的需要确是用户做完后就得执行,这样的话,就得用EN_CHANGE事件来做这次的事了,但是如果用EN_CHANGE,新的问题又来了,这样执行的操作太过频繁,会影响效率和用户体验!所以要做到用户正直输入完成后才去执行这个动作才是最好的!于是我就想到了给程序做延时操作,以前一直用MFC的SetTimer来做,但是SetTimer个人觉得还是不方便
下面开始贴代码:
1、SetTimer形式实现延时操作:
//定义Timer事件
#define TM_MSG 10000
//执行延时操作的地方
void XXXX::DoningSomething()
{
     KillTimer(TM_MSG);
     SetTimer(TM_MSG,1000,NULL);
}
void CXScrollBar::OnTimer(UINT nIDEvent)
//=============================================================================
{
     if(TM_MSG == nIDEvent)
{
//具体实现
}
}
2、新方法,自己用线程实现了一个Timer
//加入头文件
#include "MoTimer/MoTimer.h"
//在类中定义成员变量
CMoTimer     m_mtChangeChartInfo;

//初始化
,m_mtChangeChartInfo(true)//构造函数,true是只执行一次,false是无限次循环执行

m_mtChangeChartInfo.registerHandler(TimerChangeChartInfohProc, this);//转要执行的函数和该函数的参数
m_mtChangeChartInfo.setInterval(1000);//延时时间
//在要进行延时操作的地方做延时
m_mtChangeChartInfo.Cancel();
m_mtChangeChartInfo.Start();
//具体的实现函数格式
typedef void(CALLBACK *Timerfunc)(void* p);
typedef Timerfunc TimerHandler;

附上下载地址:http://download.csdn.net/detail/blackoto/4806122
原创粉丝点击