实现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 ...
随机推荐
- NYOJ2 括号配对问题
括号配对问题 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 现在,有一行括号序列,请你检查这行括号是否配对. 输入 第一行输入一个数N(0<N<=1 ...
- kfk: async disk IO深度解析
http://www.itpub.net/thread-1724044-1-1.html
- 假设写一段代码引导PC开机这段代码是 ? Here is a tiny "OS" :-D
Hello world -- OS 我找到了华科绍志远博士的相关代码,发现他依据MIT的JOS的boot.S 稍作改动.然后单独剥离出来,能够非常好玩~ 资料下载地址: http://download ...
- Qt学习之QListWidget删除Item
将QListWidgetItem从QListWidget列表中删除有两种方法能够做到.但也要依据自己的须要进行选择. 第一种是 QListWidgetItem *takeItem(int row); ...
- View载入具体解释
文章一開始我要对前面一篇文章做点补充 相信大家都知道View有两个方法. public boolean post(Runnable action) public boolean postDelayed ...
- 我所不知的 javascript Object 的一些现象
1.我们都知道对象访问属性有两种方法,一种是使用 . 操作符,使用它添加的属性名必须满足标识符的命名规范:另一种是使用 [] 键访问的方法,可以接受任意UTF-8/Unicode字符串作为属性名,在E ...
- 1245 最小的N个和(前k小ai+bi)
1245 最小的N个和 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Description 有两个长度为 N ...
- java反射中getDeclaredMethods和getMethods的区别
getDeclaredMethods() 返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的类或接口声明的所有方法,包括公共.保护.默认(包)访问和私有方法, ...
- Android之仿今日头条顶部导航栏效果
随着时间的推移现在的软件要求显示的内容越来越多,所以要在小的屏幕上能够更好的显示更多的内容,首先我们会想到底部菜单栏,但是有时候像今日头条新闻客户端要显示的内容太多,而且又想在主界面全部显示出来,所以 ...
- bzoj 2069 [ POI 2004 ] ZAW —— 多起点最短路 + 二进制划分
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2069 首先,对于和 1 相连的点,一定是从某个点出发,回到另一个点: 所以需要枚举起点和终点 ...