头文件内容:

#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延迟执行函数的更多相关文章

  1. IOS 关于取消延迟执行函数的种种。performSelector与cancelPreviousPerformRequestsWithTarget

    本文非本人撰写     @interface NSObject (NSDelayedPerforming) - (void)performSelector:(SEL)aSelector withObj ...

  2. js自定义延迟执行函数

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...

  3. js中的延迟执行和定时执行

    在js中,延迟执行函数有两种,setTimeout和setInterval,用法如下: function testFunction(){Console.log('hovertree.com');} s ...

  4. linux进程编程:子进程创建及执行函数简介

    linux进程编程:子进程创建及执行函数简介 子进程创建及执行函数有三个: (1)fork();(2)exec();(3)system();    下面分别做详细介绍.(1)fork()    函数定 ...

  5. Go defer延迟执行

    defer用于延迟执行,可以类比于java或c++中的析构函数. 查看一段示例代码: func Contents(filename string) (string, error) { //打开文件 f ...

  6. 立即执行函数(IIFE)的理解与运用

    作为JavaScript的常用语法,立即执行函数IIFE(Immediately-Invoked Function Expression)是值得我们认真去学习探究的. 一.创建函数的两种方式 我们先从 ...

  7. SQL Server游标+延迟执行简介

    在项目测试中,我们可能会使用批量生成数据来测试程序的性能. 这里讲一个我遇到的问题,由于我们批量生成数据时基本上是瞬间完成,所以GETDATE()函数获得的时间基本上也是一样的,而我们又要求生成每条数 ...

  8. setTimeout中所执行函数中的this,永远指向window

    注意是要延迟执行的函数中的this哦!! //片段一 setTimeout("alert(this)", 1); // [object Window] //片段二 var obj ...

  9. 每隔一秒自动执行函数(JavaScript)

    http://www.cnblogs.com/xlx0210/archive/2010/03/19/1689497.html 1. setInterval() ——每隔一秒自动执行方法,setInte ...

随机推荐

  1. better-scroll & scroll

    scroll better-scroll https://github.com/ustbhuangyi/better-scroll/blob/master/README.md#getting-star ...

  2. Windows中更新python模块的命令

    最近写爬虫,突然发现自己的动态的User-Agent用不了了,所以想可能是新版本出来了,旧的版本用不了了,坏掉了. 一时间想不起用什么命令了,网上查了一下,发现很简单,所以记录一下方便以后忘了的时候快 ...

  3. 最小生成树 I - Agri-Net

    Farmer John has been elected mayor of his town! One of his campaign promises was to bring internet c ...

  4. Ubuntu 16.04中CPU轮流100%的问题解决

    刚装好Ubuntu 16.04,但是观察各个CPU都是轮流100%,如图所示:

  5. linux下让irb实现代码自己主动补全的功能

    我不知道其它系统上irb是否有此功能,可是在ubuntu上ruby2.1.2自带的irb默认是没有代码自己主动补全功能的,这多少让人认为有所不便.事实上加上也非常easy,就是在irb里载入一个模块: ...

  6. keil编译后生成的M51文件解析

    通过*.m51文件我们能够清楚的看到单片机存储器的使用情况,以及能够看到每一个变量包含局部变量的位置. 之前碰到一个问题,相同的程序,在small模式下编译后执行没问题,但在large模式下能够编译. ...

  7. 一份关于jvm内存调优及原理的学习笔记(转)

    JVM 一.虚拟机的基本结构 1.jvm整体架构 类加载子系统:负责从文件系统或者网络中加载class信息,存入方法区中. 方法区(Perm):存放加载后的class信息,包括静态方法,jdk1.6以 ...

  8. 1. MaxCounters 计数器 Calculate the values of counters after applying all alternating operations: increase counter by 1; set value of all counters to current maximum.

    package com.code; import java.util.Arrays; public class Test04_4 { public static int[] solution(int ...

  9. [C++]_[获取Utf8字符串的字符个数和子字符串]

    场景: 1.有时候须要统计utf8字符串的个数,单纯统计字节个数是不行的. 2.有时候也须要获取从某个位置開始的n个连续字符用于显示或计算. static int GetUtf8LetterNumbe ...

  10. LeetCode 249. Group Shifted Strings (群组移位字符串)$

    Given a string, we can "shift" each of its letter to its successive letter, for example: & ...