windows 非窗口定时器

#ifndef _MYTIMER_H_
#define _MYTIMER_H_
#include <map>
#include <set>
#include <windows.h>
#include <Mmsystem.h>
#include <string>

#include "ttype.h"
#include "lock.h"

#pragma comment(lib, "Winmm.lib")

#define  TIMER_PERIOD 500

class CMyTimer;
enum emTimeType
{
    E_TIME_ONESHOT = 0,
    E_TIME_PERIOD  = 1
};

struct TIMERVAL
{
    UINT uType;
    UINT uTimeVal;
    UINT uTimeFinal;
    CMyTimer *pCTimer;
};

typedef   std::map<UINT,TIMERVAL>   TimerMap;   

class CMyTimer
{
public:
    CMyTimer(void);
    ~CMyTimer(void);
public:
    void   KillMyTimer();
    void   SetOneTimer(UINT nTimeID,UINT nElapse);
    void   SetTimer(UINT nTimeID,UINT nElapse);

    static void   SetMyTimerOnce(UINT   nElapse,DWORD dwUser = NULL);
    static void   SetMyTimerPeriod(UINT nElapse,DWORD dwUser = NULL);
    virtual bool  ontime(UINT nTimeID) = 0;

    static CLock    m_lock;
    static       bool       m_bInitTime;
private:
    MMRESULT   m_nTimerID;

    static void    CALLBACK OnTime(UINT uTimerID, UINT uMsg,
                            DWORD_PTR dwUser, DWORD_PTR dw1, DWORD_PTR dw2);
    static TimerMap TimerMap;

};

#endif 
#include "MyTimer.h"
#include <iostream>
#include <time.h>

using namespace std;
CMyTimer::CMyTimer(void)
{
    m_nTimerID = 0;
}

CMyTimer::~CMyTimer(void)
{

}

TimerMap CMyTimer::TimerMap;
bool CMyTimer::m_bInitTime = false;
CLock    CMyTimer::m_lock;

void  CMyTimer::SetMyTimerOnce(UINT nElapse,DWORD dwUser)
{
    if (m_bInitTime)
    {
        return;
    }
    if (NULL !=  ::timeSetEvent(nElapse,1,OnTime,dwUser,TIME_ONESHOT))
    {
        m_bInitTime = true;
    }
}

void  CMyTimer::SetMyTimerPeriod(UINT nElapse,DWORD dwUser)
{
    if (NULL != ::timeSetEvent(nElapse,1,OnTime,dwUser,TIME_PERIODIC))
    {
        m_bInitTime = true;
    }
}

void    CALLBACK CMyTimer::OnTime(UINT uTimerID, UINT uMsg,
                                     DWORD_PTR dwUser, DWORD_PTR dw1, DWORD_PTR dw2)
{
    CSignedLock lock(&m_lock);
    for (auto iter = TimerMap.begin();
            iter != TimerMap.end();)
    {
        iter->second.uTimeVal += TIMER_PERIOD;
        if (iter->second.uTimeVal >= iter->second.uTimeFinal)
        {
            if (E_TIME_ONESHOT == iter->second.uType)
            {
                iter->second.pCTimer->ontime(iter->first);
                TimerMap.erase(iter++);
                continue;
            }
            if (E_TIME_PERIOD == iter->second.uType)
            {
                iter->second.uTimeVal = 0;
                if (false == iter->second.pCTimer->ontime(iter->first))
                {
                    TimerMap.erase(iter++);
                    continue;
                }
            }
        }
        iter++;
    }
    return;
}

void  CMyTimer:: KillMyTimer()
{
    ::timeKillEvent(m_nTimerID);
    m_bInitTime = false;
}

void  CMyTimer::SetOneTimer(UINT nTimeID,UINT nElapse)
{
    CSignedLock lock(&m_lock);
    auto iter = TimerMap.find(nTimeID);
    if (iter == TimerMap.end())
    {
        TimerMap[nTimeID].pCTimer = this;
        TimerMap[nTimeID].uTimeFinal = nElapse;
        TimerMap[nTimeID].uTimeVal = 0;
        TimerMap[nTimeID].uType = E_TIME_ONESHOT;
    }
}

void   CMyTimer::SetTimer(UINT nTimeID,UINT nElapse)
{
    CSignedLock lock(&m_lock);
    auto iter = TimerMap.find(nTimeID);
    if (iter == TimerMap.end())
    {
        TimerMap[nTimeID].pCTimer = this;
        TimerMap[nTimeID].uTimeFinal = nElapse;
        TimerMap[nTimeID].uTimeVal = 0;
        TimerMap[nTimeID].uType = E_TIME_PERIOD;
    }
}
#ifndef _Work_H_
#define _Work_H_
#include "MyTimer.h"

