灯火互联
管理员
管理员
  • 注册日期2011-07-27
  • 发帖数41778
  • QQ
  • 火币41290枚
  • 粉丝1086
  • 关注100
  • 终身成就奖
  • 最爱沙发
  • 忠实会员
  • 灌水天才奖
  • 贴图大师奖
  • 原创先锋奖
  • 特殊贡献奖
  • 宣传大使奖
  • 优秀斑竹奖
  • 社区明星
阅读:2786回复:0

[C++技术]C++简易定时器设计

楼主#
更多 发布于:2012-09-06 11:35


需求:
      要运用番茄时间管理,没有像文中所说的定时器,用手机也怎么方便,因为本身就经常是在计算机前工作学习的。那么下一个软件呢?有那么一款PomoTime,既包含了定时的功能,又含有添加Todolist,统计当天的番茄时间等的功能,而我仅仅需要一个定时功能,因为对于Todolist还是希望采用纸笔的方式进行记录。原来尝试看桌面右下角的时间,还判断一个番茄时间是否结束,发现工作中,往往因为过于集中注意力或分散注意力浏览网页去了而忘记对时间的查看,同时又想将自己所学的知识进行运用,于是想到了这么个方式,自己编写一个简易的定时器吧。
功能描述:
1. 显示分,秒,处于桌面最前面;
2. 设定分,秒;
3. 当设定的时间消耗完后会弹出对话框,进行提醒;
(这里没有采用声音提醒的原因是若采用这种方式,会影响到别人的办公与学习。)
语言选择:
由于这仅仅是一个很简单的功能实现,对于语言没有很大的要求,选择了C++,库为wxWidget。
界面设计:
使用wxFormBuilder
关键点描述:
    在整个过程中遇到的问题的地方时,如何进行倒计时?最先想到的就是onTimer这样类似的功能,在wxWidget库中找到了具有该功能的wxTimer类,在手册中这么一句话 its precision is platform-dependent, but in general will not be better than 1ms nor worse than 1s. 也就是说采用该方法进行时间设定可能每一次都会造成1ms-1s时间上的误差,这个误差不是很大,对于整个的设计目的并没有太大的影响。
    全部源码在Simple timer source code
    关于时间处理的部分代码如下:
   1: // timer_app.h
   2: ////////////////////////////////////////////////////////////////////////////////
   3: // main application frame declaration
   4: ////////////////////////////////////////////////////////////////////////////////
   5:
   6: class TimerFrame : public MainDialogBase
   7: {
   8: public:
   9:     TimerFrame( wxWindow *parent );
  10:     virtual ~TimerFrame();
  11:
  12: protected:
  13:     // protected event handlers
  14:     virtual void OnCloseDialog( wxCloseEvent; event );
  15:     virtual void OnSetButtonClick( wxCommandEvent; event );
  16:     virtual void OnStartButtonClick( wxCommandEvent; event );
  17:    
  18: public:
  19:     void OnTimer( wxTimerEvent; event );
  20:    
  21: private:
  22:     int m_minute;
  23:     int m_second;
  24:     wxTimer *m_clock;
  25:     wxDECLARE_EVENT_TABLE();  
  26: };
  27:
  28: // timer_app.cpp
  29: // event list, combine timer event with OnTimer function
  30: wxBEGIN_EVENT_TABLE(TimerFrame, MainDialogBase)
  31: EVT_TIMER(TIMER_ID, TimerFrame::OnTimer)
  32: wxEND_EVENT_TABLE()
  33:
  34: //......some code......
  35:
  36: TimerFrame::TimerFrame(wxWindow *parent) : MainDialogBase( parent )
  37: {
  38:     m_clock = new wxTimer();               // create a new wxTimer
  39:     m_clock->SetOwner(this, TIMER_ID);     // set owner, #define TIMER_ID 1000
  40:     m_minute = 25;
  41:     m_second = 0;
  42: }
  43:
  44: //......some code......
  45:
  46: // count down the time and show
  47: void TimerFrame::OnTimer(wxTimerEvent; event)
  48: {
  49:     // determine the minute and second wait to show
  50:     if (m_second == 0 ;; m_minute == 0) {
  51:         m_clock->Stop();
  52:         wxMessageBox(wxT("Time over"),wxT("Timer"));
  53:         return;
  54:     } else if (m_second ==0) {
  55:         m_second = 59;
  56:         m_minute -= 1;
  57:     } else {
  58:         m_second -= 1;
  59:     }
  60:     wxString sTmp;
  61:     sTmp.Printf(wxT("%d"),m_minute);
  62:     m_minuteTextCtrl->SetValue(sTmp);
  63:     sTmp.Printf(wxT("%d"),m_second);
  64:     m_secondTextCtrl->SetValue(sTmp);
  65: }
  66:
作者:钟谢伟

喜欢0 评分0
游客

返回顶部