实现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 ...
随机推荐
- T5090 众数 codevs
http://codevs.cn/problem/5090/ 时间限制: 1 s 空间限制: 1000 KB 题目等级 : 青铜 Bronze 题目描述 Description 由文件给出N个1到 ...
- 16、Java并发性和多线程-死锁
以下内容转自http://ifeve.com/deadlock/: 死锁是两个或更多线程阻塞着等待其它处于死锁状态的线程所持有的锁.死锁通常发生在多个线程同时但以不同的顺序请求同一组锁的时候. 例如, ...
- Spring Tool Suite(STS)启动时出现错误:Java was started but returned exit code=13问题解决
Spring Tool Suite(STS)是开发Spring的套件,也就是一个Eclipse,在之上增加了对Spring框架的支持,使其能快速的开发Spring. 错误如下: 解决办法: 如果系统安 ...
- RAR5格式不同词典大小下压缩率的简单测试
一个VMWare虚拟机安装Win7后的磁盘文件进行压缩,已经进行了清理处理,原始大小为12.1GB 词典大小 压缩后大小 压缩比率 32MB 4.08GB 33.7% 256MB 3.88GB 3 ...
- 淘宝手机rem的如何使用
1.主要介绍几个移动端常用的单位rem.vw.vh,配合传统的px.百分比.<viewport>标签,兼容适配移动端的各种分辨率的手机端. rm : 这个单位是以父元素为标准来进行计算 , ...
- centos 7: 迁移MySQL目录
Steps: 1. systemctl stop mariadb 2. mkdir data destination folder, ex: /home/mysql 3. cp -R /var/lib ...
- Windows编程中char*转LPCWSTR解决的方法总结
Windows编程中常常涉及到的一个问题是字符串之间的转换,开发过程总是遇到编译器提示无法格式转换的问题.于是自己总结了几种解决的方法. 1.通过T2W转换宏 char* szStr = " ...
- linux下uart应用编程
目的:在用户空间通过读写uart设备文件,控制uart串口发送和接收数据. 在用户空间设置uart波特率.奇偶校验使能等操作是通过termios结构体和termios库函数完毕.须要在应用程序中包括t ...
- Java推断和检查网络
在实践项目中.常常要处理网络异常等问题.为此,专门设计一个类,随时能够使用. import java.io.IOException; import java.net.InetAddress; impo ...
- 2015南阳CCPC D - Pick The Sticks 背包DP.
D - Pick The Sticks Description The story happened long long ago. One day, Cao Cao made a special or ...