enum MyEnum
{
    E_TIME_ID_1 = 1,
    E_TIME_ID_2 = 2,
    E_TIME_ID_3 = 3,

};

class Work :public CMyTimer
{
public:
    Work(void);
    ~Work(void);
    bool Init();
    void Run();
    bool unInit();
    void onTime();
    bool time_fun_1();
    bool time_fun_2();
    bool time_fun_3();

    bool ontime(UINT nTimeID);
};

#endif//_Work_H_
#include "Work.h"
#include <iostream>
using namespace std;

Work::Work(void)
{
}

Work::~Work(void)
{

}

bool Work::Init()
{
    if (!CMyTimer::m_bInitTime)
    {
        CMyTimer::SetMyTimerPeriod(TIMER_PERIOD);
    }
    return true;
}

void Work::Run()
{
    SetOneTimer(E_TIME_ID_1,1000);
    SetTimer(E_TIME_ID_2,1000);
}

bool Work::unInit()
{
    return true;
}

bool Work::time_fun_1()
{
    std::cout<<"只执行一次的定时器"<<__LINE__<<std::endl;
    return true;
}

bool Work::time_fun_2()
{
    std::cout<<"每周期执行一次的定时器"<<__LINE__<<std::endl;
    static int i = 0;
    if (++i == 3)
    {
        return false;
    }
    return true;
}

bool Work::time_fun_3()
{
    std::cout<<__LINE__<<std::endl;
    return true;
}

//
bool Work::ontime(UINT nTimeID)
{
    switch (nTimeID)
    {
    case E_TIME_ID_1:
        return time_fun_1();
    case E_TIME_ID_2:
        return time_fun_2();
    case E_TIME_ID_3:
        return time_fun_3();
    default:
        break;
    }
    return true;
}
///普通锁定类
#ifndef _CLOCK_H_
#define _CLOCK_H_

#include <windows.h>
class  CLock
{
    friend class CSignedLock;

private:
    CRITICAL_SECTION                m_csLock;                    ///关键段

    ///函数定义
public:
    ///构造函数
    inline CLock() { ::InitializeCriticalSection(&m_csLock); }
    ///析构函数
    inline ~CLock() { ::DeleteCriticalSection(&m_csLock); }

    ///功能函数
private:
    ///锁定函数
    inline void Lock() { ::EnterCriticalSection(&m_csLock); }
    ///解锁函数
    inline void UnLock() { ::LeaveCriticalSection(&m_csLock); }
};

class  CSignedLock
{
    ///变量定义
private:
    CLock        * m_pLock;                    ///锁定对象
    int            m_iLockCount;                ///锁定计数
    ///函数定义
public:
    ///构造函数
    CSignedLock(CLock * pLock)
    {
        m_iLockCount = 0;
        m_pLock = pLock;
        Lock();
    }
    ///析构函数
    ~CSignedLock()
    {
        UnLock();
    }

public:
    ///锁定函数
    inline void Lock()
    {
        if (m_pLock)
        {
            m_iLockCount++;
            m_pLock->Lock();
        }
    }
    ///解锁函数
    inline void UnLock()
    {
        if (m_pLock)
        {
            m_iLockCount--;
            m_pLock->UnLock();
        }
    }
};

#endif //_CLOCK_H_
#ifndef _TTYPE_H_
#define _TTYPE_H_

typedef  unsigned int UINT;

#define  saferelease(p) {    if(nullptr != p) {        delete p ;         p = nullptr;    }}

#endif
#include "work.h"
#include <windows.h>
#include <iostream>
using namespace std;

Work work ;

int main()
{
    work.Init();
    work.Run();
    system("pause");
    cout<<endl;
}
时间: 2024-10-29 19:10:40

windows 非窗口定时器的相关文章

自定义HttpModule,用于未登录用户,不弹出Windows认证窗口,而是跳转回SSO站点

2012年的一篇随笔记录,可以学习到如何自定义HttpModule,而具体里面针对需求开发的代码,可能未必能让大伙了解到什么,可快速扫描而过. 1 using System; 2 using System.Web; 3 4 using System.Configuration; 5 using System.Web.Configuration; 6 using Microsoft.SharePoint; 7 using System.Net; 8 using System.Security.Pr

[转]Windows的窗口刷新机制

