/*******************************************************************************
* LRTimer.h *
* *
* Written by Max Gurdziel 2005 under GNU General Public License *
* contact me: max[at]remoteSOS[dot]com *
* *
* LRTimer is a low resolution timer class with own timing thread. It allows *
* an external callback function to be supplied that will be called in *
* pre-defined time intervals. *
* The smallest timer interval you can use is 1ms. *
* *
* Tested with gcc mingw & Visual C++ 6.0 under WindowsXP Home and Pro *
* *
* *
* LRTimer timer; // define LRTimer object *
* timer.setInterval(100); // set interval of 100ms *
* timer.setCallbackProc(&myCallbackFunction, 0); // set callback function *
* // it's prototype is: *
* // void myCallbackFunction(void* pParam); *
* *
* timer.start(); // start the timer *
* .... *
* timer.stop(); // stops the timer *
* .... *
* timer.start(200); // starts timer with new interval *
* *
* *
* Example code: *
* Copy and paste below sample code to test LRTimer *
* *
________________________________________________________________________________
#include <stdlib.h>
#include "LRTimer.h"
// define callback function
//
static void myCallback(void* data)
{
static DWORD cnt = 0;
char c;
cnt++;
switch (cnt % 4)
{
case 0: c = '|'; break;
case 1: c = '/'; break;
case 2: c = '-'; break;
case 3: c = '//';
}
printf("/b%c",c);
}
int main(int argc, char *argv[])
{
LRTimer lrt;
lrt.setCallbackProc(&myCallback, NULL); // set the callback function by reference
lrt.setInterval(50); // set delay interval in miliseconds
lrt.start(); // start the timer
getchar(); // let it run for a while - press Enter
lrt.stop(); // stop the timer
getchar(); // wait to show it's stopped - Enter
lrt.start(200); // start with different delay
getchar();
lrt.stop();
system("PAUSE");
return 0;
}
________________________________________________________________________________
* *
* Permission to use, copy, modify, and distribute this software and its *
* documentation under the terms of the GNU General Public License is hereby *
* granted. No representations are made about the suitability of this software *
* for any purpose. It is provided "as is" without express or implied warranty. *
* See http://www.gnu.org/copyleft/gpl.html for more details. *
* *
* All I ask is that if you use LRTimer in your project retain the *
* copyright notice. If you have any comments and suggestions please email me *
* max[at]remoteSOS[dot]com *
* *
*******************************************************************************/
#ifndef LRTIMER_H__
#define LRTIMER_H__
#ifndef _WIN32_WINNT
#define _WIN32_WINNT 0x0500
#endif
// compile with: /MT /D "_X86_" /c
// processor: x86
#include <windows.h>
#include <process.h> /* _beginthread, _endthread */
#include <stdio.h>
#include <assert.h>
// define a second in terms of 100ns - used with waitable timer API
#define _SECOND 10000
typedef VOID (*LRTCallbackEventProc)(VOID*);
class
{
public:
// default constructor with 1 second interval
DWORD
// default destructor
~LRTimer();
// starts timer by creating new thread. interval must be set earlier
VOID
// starts timer with given interval in miliseconds
VOID start(DWORD
// stops the timer
VOID
// sets time interval in miliseconds
VOID setInterval(DWORD
// returns time interval in ms
DWORD
// sets function that will be called on time expiration
VOID setCallbackProc( LRTCallbackEventProc pcbEventProc, VOID* pcbParam );
// returns true if LRtimer is currently running
BOOL
// It should be used if the worker class will use CRT functions
static HANDLE CrtCreateThread(LPSECURITY_ATTRIBUTES lpsa, DWORD dwStackSize, LPTHREAD_START_ROUTINE pfnThreadProc, void *pvParam, DWORD dwCreationFlags, DWORD *pdwThreadId) throw()
{
// sanity check for pdwThreadId
sizeof(DWORD) == sizeof(unsigned int));
// _beginthreadex calls CreateThread which will set the last error value before it returns
return (HANDLE) _beginthreadex(lpsa, dwStackSize, (unsigned int (__stdcall *)(void *)) pfnThreadProc, pvParam, dwCreationFlags, (unsigned int
}
private:
DWORD m_dwInterval; // interval between alarms
// pointer to user callback function
VOID *m_pcbParam; // pointer to user callback parameter
BOOL m_bRunning; // timer running state
HANDLE m_hTimerThread; // handle to timer thread
DWORD m_iID; // timer thread id - added for compatibility with Win95/98
// timer clocking tread runtine
virtual DWORD
// wrapper to thread runtine so it can be used within a class
static DWORD WINAPI timerThreadAdapter(PVOID
{
return
}
// timer callback APC procedure called when timer is signaled
virtual VOID CALLBACK TimerAPCProc(LPVOID, DWORD, DWORD);
// wrapper to callback APC procedure so it can be used within a class
static VOID CALLBACK TimerAPCProcAdapter(PVOID _this, DWORD a1=0, DWORD
{
((LRTimer*) _this)->TimerAPCProc( NULL, a1, a2 );
}
};
#endif
/*******************************************************************************
* LRTimer.cpp *
* *
* Written by Max Gurdziel 2005 under GNU General Public License *
* contact me: max[at]remoteSOS[dot]com *
* *
* LRTimer is a low resolution timer class with own timing thread. It allows *
* an external callback function to be supplied that will be called in *
* pre-defined time intervals. The smallest timer interval you can use is 1ms. *
* *
* See header file for more info, usage information and example *
* *
* *
* *
* Permission to use, copy, modify, and distribute this software and its *
* documentation under the terms of the GNU General Public License is hereby *
* granted. No representations are made about the suitability of this software *
* for any purpose. It is provided "as is" without express or implied warranty. *
* See http://www.gnu.org/copyleft/gpl.html for more details. *
* *
* All I ask is that if you use LRTimer in your project you retain the *
* copyright notice. If you have any comments and suggestions please email me *
* max[at]remoteSOS[dot]com *
* *
* 2008-6-23 Modified by ZhangLiang *
* *
*******************************************************************************/
#include "stdafx.h"
#include "LRTimer.h"
#ifndef _WIN32_WINNT
#define _WIN32_WINNT 0x0500
#endif
LRTimer::LRTimer(DWORD
m_dwInterval(dwInterval),
m_bRunning(FALSE),
m_pCallback(NULL),
m_pcbParam(NULL),
m_hTimerThread(0)
{}
LRTimer::~LRTimer()
{}
VOID CALLBACK LRTimer::TimerAPCProc(LPVOID, DWORD, DWORD)
{
// call custom callback function
if
(*m_pCallback)(m_pcbParam);
#ifdef _DEBUG
else
"No callback function set/n");
#endif
}
DWORD
{
HANDLE
BOOL
LARGE_INTEGER liDueTime;
CHAR
CHAR
"LRT_%x", (DWORD)(DWORD_PTR)this);
if
LONGLONG)m_dwInterval * _SECOND;
bSuccess = SetWaitableTimer(
// Handle to the timer object
// When timer will become signaled first time
// Periodic timer interval
// Completion routine
this, // Argument to the completion routine
// Do not restore a suspended system
if
while
// SleepEx(0, TRUE) consumes 100% CPU usage
CancelWaitableTimer(hTimer);
else
"SetWaitableTimer failed with Error %d.", GetLastError() );
#ifdef _DEBUG
"Error", MB_ICONEXCLAMATION );
#endif
return
}
CloseHandle(hTimer);
return
}
VOID
{
m_bRunning = TRUE;
if
stop();
#ifndef _INC_CRTDEFS
this, 0, &m_iID);
#else
this, 0, &m_iID);
#endif
if
{
#ifdef _DEBUG
"CreateThread failed (%d)/n", GetLastError() );
#endif
return;
}
}
VOID LRTimer::start(DWORD
{
setInterval(_interval_ms);
start();
}
VOID
{
m_bRunning = FALSE;
CloseHandle(m_hTimerThread);
m_hTimerThread = 0;
}
VOID LRTimer::setInterval(DWORD
{
m_dwInterval = _interval_ms;
}
DWORD
{
return
}
VOID LRTimer::setCallbackProc( LRTCallbackEventProc pcbEventProc, VOID* pcbParam)
{
m_pCallback = pcbEventProc;
m_pcbParam = pcbParam;
}
BOOL
{
return
}
C++ 毫秒定时器
原创
©著作权归作者所有:来自51CTO博客作者mapaware的原创作品,请联系作者获取转载授权,否则将追究法律责任
上一篇:一个简单的OpenGL程序
下一篇:神经网络: 计算简单的加法
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
两个C++毫秒级定时器
Win32控制台测试程序
c++ 测试 #define #include g++ -
【Swoole系列5.1】毫秒定时器
毫秒定时器PHP 中有没有定时器?还记得我们之前讲过这个东西吧。如果不记得的小伙伴,可以移步之前的文章中再去重温一下 PHP没有定时器?PHP没有定时器=
java php python linux 编程语言 -
C++ 定时器任务类实现
任务类,定时器,select版定时器
#include #define #ifndef #endif ios