实现PC延迟执行函数
头文件内容:
#pragma once typedef function<void ()> DelayClickHandler;
typedef void (*pDelayFun)(); class DelayData
{
public:
DelayData(){}
//cskey主要是为了避免重复调用,如果cskey空,则不考虑,如果不为空,相同cskey如果之前的没有执行到,会remove之前的,然后加入当前的这个函数
DelayData(pDelayFun pFun,DWORD dwDelayTick,CString csKey="")
{
dwStartTick = GetTickCount();
this->pFun = pFun;
this->dwDelayTick = dwDelayTick;
this->csKey = csKey;
}
DelayData(DelayClickHandler FunHandler,DWORD dwDelayTick,CString csKey="")
{
dwStartTick = GetTickCount();
this->dwDelayTick = dwDelayTick;
this->FunHandler = FunHandler;
this->csKey = csKey;
pFun = NULL;
}
DWORD dwStartTick; //记录当时时间
DWORD dwDelayTick; //延迟时间
CString csKey; //表示特征值
pDelayFun pFun; //需要执行的函数,必须是静态函数
DelayClickHandler FunHandler; //需要执行的函数
}; class CDelayHandler:public CWnd
{
public:
static CDelayHandler* GetInstance();
~CDelayHandler(void);
//只能在主线程执行,现在精度是500ms,pDelayFun需要是类的静态函数或者全局函数,没有参数
static void PostDelay(pDelayFun pFun,DWORD dwDelayTime,CString csKey="");
//只能在主线程执行,现在精度是500ms,FunHandler需要是类的函数,可以带参数,具体可以看CHoverButton中的handler使用方法
void PostDelay(DelayClickHandler FunHandler,DWORD dwDelayTime,CString csKey="");
DECLARE_MESSAGE_MAP()
protected:
CDelayHandler(void);
afx_msg void OnTimer(UINT nIDEvent);
void DoDelayHandler();
void AddDelayData(DelayData dd);
private:
vector<DelayData> m_HandlerVec;
set<CString> m_HandlerKey; //避免重复加入同一个延迟函数
};
cpp文件:
#include "stdafx.h"
#include "DelayHandler.h"
#define DW_TIMERID 1001 //外部接口******************************************************************************************
//只能在主线程执行,现在精度是500ms,pDelayFun需要是类的静态函数或者全局函数,没有参数
void CDelayHandler::PostDelay(pDelayFun pFun,DWORD dwDelayTime,CString csKey)
{
CDelayHandler::GetInstance()->AddDelayData(DelayData (pFun,dwDelayTime,csKey));
} void CDelayHandler::PostDelay(DelayClickHandler FunHandler,DWORD dwDelayTime,CString csKey)
{
CDelayHandler::GetInstance()->AddDelayData(DelayData (FunHandler,dwDelayTime,csKey));
} //内部实现***************************************************************************************
BEGIN_MESSAGE_MAP(CDelayHandler, CWnd)
ON_WM_TIMER()
END_MESSAGE_MAP() CDelayHandler* CDelayHandler::GetInstance()
{
static CDelayHandler _Instance;
return &_Instance;
} CDelayHandler::CDelayHandler(void)
{
} CDelayHandler::~CDelayHandler(void)
{
} void CDelayHandler::AddDelayData(DelayData dd)
{
if(NULL == GetSafeHwnd())
{
HCURSOR hCursor = AfxGetApp()->LoadCursor(IDC_ARROW);
LPCTSTR className = AfxRegisterWndClass(CS_DBLCLKS, hCursor);
CreateEx(WS_EX_TOPMOST|WS_EX_TOOLWINDOW, className, NULL, WS_POPUP,
, , , ,
::GetDesktopWindow(), NULL);
ShowWindow(SW_HIDE);
}
if( == m_HandlerVec.size())
SetTimer(DW_TIMERID,,NULL); if(dd.csKey.IsEmpty())
{
m_HandlerVec.push_back(dd);
}
else if(m_HandlerKey.find(dd.csKey)==m_HandlerKey.end())
{
m_HandlerKey.insert(dd.csKey);
m_HandlerVec.push_back(dd);
}
else if(m_HandlerKey.find(dd.csKey)!=m_HandlerKey.end())
{
vector<DelayData>::iterator it = m_HandlerVec.begin();
for(;it!=m_HandlerVec.end();it++)
{
if(dd.csKey == (it->csKey))
{
m_HandlerVec.erase(it);
break;
}
}
m_HandlerVec.push_back(dd);
}
} void CDelayHandler::OnTimer(UINT nIDEvent)
{
if(nIDEvent == DW_TIMERID)
{ DoDelayHandler();
if(==m_HandlerVec.size())
{
KillTimer(DW_TIMERID);
}
}
CWnd::OnTimer(nIDEvent);
} void CDelayHandler::DoDelayHandler()
{
for(int i=;i<m_HandlerVec.size();)
{
DelayData &dd = m_HandlerVec[i];
DWORD curTime = GetTickCount();
if(curTime >= dd.dwStartTick+dd.dwDelayTick)
{
if(dd.pFun)
dd.pFun();
else
dd.FunHandler();
if(!dd.csKey.IsEmpty() && m_HandlerKey.find(dd.csKey)!=m_HandlerKey.end())
{
m_HandlerKey.erase(m_HandlerKey.find(dd.csKey));
}
m_HandlerVec.erase(m_HandlerVec.begin()+i);
continue;
}
++i;
}
}
具体使用:
class A
{
static void DoStaticFun(){}
void DoFun(int n){}
}; //调用1
CDelayHandler::PostDelay(A::DoStaticFun,*);
//调用2
A a;
CDelayHandler::GetInstance()->PostDelay(bind(&A::DoFun,&a,),*1000,_T("DoFun"));
注:可能需要其他库
实现PC延迟执行函数的更多相关文章
- IOS 关于取消延迟执行函数的种种。performSelector与cancelPreviousPerformRequestsWithTarget
本文非本人撰写 @interface NSObject (NSDelayedPerforming) - (void)performSelector:(SEL)aSelector withObj ...
- js自定义延迟执行函数
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...
- js中的延迟执行和定时执行
在js中,延迟执行函数有两种,setTimeout和setInterval,用法如下: function testFunction(){Console.log('hovertree.com');} s ...
- linux进程编程:子进程创建及执行函数简介
linux进程编程:子进程创建及执行函数简介 子进程创建及执行函数有三个: (1)fork();(2)exec();(3)system(); 下面分别做详细介绍.(1)fork() 函数定 ...
- Go defer延迟执行
defer用于延迟执行,可以类比于java或c++中的析构函数. 查看一段示例代码: func Contents(filename string) (string, error) { //打开文件 f ...
- 立即执行函数(IIFE)的理解与运用
作为JavaScript的常用语法,立即执行函数IIFE(Immediately-Invoked Function Expression)是值得我们认真去学习探究的. 一.创建函数的两种方式 我们先从 ...
- SQL Server游标+延迟执行简介
在项目测试中,我们可能会使用批量生成数据来测试程序的性能. 这里讲一个我遇到的问题,由于我们批量生成数据时基本上是瞬间完成,所以GETDATE()函数获得的时间基本上也是一样的,而我们又要求生成每条数 ...
- setTimeout中所执行函数中的this,永远指向window
注意是要延迟执行的函数中的this哦!! //片段一 setTimeout("alert(this)", 1); // [object Window] //片段二 var obj ...
- 每隔一秒自动执行函数(JavaScript)
http://www.cnblogs.com/xlx0210/archive/2010/03/19/1689497.html 1. setInterval() ——每隔一秒自动执行方法,setInte ...
随机推荐
- [luoguP2949] [USACO09OPEN]工作调度Work Scheduling(贪心 + 优先队列)
传送门 这个题类似于建筑抢修. 先按照时间排序. 如果当前时间小于任务截止时间就选, 否则,看看当前任务价值是否比已选的任务的最小价值大, 如果是,就替换. 可以用优先队列. ——代码 #includ ...
- HUD——1286 找新朋友
思路: 裸的欧拉函数 代码: #include<cstdio> #include<cstring> #include<cstdlib> #include<io ...
- 为什么Linux下的环境变量要用大写而不是小写
境变量的名称通常用大写字母来定义.实际上用小写字母来定义环境变量也不会报错,只是习惯上都是用大写字母来表示的. 首先说明一下,在Windows下是不区分大小写的,所以在Windows下怎么写都能获取到 ...
- [转]SQL Server编程:SMO介绍
转自:周公 最近在项目中用到了有关SQL Server管理任务方面的编程实现,有了一些自己的心得体会,想在此跟大家分享一下,在工作中用到了SMO/SQL CLR/SSIS等方面的知识,在国内这方面的文 ...
- Android实现一个自己定义相机的界面
我们先实现拍照button的圆形效果哈.Android开发中,当然能够找美工人员设计图片,然后直接拿进来.只是我们能够自己写代码实现这个效果哈.最经常使用的的是用layout-list实现图片的叠加, ...
- 模式匹配-BF算法
/***字符串匹配算法***/ #include<cstring> #include<iostream> using namespace std; #define OK 1 # ...
- 【OpenGL】Shader实例分析(九)- AngryBots中的主角受伤特效
转发请保持地址:http://blog.csdn.net/stalendp/article/details/40859441 AngryBots是Unity官方的一个非常棒的样例.非常有研究价值. 曾 ...
- 负margin使用注意的一个问题
在项目实力中经经常使用到负margin 如: <div id="test"> <ul> <li>子元素1</li> <li&g ...
- Codeforces Round #273 (Div. 2)C. Table Decorations 数学
C. Table Decorations You have r red, g green and b blue balloons. To decorate a single table for t ...
- CI框架下CSS和JS的路径问题
注意:CI框架下的CSS和JS的引用必须放在框架外面,比如,可建立resource文件夹与application同级,用来封装CSS和JS. 在view层用resource里面CSS和JS可采用以下几 ...