1.Windows的窗口刷新管理 窗口句柄(HWND)都是由操作系统内核管理的,系统内部有一个z-order序列,记录着当前窗口从屏幕底部(假象的从屏幕到眼睛的方向),到屏幕最高层的一个窗口句柄的排序,这个排序不关注父窗口还是子窗口. 当任意一个窗口接收到WM_PAINT消息产生重绘,更新区域绘制完成以后,就搜索它的前面的一个窗口,如果此窗口的范围和更新区域有交集,就向这个窗口发送WM_PAINT消息,周而复始,直到执行到顶层窗口.才算完成. 1.1 父子窗口间的刷新管理 对于一个对话框(主窗口

眼见为实(2):介绍Windows的窗口、消息、子类化和超类化

眼见为实(2):介绍Windows的窗口.消息.子类化和超类化 这篇文章本来只是想介绍一下子类化和超类化这两个比较"生僻"的名词.为了叙述的完整性而讨论了Windows的窗口和消息,也简要讨论了进程和线程.子类化(Subclassing)和超类化(Superclassing)是伴随Windows窗口机制而产生的两个复用代码的方法.不要把"子类化.超类化"与面向对象语言中的派生类.基类混淆起来."子类化.超类化"中的"类"是指W

C#创建windows服务搭配定时器Timer使用实例(用代码做,截图版)

功能说明:C#创建一个windows服务,服务启动时D:\mcWindowsService.txt写入数据,服务运行期间每隔两秒写入当前时间.      原理这些就不说了,三语两语说不清楚,直接贴一个实例.不能贴图片!!那个压缩文里面是word文档!!有图有真相 1.建立空白项目 2.添加创建windows服务需要的引用,选择System.ServiceProcess.   3.创建服务类,继承ServiceBase,类的源代码在后面. 4. 添加windows服务的安装类. (1)在类名或者解

SWT获取windows系统窗口颜色

很多人在使用电脑时都会将系统窗口的颜色修改为护眼色(85.95.205),在设计软件的界面背景时就需要考虑到背景颜色是根据系统的窗口颜色来决定的. 在使用AWT时,可以通过java.awt.SystemColor.window来获取windows系统窗口颜色.使用SWT时,如果使用Display.getSystemColor(id)是无法获得系统窗口颜色的.不过通过Display的getSystemColor方法可以启发我们自己写一个获取系统窗口颜色的方法,以下为代码: int pixel = 

windows编程-窗口

//注意messagebox函数窗口名字必须使用TEXT函数包含 //句柄:返回标识资源的标志号 //常见句柄:窗口句柄(HWND) 图标句柄(HICON),光标句柄(HCURSOR),画刷句柄(HBRUSH) //CS 窗口类别 CW建立窗口 DT 绘制文字 IDI图示ID IDC 游标ID MB 消息框 SND 声音 WM 窗口消息 WS窗口样式 #include<Windows.h> LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM)

子类化和超类化区别(介绍Windows的窗口、消息、子类化和超类化)(转)

原文地址:http://maqianli210.blog.sohu.com/75497589.html 这篇文章本来只是想介绍一下子类化和超类化这两个比较“生僻”的名词.为了叙述的完整性而讨论了Windows的窗口和消息,也简要讨论了进程和线程.子类化(Subclassing)和超类化(Superclassing)是伴随Windows窗口机制而产生的两个复用代码的方法.不要把“子类化.超类化”与面向对象语言中的派生类.基类混淆起来.“子类化.超类化”中的“类”是指Windows的窗口类. 0 运

非窗口类中使用定时器的方法(二)

就职百度期间,王劲分别创立了百度移动云事业部.百度大数据部.百度基础架构(云计算)部.百度美国研发中心.百度深圳研发中心:并以百度深度学习实验室(IDL)为基础,联合创立了百度研究院.在2010年4月到2015年4月的5年间,王劲同时还负责百度商业变现的技术与产品(凤巢). 2013年百度启动无人车项目,2015年12月14日,百度成立了自动驾驶事业部,王劲出任事业部总经理. 王劲一度成为百度无人车业务的代言人,直到2017年3月份,王劲离开百度,据腾讯<一线>报道,王劲与百度的分手并不愉快.

Windows 非阻塞或异步 socket

异步与非阻塞区别见我的另外一篇文章Socket 同步/异步与阻塞/非阻塞区别 select WSAAsyncSelect WSAEventSelect 重叠(Overlapped)I/O IOCP:完成端口 Select 首先要使用ioctlsocket设置为非阻塞模式. 然后启动线程,线程中不停select. WSAAsyncSelect WSAAsyncSelect模型是Windows下最简单易用的一种Socket I/O模型.使用这种模型时,Windows会把网络事件以消息的形势通知应用程