一个Time类供大家参考
来源:互联网 发布:淘宝分销管理系统 编辑:程序博客网 时间:2024/04/28 14:19
.h文件如下:
#pragma once
#include <windows.h>
typedef VOID (CALLBACK* TIMERNOTIFYPROC)(UINT TimerID,struct TimerInfoTag* TimerInfo);
typedef struct TimerInfoTag
{
UINT uElapse;
TIMERNOTIFYPROC lpTimerFunc;
LPVOID argc;
BOOL once;
//返回值
UINT Result;
UINT TiemrID;
}TIMERINFO,*LPTIMERINFO;
#ifdef TIMERMODULE_EXPORTS
class __declspec(dllexport) CLiteTimer
#else
class __declspec(dllimport) CLiteTimer
#endif
{
public:
CLiteTimer();
static CLiteTimer& StaticInstance();
void StartTimer();
void StopTimer();
BOOL SetTimer(LPTIMERINFO TimerInfo);
BOOL KillTimer(LPTIMERINFO TimerInfo);
static LPTIMERINFO Alloc(UINT uElapse,TIMERNOTIFYPROC lpTimerFunc, LPVOID argc,BOOL once,int enlarge=0);
static void Free(LPTIMERINFO TimerInfo);
private:
static DWORD WINAPI WorkThreadProc(LPVOID);
DWORD m_threadid;
};
.cpp文件
#include "StdAfx.h"
#include "LiteTimer.h"
#define WM_SETTIMER WM_USER+100
#define WM_KILLTIMER WM_USER+101
#define WM_STOPTIMER WM_USER+102
CLiteTimer::CLiteTimer():
m_threadid(0)
{
}
CLiteTimer& CLiteTimer::StaticInstance()
{
static CLiteTimer LiteTimer;
return LiteTimer;
}
void CLiteTimer::StartTimer()
{
if(m_threadid==NULL)
{
HANDLE hEvent=::CreateEvent(NULL,FALSE,FALSE,NULL);
::CreateThread(NULL,0,CLiteTimer::WorkThreadProc,hEvent,0,&m_threadid);
WaitForSingleObject(hEvent,INFINITE);
::CloseHandle(hEvent);
}
}
void CLiteTimer::StopTimer()
{
if(m_threadid!=NULL)
{
HANDLE hEvent=::CreateEvent(NULL,FALSE,FALSE,NULL);
::PostThreadMessage(m_threadid,WM_STOPTIMER,(WPARAM)hEvent,0);
m_threadid=0;
WaitForSingleObject(hEvent,INFINITE);
::CloseHandle(hEvent);
}
}
BOOL CLiteTimer::SetTimer(LPTIMERINFO TimerInfo)
{
if(m_threadid!=NULL)
{
if(TimerInfo->Result==-1) return FALSE;
return ::PostThreadMessage(m_threadid,WM_SETTIMER,0,(LPARAM)TimerInfo);
}
return FALSE;
}
BOOL CLiteTimer::KillTimer(LPTIMERINFO TimerInfo)
{
if(m_threadid!=NULL)
{
TimerInfo->Result=-1;
if(TimerInfo->once)
{
return TRUE;
}
return ::PostThreadMessage(m_threadid,WM_KILLTIMER,0,(LPARAM)TimerInfo);
}
return FALSE;
}
LPTIMERINFO CLiteTimer::Alloc(UINT uElapse,TIMERNOTIFYPROC lpTimerFunc, LPVOID argc,BOOL once,int enlarge)
{
LPTIMERINFO lpTimerInfo = (LPTIMERINFO)new char[sizeof(TIMERINFO)+enlarge];
lpTimerInfo->uElapse=uElapse;
lpTimerInfo->lpTimerFunc=lpTimerFunc;
lpTimerInfo->argc=argc;
lpTimerInfo->once=once;
lpTimerInfo->TiemrID=0;
lpTimerInfo->Result=0;
return lpTimerInfo;
}
void CLiteTimer::Free(LPTIMERINFO TimerInfo)
{
delete TimerInfo;
}
DWORD WINAPI CLiteTimer::WorkThreadProc(LPVOID Param)
{
MSG msg;
PeekMessage(&msg,0,0,0,PM_NOREMOVE);
::SetEvent((HANDLE)Param);
while(GetMessage(&msg,0,0,0))
{
switch(msg.message)
{
case WM_TIMER:
{
if(((LPTIMERINFO)msg.lParam)->Result!=-1)
{
((LPTIMERINFO)msg.lParam)->lpTimerFunc((UINT)msg.wParam,(LPTIMERINFO)msg.lParam);
}
if(((LPTIMERINFO)msg.lParam)->once)
{
CLiteTimer::Free((LPTIMERINFO)msg.lParam);
::KillTimer(0,(UINT)msg.wParam);
}
}
break;
case WM_SETTIMER:
{
if(((LPTIMERINFO)msg.lParam)->TiemrID!=-1)
{
((LPTIMERINFO)msg.lParam)->TiemrID=::SetTimer(0,((LPTIMERINFO)msg.lParam)->TiemrID,((LPTIMERINFO)msg.lParam)->uElapse,(TIMERPROC)msg.lParam);
((LPTIMERINFO)msg.lParam)->Result=1;
}
}
break;
case WM_KILLTIMER:
{
::KillTimer(0,(UINT)((LPTIMERINFO)msg.lParam)->TiemrID);
CLiteTimer::Free((LPTIMERINFO)msg.lParam);
}
break;
case WM_STOPTIMER:
{
::SetEvent((HANDLE)msg.wParam);
::ExitThread(1);
}
break;
}
}
return 1;
}
- 一个Time类供大家参考
- WINDOWS常见问题,供大家参考
- 拷贝文档 供大家参考
- 电烤箱资料供大家参考
- C#读写INI文件集成类,供大家参考!
- 我自己创建一个一个 JsonHelper 类,只是供大家参考
- Windows蓝色屏幕代码,供大家参考
- 根据IP显示地址,供大家参考
- qt4 + mplayer 供大家参考下
- JSP语法简表(仅供大家参考)
- 什么是SOA(供大家参考)
- 以下问题和解决方法供大家参考
- 一款高仿微信的app供大家参考
- 转一个今年招聘薪水,不一定很准,供大家参考
- 看到一个老外写的图像处理文章,感觉不错,翻译过来供大家参考.
- 6、用vb6写一个仿照SPY++的东西,供大家参考学习用
- 最近闲暇无事,做了一个UDP监控的程序,贴出源码,供大家参考。
- 经常会遇见java.lang.NullPointerExcetion 的错误,典型的一个错误例子,供大家参考
- Mysql数据库函数
- C 中用printf格式化输出
- C++ 条件编译
- [Win32]根据主机名、域名、IP字符串获取IP地址
- c语言写的通讯录
- 一个Time类供大家参考
- Windows Copy命令妙用
- 关于ios 推送功能的终极解决
- Linux下清空缓冲区的方法
- Linux常用命令大全
- VirtualBox安装Windows XP——图解
- Visual+C+++6.0(支持win7).zip下载
- fprintf文件格式化输出遇到的问题及其解决
- .emacs 文件简单配置亲测