我使用VC中SetTimer的一点高级经验(不是MFC的SetTimer)

mybios 2004-06-16 01:55:35
直接用API的形式调用,其中uElapse是回调函数的执行时间间隔
UINT uTimerID = SetTimer(NULL , NULL , uElapse , (TIMERPROC)TimerProc);
然后建立一个回调函数
VOID CALLBACK TimerProc(
HWND hwnd, // handle to window
UINT uMsg, // WM_TIMER message
UINT_PTR idEvent, // timer identifier
DWORD dwTime // current system time
)
{
//做你需要做的事情
}

最后,可以用KillTimer(uTimerID);来停止时间器的执行。

不过有一个问题,如果你在一个线程中调用SetTimer的话,TimerProc回调函数永远不会执行!我使用的方法是发送一个进程消息,在消息处理中调用SetTimer。不知有没有更好的做法?(我知道我的做法已经很笨了)
...全文
233 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
mybios 2004-06-17
  • 打赏
  • 举报
回复
to:QunKangLi(雾痕) & lygfqy(风清扬)
如果线程内处理消息的话,就是执行了SetTimer API后要用一个死循环来检查消息了,对吗?
但是我的程序想新线程执行完SetTimer后就立即结束这个线程,不想用死循环来检查消息哦。
learnner 2004-06-16
  • 打赏
  • 举报
回复
我的帖子是 http://community.csdn.net/Expert/topic/3093/3093177.xml?temp=.4154474
如果到那里解答我好给分,谢谢。
learnner 2004-06-16
  • 打赏
  • 举报
回复
我的问题没有人指导,借宝地问问

我程序中想使用 SetTimer 来每隔固定时间来运行某个操作。
但是因为这个操作需要的时间是不一定的,有时候可能2分钟结束,有时候可能要10分钟。所以我不想猜测一个固定的时间间隔作为参数。

我想,当操作开始的时候,计时器不计时,等操作结束再开始计时。这样我就可以设置固定的操作间隔时间了。不知道如何操作?

用KillTimer杀掉计时器好像不能满足我的要求吧?我需要在我的操作完成的时候重新开始计时。

有没有类似 EnableTimer 和 UnableTimer 之类的函数?
lygfqy 2004-06-16
  • 打赏
  • 举报
回复
应该说没有问题
主要是新建立的线程出现了消息的阻塞所以你的时间回调始终没有机会得到执行
如果你在新建立的线程处理消息的话,你就会发现一切都和以前一样
主线程和新建立的线程没有什么特殊的地方!!
QunKangLi 2004-06-16
  • 打赏
  • 举报
回复
线程也可以执行的,但关键是线程需要提供一个消息泵,这里至少要用DisplateMessgae(),操作系统在这里处理WM_TIMER.
如果主线程没处理消息,如控制台程序,那么主程序同样不能使用定时器.
MFC的CWnd::SetTimer,CWnd::KillTimer仅仅是API的简单包装,窗口内中用时来跟上下文的风格更统一些.
lsaturn 2004-06-16
  • 打赏
  • 举报
回复
KillTimer(uTimerID);为什么这个不要api?要用成员函数:)

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