WaitableTimer APC队列实现时钟功能

//时钟回调函数
 static void WINAPI CallFUN(LPVOID lpArgToCompletionRoutine,
       DWORD dwTimerLowValue,
       DWORD dwTimerHighValue)
 {
  int thrid = ::GetCurrentThreadId();
  CMFCTrainDlg* pdlg = reinterpret_cast<CMFCTrainDlg*>(lpArgToCompletionRoutine);
  //工作线程无法直接更新界面,需要通过发送消息到ui线程。这里相当于updatedata函数
  pdlg->SendMessage(WM_UPDATA, true);
  pdlg->m_nEdit++;
  pdlg->SendMessage(WM_UPDATA,false);
 }
 //工作线程创建时钟,并进入循环等待,当时钟触发,执行apc函数后,sleepex返回
 static void THRFUN(CMFCTrainDlg* pdlg)
 {
  int thrid = ::GetCurrentThreadId();
  HANDLE htimer = ::CreateWaitableTimer(NULL, true, NULL);
  ENSURE(htimer);
  LARGE_INTEGER duetime;
  duetime.QuadPart = -10000000;
  ::SetWaitableTimer(htimer, &duetime, 1000, CallFUN, pdlg, true);
  while (!pdlg->m_thrflag)
   SleepEx(INFINITE, true);
 }
 
 void startrun()
 {
  CWinThread* wthr = ::AfxBeginThread(AFX_THREADPROC(THRFUN), this);
 }

//自定义消息WM_UPDATA
ON_MESSAGE(WM_UPDATA, &CMFCTrainDlg::OnUpdateData)

//消息处理函数
afx_msg LRESULT CMFCTrainDlg::OnUpdateData(WPARAM wParam, LPARAM lParam)
{
 UpdateData(wParam);
 return 0;
}

运行效果会自动更新编辑框数字

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值