OnTimer使用

定时器在VC中的使用频繁,以下讨论定义器的使用方法。

  定时器的原型是:

  WINUSERAPI UINT WINAPI SetTimer ( HWND hWnd , UINT nIDEvent, UINT uElapse, TIMERPROC lpTimerFunc);

    hWnd      是欲设置定时器的窗体句柄。定时时间到时,系统会向该窗体发送WM_TIMER消息。

    nIDEvent      定时器标识符。在一个窗体内可以使用多个定时器,不同的定时器根据nIDEvent来区分。

    uElapse         定时时间,单位是毫秒。

    lpTimerFunc 定时器的回调函数。如果该值为NULL,定时时间到时,定时器发送的消息WM_TIMER由窗体映像该消息的函数处理;否则由回调函数处理,说白一点,这里的回调函数就是取代OnTimer的处理函数。

         通常,我们在使用定时器时,只用到三个参数,即
    UINT CWnd::SetTimer( 
            UINT nIDEvent
     UINT nElapse
      void (CALLBACK EXPORT* lpfnTimer)( HWND, UINT, UINT, DWORD) 
    );

    其实,这个函数只是MFCAPI的封装,其实现函数为:

    _AFXWIN_INLINE UINT CWnd::SetTimer(UINT nIDEvent, UINT nElapse,

        void (CALLBACK* lpfnTimer)(HWND, UINT, UINT, DWORD))

  {
             ASSERT(::IsWindow(m_hWnd));
         return ::SetTimer(m_hWnd, nIDEvent, nElapse,(TIMERPROC)lpfnTimer); 
    }

    由此可见,CWnd::SetTimer只是将API函数SetTimer的第一个参数设置成它自己的句柄而已。


   
有了上面的认识,对定时器的使用就清楚了,下面举例说明定时器的具体使用。

    1.打开VC,新建一基于对话框的工程,工程名为Test在对话框上添加一按钮,将其ID改为IDC_BUTTON_STARTCaption改为Start. 映像该按钮的BN_CLICKED消息,void CTestDlg::OnButtonStart();

    2.再在对话框上添加一按钮,IDID_BUTTON_STOP,Caption改为Stop,映像消息为void CTestDlg::OnButtonStop();

    3.添加一个Lable,ID改为IDC_STATIC_TIME,用于记数,表明定时器函数的执行。

  4.映像对话框的WM_TIMER消息,void CTestDlg::OnTimer(UINT nIDEvent);


   
以上的实现函数如下所示:

void CTestDlg::OnButtonStart()

{

    SetTimer(1,1000,NULL);//启动定时器1,定时时间是1

}

 

void CTestDlg::OnButtonStop()

{

    KillTimer(1);        //关闭定时器1

}

 

void CTestDlg::OnTimer(UINT nIDEvent)

{

    static int nTimer=0;

    CString strTmp="";

    strTmp.Format("Timer:    %d",nTimer++);

    CWnd *pWnd=GetDlgItem(IDC_STATIC_TIME);

    pWnd->SetWindowText(strTmp);  //Lable中设置新值,表明定时器已经工作。

    CDialog::OnTimer(nIDEvent);

}

 

    回调函数的使用。

    如果不想使用窗体的WM_TIMER消息函数处理,可以使用回调函数来取代,读者可以在上面例子的基础上,增加一个回调函数,以证实前面的讨论。

    首先,定义一个回调函数,回调函数的定义必须按照如下格式。

void CALLBACK TimerProc(HWND hwnd,UINT uMsg,UINT idEvent,DWORD dwTime );

 

    我的实现函数如下:

void CALLBACK TimerProc(HWND hwnd,UINT uMsg,UINT idEvent,DWORD dwTime )

{

     AfxMessageBox("Timer is running!");//定时器时间到,强出一对话框,表明定时器已经运行。

}


将上面的启动函数稍做修改

void CTestDlg::OnButtonStart()

{

//    SetTimer(1,1000,NULL);//启动定时器1,定时时间是1

      SetTimer(1,1000,(TIMERPROC)TimerProc);//用回调函数处理,此时对话框的消息处理函数不再处理。

}
    本来我想将演示程序上传上来,可不知如何上传,所以初学者自己根据上面的操作步骤实验。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Apache Flink中,onTimer是一种在处理时间或事件时间上触发的回调函数,可以用于处理超时或延迟的时间事件。onTimer被定义在实现了TimerTrigger接口的算子中,在这个接口中有一个onTimer()方法。下面是一个使用onTimer函数的简单例子: ``` public class MyKeyedProcessFunction extends KeyedProcessFunction<String, Tuple2<String, Long>, String> { private ValueState<Long> timerState; @Override public void processElement(Tuple2<String, Long> value, Context ctx, Collector<String> out) throws Exception { // 获取当前事件时间和定时器的时间戳 long currentTime = ctx.timerService().currentProcessingTime(); long timerTime = currentTime + 5000; // 注册定时器 ctx.timerService().registerProcessingTimeTimer(timerTime); // 保存定时器时间戳到状态变量中 timerState.update(timerTime); } @Override public void onTimer(long timestamp, OnTimerContext ctx, Collector<String> out) throws Exception { // 处理定时器触发事件 out.collect("Timer fired at " + timestamp); } } ``` 在这个例子中,processElement()方法会在每个输入事件上被调用,它会注册一个在当前时间5秒后触发的定时器,并将定时器时间戳保存到状态变量中。当定时器触发时,onTimer()方法会被调用,它会输出一条消息,告诉我们定时器触发的时间。 需要注意的是,onTimer只能在KeyedProcessFunction和CoProcessFunction这两个算子中使用。在使用onTimer时,我们需要根据需要选择处理时间或事件时间,以及注册定时器的方式(processing time或event time)。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值