Linux下的定時器類實現(select定時+線程)

來源:互聯網
上載者:User

 

更好的計時器類實現:LINUX RTC機制實現計時器類
     
很多時候需要在LINUX下用到定時器,但像setitimer()和alarm()這樣的定時器有時會和sleep()函數發生衝突,這樣就給編程帶來了很大的困難。
   
寫了一個定時器的類,使用select進行精確定時。而且可以在系統中建立不限數量的定時器,且互不干擾。類的內部採用線程實現。即線程+select。代碼如下:

CTimer.h:<br />/*<br />* CTimer.h<br />*<br />* Created on: 2009-7-13<br />* Author: DEAN<br />*/<br />//////////////////////////////////////////////////////////////////////////<br />// This class provide a timer to finish some works.<br />// Call SetTimer() to set the timer_interval. Call StartTimer()<br />// to enable it and call StopTimer() to stop it.<br />// The work you want to do should be written on OnTimer<br />// function.<br />//////////////////////////////////////////////////////////////////////////<br />#ifndef CTIMER_H_<br />#define CTIMER_H_<br />#include <pthread.h><br />#include <sys/time.h><br />class CTimer<br />{<br />private:<br /> pthread_t thread_timer;<br /> long m_second, m_microsecond;<br /> static void *OnTimer_stub(void *p)<br /> {<br /> (static_cast<CTimer*>(p))->thread_proc();<br /> }<br /> void thread_proc();<br /> void OnTimer();<br />public:<br /> CTimer();<br /> CTimer(long second, long microsecond);<br /> virtual ~CTimer();<br /> void SetTimer(long second,long microsecond);<br /> void StartTimer();<br /> void StopTimer();<br />};<br />#endif /* CTIMER_H_ */<br />CTimer.cpp:<br />/*<br />* CTimer.cpp<br />*<br />* Created on: 2009-7-13<br />* Author: DEAN<br />*/<br />#include "CTimer.h"<br />#include <iostream><br />#include <sys/select.h><br />#include <time.h><br />#include <pthread.h><br />using namespace std;<br />//////////////////////////public methods//////////////////////////<br />CTimer::CTimer():<br /> m_second(0), m_microsecond(0)<br />{<br />}<br />CTimer::CTimer(long second, long microsecond) :<br /> m_second(second), m_microsecond(microsecond)<br />{<br />}<br />CTimer::~CTimer()<br />{<br />}<br />void CTimer::SetTimer(long second, long microsecond)<br />{<br /> m_second = second;<br /> m_microsecond = microsecond;<br />}<br />void CTimer::StartTimer()<br />{<br /> pthread_create(&thread_timer, NULL, OnTimer_stub, this);<br />}<br />void CTimer::StopTimer()<br />{<br /> pthread_cancel(thread_timer);<br /> pthread_join(thread_timer, NULL); //wait the thread stopped<br />}<br />//////////////////////////private methods//////////////////////////<br />void CTimer::thread_proc()<br />{<br /> while (true)<br /> {<br /> OnTimer();<br /> pthread_testcancel();<br /> struct timeval tempval;<br /> tempval.tv_sec = m_second;<br /> tempval.tv_usec = m_microsecond;<br /> select(0, NULL, NULL, NULL, &tempval);<br /> }<br />}<br />void CTimer::OnTimer()<br />{<br /> cout<<"Timer once..."<<endl;<br />}<br />範例程式碼main.cpp:<br />/*<br />* main.cpp<br />*<br />* Created on: 2009-7-19<br />* Author: DEAN<br />*/<br />#include <iostream><br />#include "CTimer.h"<br />using namespace std;<br />int main()<br />{<br /> CTimer t1(1,0),t2(1,0); //建構函式,設兩個定時器,以1秒為觸發時間。參數1是秒,參數2是微秒。<br /> t1.StartTimer();<br /> t2.StartTimer();<br /> sleep(10);<br /> return 0;<br />} 

    使用的話其實很簡單,只要寫一下OnTimer()函數的內容就行了,定時器會在每個定時器觸發時調用此函數。裡面用到的一個點是使用類的成員函數作為線程體的執行函數,需要進行一下靜態類型轉換。在上面已標出:
    static void *OnTimer_stub(void *p)
    {
       
(static_cast<CTimer*>(p))->thread_proc();
    }
    有了這個類以後,使用定時器就方便多了:-)

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.