分类: LINUX
2014-03-18 08:25:56
原文地址:Linux下的定时器类实现(select定时+线程) 作者:chumojing
CTimer.h:
/*
* CTimer.h
*
* Created on: 2009-7-13
* Author: DEAN
*/
//////////////////////////////////////////////////////////////////////////
// This class provide a timer to finish some works.
// Call SetTimer() to set the timer_interval. Call StartTimer()
// to enable it and call StopTimer() to stop it.
// The work you want to do should be written on OnTimer
// function.
//////////////////////////////////////////////////////////////////////////
#ifndef CTIMER_H_
#define CTIMER_H_
#include
#include
class CTimer
{
private:
pthread_t thread_timer;
long m_second, m_microsecond;
static void *OnTimer_stub(void *p)
{
(static_cast
}
void thread_proc();
void OnTimer();
public:
CTimer();
CTimer(long second, long microsecond);
virtual ~CTimer();
void SetTimer(long second,long microsecond);
void StartTimer();
void StopTimer();
};
#endif /* CTIMER_H_ */
CTimer.cpp:
/*
* CTimer.cpp
*
* Created on: 2009-7-13
* Author: DEAN
*/
#include "CTimer.h"
#include
#include
#include
#include
using namespace std;
//////////////////////////public methods//////////////////////////
CTimer::CTimer():
m_second(0), m_microsecond(0)
{
}
CTimer::CTimer(long second, long microsecond) :
m_second(second), m_microsecond(microsecond)
{
}
CTimer::~CTimer()
{
}
void CTimer::SetTimer(long second, long microsecond)
{
m_second = second;
m_microsecond = microsecond;
}
void CTimer::StartTimer()
{
pthread_create(&thread_timer, NULL, OnTimer_stub, this);
}
void CTimer::StopTimer()
{
pthread_cancel(thread_timer);
pthread_join(thread_timer, NULL); //wait the thread stopped
}
//////////////////////////private methods//////////////////////////
void CTimer::thread_proc()
{
while (true)
{
OnTimer();
pthread_testcancel();
struct timeval tempval;
tempval.tv_sec = m_second;
tempval.tv_usec = m_microsecond;
select(0, NULL, NULL, NULL, &tempval);
}
}
void CTimer::OnTimer()
{
cout<<"Timer once..."<
示例代码main.cpp:
/*
* main.cpp
*
* Created on: 2009-7-19
* Author: DEAN
*/
#include
#include "CTimer.h"
using namespace std;
int main()
{
CTimer t1(1,0),t2(1,0); //构造函数,设两个定时器,以1秒为触发时间。参数1是秒,参数2是微秒。
t1.StartTimer();
t2.StartTimer();
sleep(10);
return 0;
}
使用的话其实很简单,只要写一下OnTimer()函数的内容就行了,定时器会在每个定时器触发时调用此函数。里面用到的一个点是使用类的成员函数作为线程体的执行函数,需要进行一下静态类型转换。在上面已标出:
static void *OnTimer_stub(void *p)
{
(static_cast
}